Bug 23013: Upgrade DataTables in the staff client
[koha.git] / koha-tmpl / intranet-tmpl / lib / datatables / datatables.js
blob5c501ba158dc91d960c6f0df90b66dc7d1c30322
1 /*
2  * This combined file was created by the DataTables downloader builder:
3  *   https://datatables.net/download
4  *
5  * To rebuild or modify this file with the latest versions of the included
6  * software please visit:
7  *   https://datatables.net/download/#dt/jszip-2.5.0/pdfmake-0.1.36/dt-1.10.18/b-1.5.6/b-colvis-1.5.6/b-html5-1.5.6/b-print-1.5.6/fh-3.1.4
8  *
9  * Included libraries:
10  *   JSZip 2.5.0, pdfmake 0.1.36, DataTables 1.10.18, Buttons 1.5.6, Column visibility 1.5.6, HTML5 export 1.5.6, Print view 1.5.6, FixedHeader 3.1.4
11  */
13 /*!
15 JSZip - A Javascript class for generating and reading zip files
16 <http://stuartk.com/jszip>
18 (c) 2009-2014 Stuart Knightley <stuart [at] stuartk.com>
19 Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.
21 JSZip uses the library pako released under the MIT license :
22 https://github.com/nodeca/pako/blob/master/LICENSE
24 !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){
25 'use strict';
26 // private property
27 var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
30 // public method for encoding
31 exports.encode = function(input, utf8) {
32     var output = "";
33     var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
34     var i = 0;
36     while (i < input.length) {
38         chr1 = input.charCodeAt(i++);
39         chr2 = input.charCodeAt(i++);
40         chr3 = input.charCodeAt(i++);
42         enc1 = chr1 >> 2;
43         enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
44         enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
45         enc4 = chr3 & 63;
47         if (isNaN(chr2)) {
48             enc3 = enc4 = 64;
49         }
50         else if (isNaN(chr3)) {
51             enc4 = 64;
52         }
54         output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
56     }
58     return output;
61 // public method for decoding
62 exports.decode = function(input, utf8) {
63     var output = "";
64     var chr1, chr2, chr3;
65     var enc1, enc2, enc3, enc4;
66     var i = 0;
68     input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
70     while (i < input.length) {
72         enc1 = _keyStr.indexOf(input.charAt(i++));
73         enc2 = _keyStr.indexOf(input.charAt(i++));
74         enc3 = _keyStr.indexOf(input.charAt(i++));
75         enc4 = _keyStr.indexOf(input.charAt(i++));
77         chr1 = (enc1 << 2) | (enc2 >> 4);
78         chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
79         chr3 = ((enc3 & 3) << 6) | enc4;
81         output = output + String.fromCharCode(chr1);
83         if (enc3 != 64) {
84             output = output + String.fromCharCode(chr2);
85         }
86         if (enc4 != 64) {
87             output = output + String.fromCharCode(chr3);
88         }
90     }
92     return output;
96 },{}],2:[function(_dereq_,module,exports){
97 'use strict';
98 function CompressedObject() {
99     this.compressedSize = 0;
100     this.uncompressedSize = 0;
101     this.crc32 = 0;
102     this.compressionMethod = null;
103     this.compressedContent = null;
106 CompressedObject.prototype = {
107     /**
108      * Return the decompressed content in an unspecified format.
109      * The format will depend on the decompressor.
110      * @return {Object} the decompressed content.
111      */
112     getContent: function() {
113         return null; // see implementation
114     },
115     /**
116      * Return the compressed content in an unspecified format.
117      * The format will depend on the compressed conten source.
118      * @return {Object} the compressed content.
119      */
120     getCompressedContent: function() {
121         return null; // see implementation
122     }
124 module.exports = CompressedObject;
126 },{}],3:[function(_dereq_,module,exports){
127 'use strict';
128 exports.STORE = {
129     magic: "\x00\x00",
130     compress: function(content, compressionOptions) {
131         return content; // no compression
132     },
133     uncompress: function(content) {
134         return content; // no compression
135     },
136     compressInputType: null,
137     uncompressInputType: null
139 exports.DEFLATE = _dereq_('./flate');
141 },{"./flate":8}],4:[function(_dereq_,module,exports){
142 'use strict';
144 var utils = _dereq_('./utils');
146 var table = [
147     0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
148     0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
149     0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
150     0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
151     0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
152     0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
153     0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
154     0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
155     0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
156     0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
157     0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
158     0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
159     0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
160     0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
161     0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
162     0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
163     0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
164     0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
165     0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
166     0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
167     0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
168     0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
169     0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
170     0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
171     0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
172     0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
173     0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
174     0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
175     0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
176     0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
177     0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
178     0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
179     0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
180     0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
181     0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
182     0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
183     0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
184     0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
185     0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
186     0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
187     0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
188     0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
189     0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
190     0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
191     0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
192     0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
193     0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
194     0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
195     0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
196     0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
197     0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
198     0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
199     0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
200     0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
201     0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
202     0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
203     0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
204     0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
205     0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
206     0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
207     0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
208     0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
209     0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
210     0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
215  *  Javascript crc32
216  *  http://www.webtoolkit.info/
218  */
219 module.exports = function crc32(input, crc) {
220     if (typeof input === "undefined" || !input.length) {
221         return 0;
222     }
224     var isArray = utils.getTypeOf(input) !== "string";
226     if (typeof(crc) == "undefined") {
227         crc = 0;
228     }
229     var x = 0;
230     var y = 0;
231     var b = 0;
233     crc = crc ^ (-1);
234     for (var i = 0, iTop = input.length; i < iTop; i++) {
235         b = isArray ? input[i] : input.charCodeAt(i);
236         y = (crc ^ b) & 0xFF;
237         x = table[y];
238         crc = (crc >>> 8) ^ x;
239     }
241     return crc ^ (-1);
243 // vim: set shiftwidth=4 softtabstop=4:
245 },{"./utils":21}],5:[function(_dereq_,module,exports){
246 'use strict';
247 var utils = _dereq_('./utils');
249 function DataReader(data) {
250     this.data = null; // type : see implementation
251     this.length = 0;
252     this.index = 0;
254 DataReader.prototype = {
255     /**
256      * Check that the offset will not go too far.
257      * @param {string} offset the additional offset to check.
258      * @throws {Error} an Error if the offset is out of bounds.
259      */
260     checkOffset: function(offset) {
261         this.checkIndex(this.index + offset);
262     },
263     /**
264      * Check that the specifed index will not be too far.
265      * @param {string} newIndex the index to check.
266      * @throws {Error} an Error if the index is out of bounds.
267      */
268     checkIndex: function(newIndex) {
269         if (this.length < newIndex || newIndex < 0) {
270             throw new Error("End of data reached (data length = " + this.length + ", asked index = " + (newIndex) + "). Corrupted zip ?");
271         }
272     },
273     /**
274      * Change the index.
275      * @param {number} newIndex The new index.
276      * @throws {Error} if the new index is out of the data.
277      */
278     setIndex: function(newIndex) {
279         this.checkIndex(newIndex);
280         this.index = newIndex;
281     },
282     /**
283      * Skip the next n bytes.
284      * @param {number} n the number of bytes to skip.
285      * @throws {Error} if the new index is out of the data.
286      */
287     skip: function(n) {
288         this.setIndex(this.index + n);
289     },
290     /**
291      * Get the byte at the specified index.
292      * @param {number} i the index to use.
293      * @return {number} a byte.
294      */
295     byteAt: function(i) {
296         // see implementations
297     },
298     /**
299      * Get the next number with a given byte size.
300      * @param {number} size the number of bytes to read.
301      * @return {number} the corresponding number.
302      */
303     readInt: function(size) {
304         var result = 0,
305             i;
306         this.checkOffset(size);
307         for (i = this.index + size - 1; i >= this.index; i--) {
308             result = (result << 8) + this.byteAt(i);
309         }
310         this.index += size;
311         return result;
312     },
313     /**
314      * Get the next string with a given byte size.
315      * @param {number} size the number of bytes to read.
316      * @return {string} the corresponding string.
317      */
318     readString: function(size) {
319         return utils.transformTo("string", this.readData(size));
320     },
321     /**
322      * Get raw data without conversion, <size> bytes.
323      * @param {number} size the number of bytes to read.
324      * @return {Object} the raw data, implementation specific.
325      */
326     readData: function(size) {
327         // see implementations
328     },
329     /**
330      * Find the last occurence of a zip signature (4 bytes).
331      * @param {string} sig the signature to find.
332      * @return {number} the index of the last occurence, -1 if not found.
333      */
334     lastIndexOfSignature: function(sig) {
335         // see implementations
336     },
337     /**
338      * Get the next date.
339      * @return {Date} the date.
340      */
341     readDate: function() {
342         var dostime = this.readInt(4);
343         return new Date(
344         ((dostime >> 25) & 0x7f) + 1980, // year
345         ((dostime >> 21) & 0x0f) - 1, // month
346         (dostime >> 16) & 0x1f, // day
347         (dostime >> 11) & 0x1f, // hour
348         (dostime >> 5) & 0x3f, // minute
349         (dostime & 0x1f) << 1); // second
350     }
352 module.exports = DataReader;
354 },{"./utils":21}],6:[function(_dereq_,module,exports){
355 'use strict';
356 exports.base64 = false;
357 exports.binary = false;
358 exports.dir = false;
359 exports.createFolders = false;
360 exports.date = null;
361 exports.compression = null;
362 exports.compressionOptions = null;
363 exports.comment = null;
364 exports.unixPermissions = null;
365 exports.dosPermissions = null;
367 },{}],7:[function(_dereq_,module,exports){
368 'use strict';
369 var utils = _dereq_('./utils');
372  * @deprecated
373  * This function will be removed in a future version without replacement.
374  */
375 exports.string2binary = function(str) {
376     return utils.string2binary(str);
380  * @deprecated
381  * This function will be removed in a future version without replacement.
382  */
383 exports.string2Uint8Array = function(str) {
384     return utils.transformTo("uint8array", str);
388  * @deprecated
389  * This function will be removed in a future version without replacement.
390  */
391 exports.uint8Array2String = function(array) {
392     return utils.transformTo("string", array);
396  * @deprecated
397  * This function will be removed in a future version without replacement.
398  */
399 exports.string2Blob = function(str) {
400     var buffer = utils.transformTo("arraybuffer", str);
401     return utils.arrayBuffer2Blob(buffer);
405  * @deprecated
406  * This function will be removed in a future version without replacement.
407  */
408 exports.arrayBuffer2Blob = function(buffer) {
409     return utils.arrayBuffer2Blob(buffer);
413  * @deprecated
414  * This function will be removed in a future version without replacement.
415  */
416 exports.transformTo = function(outputType, input) {
417     return utils.transformTo(outputType, input);
421  * @deprecated
422  * This function will be removed in a future version without replacement.
423  */
424 exports.getTypeOf = function(input) {
425     return utils.getTypeOf(input);
429  * @deprecated
430  * This function will be removed in a future version without replacement.
431  */
432 exports.checkSupport = function(type) {
433     return utils.checkSupport(type);
437  * @deprecated
438  * This value will be removed in a future version without replacement.
439  */
440 exports.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS;
443  * @deprecated
444  * This value will be removed in a future version without replacement.
445  */
446 exports.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS;
450  * @deprecated
451  * This function will be removed in a future version without replacement.
452  */
453 exports.pretty = function(str) {
454     return utils.pretty(str);
458  * @deprecated
459  * This function will be removed in a future version without replacement.
460  */
461 exports.findCompression = function(compressionMethod) {
462     return utils.findCompression(compressionMethod);
466  * @deprecated
467  * This function will be removed in a future version without replacement.
468  */
469 exports.isRegExp = function (object) {
470     return utils.isRegExp(object);
474 },{"./utils":21}],8:[function(_dereq_,module,exports){
475 'use strict';
476 var USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');
478 var pako = _dereq_("pako");
479 exports.uncompressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
480 exports.compressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
482 exports.magic = "\x08\x00";
483 exports.compress = function(input, compressionOptions) {
484     return pako.deflateRaw(input, {
485         level : compressionOptions.level || -1 // default compression
486     });
488 exports.uncompress =  function(input) {
489     return pako.inflateRaw(input);
492 },{"pako":24}],9:[function(_dereq_,module,exports){
493 'use strict';
495 var base64 = _dereq_('./base64');
498 Usage:
499    zip = new JSZip();
500    zip.file("hello.txt", "Hello, World!").file("tempfile", "nothing");
501    zip.folder("images").file("smile.gif", base64Data, {base64: true});
502    zip.file("Xmas.txt", "Ho ho ho !", {date : new Date("December 25, 2007 00:00:01")});
503    zip.remove("tempfile");
505    base64zip = zip.generate();
510  * Representation a of zip file in js
511  * @constructor
512  * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional).
513  * @param {Object=} options the options for creating this objects (optional).
514  */
515 function JSZip(data, options) {
516     // if this constructor is used without `new`, it adds `new` before itself:
517     if(!(this instanceof JSZip)) return new JSZip(data, options);
519     // object containing the files :
520     // {
521     //   "folder/" : {...},
522     //   "folder/data.txt" : {...}
523     // }
524     this.files = {};
526     this.comment = null;
528     // Where we are in the hierarchy
529     this.root = "";
530     if (data) {
531         this.load(data, options);
532     }
533     this.clone = function() {
534         var newObj = new JSZip();
535         for (var i in this) {
536             if (typeof this[i] !== "function") {
537                 newObj[i] = this[i];
538             }
539         }
540         return newObj;
541     };
543 JSZip.prototype = _dereq_('./object');
544 JSZip.prototype.load = _dereq_('./load');
545 JSZip.support = _dereq_('./support');
546 JSZip.defaults = _dereq_('./defaults');
549  * @deprecated
550  * This namespace will be removed in a future version without replacement.
551  */
552 JSZip.utils = _dereq_('./deprecatedPublicUtils');
554 JSZip.base64 = {
555     /**
556      * @deprecated
557      * This method will be removed in a future version without replacement.
558      */
559     encode : function(input) {
560         return base64.encode(input);
561     },
562     /**
563      * @deprecated
564      * This method will be removed in a future version without replacement.
565      */
566     decode : function(input) {
567         return base64.decode(input);
568     }
570 JSZip.compressions = _dereq_('./compressions');
571 module.exports = JSZip;
573 },{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(_dereq_,module,exports){
574 'use strict';
575 var base64 = _dereq_('./base64');
576 var ZipEntries = _dereq_('./zipEntries');
577 module.exports = function(data, options) {
578     var files, zipEntries, i, input;
579     options = options || {};
580     if (options.base64) {
581         data = base64.decode(data);
582     }
584     zipEntries = new ZipEntries(data, options);
585     files = zipEntries.files;
586     for (i = 0; i < files.length; i++) {
587         input = files[i];
588         this.file(input.fileName, input.decompressed, {
589             binary: true,
590             optimizedBinaryString: true,
591             date: input.date,
592             dir: input.dir,
593             comment : input.fileComment.length ? input.fileComment : null,
594             unixPermissions : input.unixPermissions,
595             dosPermissions : input.dosPermissions,
596             createFolders: options.createFolders
597         });
598     }
599     if (zipEntries.zipComment.length) {
600         this.comment = zipEntries.zipComment;
601     }
603     return this;
606 },{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){
607 (function (Buffer){
608 'use strict';
609 module.exports = function(data, encoding){
610     return new Buffer(data, encoding);
612 module.exports.test = function(b){
613     return Buffer.isBuffer(b);
616 }).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined))
617 },{}],12:[function(_dereq_,module,exports){
618 'use strict';
619 var Uint8ArrayReader = _dereq_('./uint8ArrayReader');
621 function NodeBufferReader(data) {
622     this.data = data;
623     this.length = this.data.length;
624     this.index = 0;
626 NodeBufferReader.prototype = new Uint8ArrayReader();
629  * @see DataReader.readData
630  */
631 NodeBufferReader.prototype.readData = function(size) {
632     this.checkOffset(size);
633     var result = this.data.slice(this.index, this.index + size);
634     this.index += size;
635     return result;
637 module.exports = NodeBufferReader;
639 },{"./uint8ArrayReader":18}],13:[function(_dereq_,module,exports){
640 'use strict';
641 var support = _dereq_('./support');
642 var utils = _dereq_('./utils');
643 var crc32 = _dereq_('./crc32');
644 var signature = _dereq_('./signature');
645 var defaults = _dereq_('./defaults');
646 var base64 = _dereq_('./base64');
647 var compressions = _dereq_('./compressions');
648 var CompressedObject = _dereq_('./compressedObject');
649 var nodeBuffer = _dereq_('./nodeBuffer');
650 var utf8 = _dereq_('./utf8');
651 var StringWriter = _dereq_('./stringWriter');
652 var Uint8ArrayWriter = _dereq_('./uint8ArrayWriter');
655  * Returns the raw data of a ZipObject, decompress the content if necessary.
656  * @param {ZipObject} file the file to use.
657  * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.
658  */
659 var getRawData = function(file) {
660     if (file._data instanceof CompressedObject) {
661         file._data = file._data.getContent();
662         file.options.binary = true;
663         file.options.base64 = false;
665         if (utils.getTypeOf(file._data) === "uint8array") {
666             var copy = file._data;
667             // when reading an arraybuffer, the CompressedObject mechanism will keep it and subarray() a Uint8Array.
668             // if we request a file in the same format, we might get the same Uint8Array or its ArrayBuffer (the original zip file).
669             file._data = new Uint8Array(copy.length);
670             // with an empty Uint8Array, Opera fails with a "Offset larger than array size"
671             if (copy.length !== 0) {
672                 file._data.set(copy, 0);
673             }
674         }
675     }
676     return file._data;
680  * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it.
681  * @param {ZipObject} file the file to use.
682  * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.
683  */
684 var getBinaryData = function(file) {
685     var result = getRawData(file),
686         type = utils.getTypeOf(result);
687     if (type === "string") {
688         if (!file.options.binary) {
689             // unicode text !
690             // unicode string => binary string is a painful process, check if we can avoid it.
691             if (support.nodebuffer) {
692                 return nodeBuffer(result, "utf-8");
693             }
694         }
695         return file.asBinary();
696     }
697     return result;
701  * Transform this._data into a string.
702  * @param {function} filter a function String -> String, applied if not null on the result.
703  * @return {String} the string representing this._data.
704  */
705 var dataToString = function(asUTF8) {
706     var result = getRawData(this);
707     if (result === null || typeof result === "undefined") {
708         return "";
709     }
710     // if the data is a base64 string, we decode it before checking the encoding !
711     if (this.options.base64) {
712         result = base64.decode(result);
713     }
714     if (asUTF8 && this.options.binary) {
715         // JSZip.prototype.utf8decode supports arrays as input
716         // skip to array => string step, utf8decode will do it.
717         result = out.utf8decode(result);
718     }
719     else {
720         // no utf8 transformation, do the array => string step.
721         result = utils.transformTo("string", result);
722     }
724     if (!asUTF8 && !this.options.binary) {
725         result = utils.transformTo("string", out.utf8encode(result));
726     }
727     return result;
730  * A simple object representing a file in the zip file.
731  * @constructor
732  * @param {string} name the name of the file
733  * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data
734  * @param {Object} options the options of the file
735  */
736 var ZipObject = function(name, data, options) {
737     this.name = name;
738     this.dir = options.dir;
739     this.date = options.date;
740     this.comment = options.comment;
741     this.unixPermissions = options.unixPermissions;
742     this.dosPermissions = options.dosPermissions;
744     this._data = data;
745     this.options = options;
747     /*
748      * This object contains initial values for dir and date.
749      * With them, we can check if the user changed the deprecated metadata in
750      * `ZipObject#options` or not.
751      */
752     this._initialMetadata = {
753       dir : options.dir,
754       date : options.date
755     };
758 ZipObject.prototype = {
759     /**
760      * Return the content as UTF8 string.
761      * @return {string} the UTF8 string.
762      */
763     asText: function() {
764         return dataToString.call(this, true);
765     },
766     /**
767      * Returns the binary content.
768      * @return {string} the content as binary.
769      */
770     asBinary: function() {
771         return dataToString.call(this, false);
772     },
773     /**
774      * Returns the content as a nodejs Buffer.
775      * @return {Buffer} the content as a Buffer.
776      */
777     asNodeBuffer: function() {
778         var result = getBinaryData(this);
779         return utils.transformTo("nodebuffer", result);
780     },
781     /**
782      * Returns the content as an Uint8Array.
783      * @return {Uint8Array} the content as an Uint8Array.
784      */
785     asUint8Array: function() {
786         var result = getBinaryData(this);
787         return utils.transformTo("uint8array", result);
788     },
789     /**
790      * Returns the content as an ArrayBuffer.
791      * @return {ArrayBuffer} the content as an ArrayBufer.
792      */
793     asArrayBuffer: function() {
794         return this.asUint8Array().buffer;
795     }
799  * Transform an integer into a string in hexadecimal.
800  * @private
801  * @param {number} dec the number to convert.
802  * @param {number} bytes the number of bytes to generate.
803  * @returns {string} the result.
804  */
805 var decToHex = function(dec, bytes) {
806     var hex = "",
807         i;
808     for (i = 0; i < bytes; i++) {
809         hex += String.fromCharCode(dec & 0xff);
810         dec = dec >>> 8;
811     }
812     return hex;
816  * Merge the objects passed as parameters into a new one.
817  * @private
818  * @param {...Object} var_args All objects to merge.
819  * @return {Object} a new object with the data of the others.
820  */
821 var extend = function() {
822     var result = {}, i, attr;
823     for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers
824         for (attr in arguments[i]) {
825             if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") {
826                 result[attr] = arguments[i][attr];
827             }
828         }
829     }
830     return result;
834  * Transforms the (incomplete) options from the user into the complete
835  * set of options to create a file.
836  * @private
837  * @param {Object} o the options from the user.
838  * @return {Object} the complete set of options.
839  */
840 var prepareFileAttrs = function(o) {
841     o = o || {};
842     if (o.base64 === true && (o.binary === null || o.binary === undefined)) {
843         o.binary = true;
844     }
845     o = extend(o, defaults);
846     o.date = o.date || new Date();
847     if (o.compression !== null) o.compression = o.compression.toUpperCase();
849     return o;
853  * Add a file in the current folder.
854  * @private
855  * @param {string} name the name of the file
856  * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file
857  * @param {Object} o the options of the file
858  * @return {Object} the new file.
859  */
860 var fileAdd = function(name, data, o) {
861     // be sure sub folders exist
862     var dataType = utils.getTypeOf(data),
863         parent;
865     o = prepareFileAttrs(o);
867     if (typeof o.unixPermissions === "string") {
868         o.unixPermissions = parseInt(o.unixPermissions, 8);
869     }
871     // UNX_IFDIR  0040000 see zipinfo.c
872     if (o.unixPermissions && (o.unixPermissions & 0x4000)) {
873         o.dir = true;
874     }
875     // Bit 4    Directory
876     if (o.dosPermissions && (o.dosPermissions & 0x0010)) {
877         o.dir = true;
878     }
880     if (o.dir) {
881         name = forceTrailingSlash(name);
882     }
884     if (o.createFolders && (parent = parentFolder(name))) {
885         folderAdd.call(this, parent, true);
886     }
888     if (o.dir || data === null || typeof data === "undefined") {
889         o.base64 = false;
890         o.binary = false;
891         data = null;
892         dataType = null;
893     }
894     else if (dataType === "string") {
895         if (o.binary && !o.base64) {
896             // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask
897             if (o.optimizedBinaryString !== true) {
898                 // this is a string, not in a base64 format.
899                 // Be sure that this is a correct "binary string"
900                 data = utils.string2binary(data);
901             }
902         }
903     }
904     else { // arraybuffer, uint8array, ...
905         o.base64 = false;
906         o.binary = true;
908         if (!dataType && !(data instanceof CompressedObject)) {
909             throw new Error("The data of '" + name + "' is in an unsupported format !");
910         }
912         // special case : it's way easier to work with Uint8Array than with ArrayBuffer
913         if (dataType === "arraybuffer") {
914             data = utils.transformTo("uint8array", data);
915         }
916     }
918     var object = new ZipObject(name, data, o);
919     this.files[name] = object;
920     return object;
924  * Find the parent folder of the path.
925  * @private
926  * @param {string} path the path to use
927  * @return {string} the parent folder, or ""
928  */
929 var parentFolder = function (path) {
930     if (path.slice(-1) == '/') {
931         path = path.substring(0, path.length - 1);
932     }
933     var lastSlash = path.lastIndexOf('/');
934     return (lastSlash > 0) ? path.substring(0, lastSlash) : "";
939  * Returns the path with a slash at the end.
940  * @private
941  * @param {String} path the path to check.
942  * @return {String} the path with a trailing slash.
943  */
944 var forceTrailingSlash = function(path) {
945     // Check the name ends with a /
946     if (path.slice(-1) != "/") {
947         path += "/"; // IE doesn't like substr(-1)
948     }
949     return path;
952  * Add a (sub) folder in the current folder.
953  * @private
954  * @param {string} name the folder's name
955  * @param {boolean=} [createFolders] If true, automatically create sub
956  *  folders. Defaults to false.
957  * @return {Object} the new folder.
958  */
959 var folderAdd = function(name, createFolders) {
960     createFolders = (typeof createFolders !== 'undefined') ? createFolders : false;
962     name = forceTrailingSlash(name);
964     // Does this folder already exist?
965     if (!this.files[name]) {
966         fileAdd.call(this, name, null, {
967             dir: true,
968             createFolders: createFolders
969         });
970     }
971     return this.files[name];
975  * Generate a JSZip.CompressedObject for a given zipOject.
976  * @param {ZipObject} file the object to read.
977  * @param {JSZip.compression} compression the compression to use.
978  * @param {Object} compressionOptions the options to use when compressing.
979  * @return {JSZip.CompressedObject} the compressed result.
980  */
981 var generateCompressedObjectFrom = function(file, compression, compressionOptions) {
982     var result = new CompressedObject(),
983         content;
985     // the data has not been decompressed, we might reuse things !
986     if (file._data instanceof CompressedObject) {
987         result.uncompressedSize = file._data.uncompressedSize;
988         result.crc32 = file._data.crc32;
990         if (result.uncompressedSize === 0 || file.dir) {
991             compression = compressions['STORE'];
992             result.compressedContent = "";
993             result.crc32 = 0;
994         }
995         else if (file._data.compressionMethod === compression.magic) {
996             result.compressedContent = file._data.getCompressedContent();
997         }
998         else {
999             content = file._data.getContent();
1000             // need to decompress / recompress
1001             result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);
1002         }
1003     }
1004     else {
1005         // have uncompressed data
1006         content = getBinaryData(file);
1007         if (!content || content.length === 0 || file.dir) {
1008             compression = compressions['STORE'];
1009             content = "";
1010         }
1011         result.uncompressedSize = content.length;
1012         result.crc32 = crc32(content);
1013         result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);
1014     }
1016     result.compressedSize = result.compressedContent.length;
1017     result.compressionMethod = compression.magic;
1019     return result;
1026  * Generate the UNIX part of the external file attributes.
1027  * @param {Object} unixPermissions the unix permissions or null.
1028  * @param {Boolean} isDir true if the entry is a directory, false otherwise.
1029  * @return {Number} a 32 bit integer.
1031  * adapted from http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute :
1033  * TTTTsstrwxrwxrwx0000000000ADVSHR
1034  * ^^^^____________________________ file type, see zipinfo.c (UNX_*)
1035  *     ^^^_________________________ setuid, setgid, sticky
1036  *        ^^^^^^^^^________________ permissions
1037  *                 ^^^^^^^^^^______ not used ?
1038  *                           ^^^^^^ DOS attribute bits : Archive, Directory, Volume label, System file, Hidden, Read only
1039  */
1040 var generateUnixExternalFileAttr = function (unixPermissions, isDir) {
1042     var result = unixPermissions;
1043     if (!unixPermissions) {
1044         // I can't use octal values in strict mode, hence the hexa.
1045         //  040775 => 0x41fd
1046         // 0100664 => 0x81b4
1047         result = isDir ? 0x41fd : 0x81b4;
1048     }
1050     return (result & 0xFFFF) << 16;
1054  * Generate the DOS part of the external file attributes.
1055  * @param {Object} dosPermissions the dos permissions or null.
1056  * @param {Boolean} isDir true if the entry is a directory, false otherwise.
1057  * @return {Number} a 32 bit integer.
1059  * Bit 0     Read-Only
1060  * Bit 1     Hidden
1061  * Bit 2     System
1062  * Bit 3     Volume Label
1063  * Bit 4     Directory
1064  * Bit 5     Archive
1065  */
1066 var generateDosExternalFileAttr = function (dosPermissions, isDir) {
1068     // the dir flag is already set for compatibility
1070     return (dosPermissions || 0)  & 0x3F;
1074  * Generate the various parts used in the construction of the final zip file.
1075  * @param {string} name the file name.
1076  * @param {ZipObject} file the file content.
1077  * @param {JSZip.CompressedObject} compressedObject the compressed object.
1078  * @param {number} offset the current offset from the start of the zip file.
1079  * @param {String} platform let's pretend we are this platform (change platform dependents fields)
1080  * @return {object} the zip parts.
1081  */
1082 var generateZipParts = function(name, file, compressedObject, offset, platform) {
1083     var data = compressedObject.compressedContent,
1084         utfEncodedFileName = utils.transformTo("string", utf8.utf8encode(file.name)),
1085         comment = file.comment || "",
1086         utfEncodedComment = utils.transformTo("string", utf8.utf8encode(comment)),
1087         useUTF8ForFileName = utfEncodedFileName.length !== file.name.length,
1088         useUTF8ForComment = utfEncodedComment.length !== comment.length,
1089         o = file.options,
1090         dosTime,
1091         dosDate,
1092         extraFields = "",
1093         unicodePathExtraField = "",
1094         unicodeCommentExtraField = "",
1095         dir, date;
1098     // handle the deprecated options.dir
1099     if (file._initialMetadata.dir !== file.dir) {
1100         dir = file.dir;
1101     } else {
1102         dir = o.dir;
1103     }
1105     // handle the deprecated options.date
1106     if(file._initialMetadata.date !== file.date) {
1107         date = file.date;
1108     } else {
1109         date = o.date;
1110     }
1112     var extFileAttr = 0;
1113     var versionMadeBy = 0;
1114     if (dir) {
1115         // dos or unix, we set the dos dir flag
1116         extFileAttr |= 0x00010;
1117     }
1118     if(platform === "UNIX") {
1119         versionMadeBy = 0x031E; // UNIX, version 3.0
1120         extFileAttr |= generateUnixExternalFileAttr(file.unixPermissions, dir);
1121     } else { // DOS or other, fallback to DOS
1122         versionMadeBy = 0x0014; // DOS, version 2.0
1123         extFileAttr |= generateDosExternalFileAttr(file.dosPermissions, dir);
1124     }
1126     // date
1127     // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html
1128     // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html
1129     // @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html
1131     dosTime = date.getHours();
1132     dosTime = dosTime << 6;
1133     dosTime = dosTime | date.getMinutes();
1134     dosTime = dosTime << 5;
1135     dosTime = dosTime | date.getSeconds() / 2;
1137     dosDate = date.getFullYear() - 1980;
1138     dosDate = dosDate << 4;
1139     dosDate = dosDate | (date.getMonth() + 1);
1140     dosDate = dosDate << 5;
1141     dosDate = dosDate | date.getDate();
1143     if (useUTF8ForFileName) {
1144         // set the unicode path extra field. unzip needs at least one extra
1145         // field to correctly handle unicode path, so using the path is as good
1146         // as any other information. This could improve the situation with
1147         // other archive managers too.
1148         // This field is usually used without the utf8 flag, with a non
1149         // unicode path in the header (winrar, winzip). This helps (a bit)
1150         // with the messy Windows' default compressed folders feature but
1151         // breaks on p7zip which doesn't seek the unicode path extra field.
1152         // So for now, UTF-8 everywhere !
1153         unicodePathExtraField =
1154             // Version
1155             decToHex(1, 1) +
1156             // NameCRC32
1157             decToHex(crc32(utfEncodedFileName), 4) +
1158             // UnicodeName
1159             utfEncodedFileName;
1161         extraFields +=
1162             // Info-ZIP Unicode Path Extra Field
1163             "\x75\x70" +
1164             // size
1165             decToHex(unicodePathExtraField.length, 2) +
1166             // content
1167             unicodePathExtraField;
1168     }
1170     if(useUTF8ForComment) {
1172         unicodeCommentExtraField =
1173             // Version
1174             decToHex(1, 1) +
1175             // CommentCRC32
1176             decToHex(this.crc32(utfEncodedComment), 4) +
1177             // UnicodeName
1178             utfEncodedComment;
1180         extraFields +=
1181             // Info-ZIP Unicode Path Extra Field
1182             "\x75\x63" +
1183             // size
1184             decToHex(unicodeCommentExtraField.length, 2) +
1185             // content
1186             unicodeCommentExtraField;
1187     }
1189     var header = "";
1191     // version needed to extract
1192     header += "\x0A\x00";
1193     // general purpose bit flag
1194     // set bit 11 if utf8
1195     header += (useUTF8ForFileName || useUTF8ForComment) ? "\x00\x08" : "\x00\x00";
1196     // compression method
1197     header += compressedObject.compressionMethod;
1198     // last mod file time
1199     header += decToHex(dosTime, 2);
1200     // last mod file date
1201     header += decToHex(dosDate, 2);
1202     // crc-32
1203     header += decToHex(compressedObject.crc32, 4);
1204     // compressed size
1205     header += decToHex(compressedObject.compressedSize, 4);
1206     // uncompressed size
1207     header += decToHex(compressedObject.uncompressedSize, 4);
1208     // file name length
1209     header += decToHex(utfEncodedFileName.length, 2);
1210     // extra field length
1211     header += decToHex(extraFields.length, 2);
1214     var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields;
1216     var dirRecord = signature.CENTRAL_FILE_HEADER +
1217     // version made by (00: DOS)
1218     decToHex(versionMadeBy, 2) +
1219     // file header (common to file and central directory)
1220     header +
1221     // file comment length
1222     decToHex(utfEncodedComment.length, 2) +
1223     // disk number start
1224     "\x00\x00" +
1225     // internal file attributes TODO
1226     "\x00\x00" +
1227     // external file attributes
1228     decToHex(extFileAttr, 4) +
1229     // relative offset of local header
1230     decToHex(offset, 4) +
1231     // file name
1232     utfEncodedFileName +
1233     // extra field
1234     extraFields +
1235     // file comment
1236     utfEncodedComment;
1238     return {
1239         fileRecord: fileRecord,
1240         dirRecord: dirRecord,
1241         compressedObject: compressedObject
1242     };
1246 // return the actual prototype of JSZip
1247 var out = {
1248     /**
1249      * Read an existing zip and merge the data in the current JSZip object.
1250      * The implementation is in jszip-load.js, don't forget to include it.
1251      * @param {String|ArrayBuffer|Uint8Array|Buffer} stream  The stream to load
1252      * @param {Object} options Options for loading the stream.
1253      *  options.base64 : is the stream in base64 ? default : false
1254      * @return {JSZip} the current JSZip object
1255      */
1256     load: function(stream, options) {
1257         throw new Error("Load method is not defined. Is the file jszip-load.js included ?");
1258     },
1260     /**
1261      * Filter nested files/folders with the specified function.
1262      * @param {Function} search the predicate to use :
1263      * function (relativePath, file) {...}
1264      * It takes 2 arguments : the relative path and the file.
1265      * @return {Array} An array of matching elements.
1266      */
1267     filter: function(search) {
1268         var result = [],
1269             filename, relativePath, file, fileClone;
1270         for (filename in this.files) {
1271             if (!this.files.hasOwnProperty(filename)) {
1272                 continue;
1273             }
1274             file = this.files[filename];
1275             // return a new object, don't let the user mess with our internal objects :)
1276             fileClone = new ZipObject(file.name, file._data, extend(file.options));
1277             relativePath = filename.slice(this.root.length, filename.length);
1278             if (filename.slice(0, this.root.length) === this.root && // the file is in the current root
1279             search(relativePath, fileClone)) { // and the file matches the function
1280                 result.push(fileClone);
1281             }
1282         }
1283         return result;
1284     },
1286     /**
1287      * Add a file to the zip file, or search a file.
1288      * @param   {string|RegExp} name The name of the file to add (if data is defined),
1289      * the name of the file to find (if no data) or a regex to match files.
1290      * @param   {String|ArrayBuffer|Uint8Array|Buffer} data  The file data, either raw or base64 encoded
1291      * @param   {Object} o     File options
1292      * @return  {JSZip|Object|Array} this JSZip object (when adding a file),
1293      * a file (when searching by string) or an array of files (when searching by regex).
1294      */
1295     file: function(name, data, o) {
1296         if (arguments.length === 1) {
1297             if (utils.isRegExp(name)) {
1298                 var regexp = name;
1299                 return this.filter(function(relativePath, file) {
1300                     return !file.dir && regexp.test(relativePath);
1301                 });
1302             }
1303             else { // text
1304                 return this.filter(function(relativePath, file) {
1305                     return !file.dir && relativePath === name;
1306                 })[0] || null;
1307             }
1308         }
1309         else { // more than one argument : we have data !
1310             name = this.root + name;
1311             fileAdd.call(this, name, data, o);
1312         }
1313         return this;
1314     },
1316     /**
1317      * Add a directory to the zip file, or search.
1318      * @param   {String|RegExp} arg The name of the directory to add, or a regex to search folders.
1319      * @return  {JSZip} an object with the new directory as the root, or an array containing matching folders.
1320      */
1321     folder: function(arg) {
1322         if (!arg) {
1323             return this;
1324         }
1326         if (utils.isRegExp(arg)) {
1327             return this.filter(function(relativePath, file) {
1328                 return file.dir && arg.test(relativePath);
1329             });
1330         }
1332         // else, name is a new folder
1333         var name = this.root + arg;
1334         var newFolder = folderAdd.call(this, name);
1336         // Allow chaining by returning a new object with this folder as the root
1337         var ret = this.clone();
1338         ret.root = newFolder.name;
1339         return ret;
1340     },
1342     /**
1343      * Delete a file, or a directory and all sub-files, from the zip
1344      * @param {string} name the name of the file to delete
1345      * @return {JSZip} this JSZip object
1346      */
1347     remove: function(name) {
1348         name = this.root + name;
1349         var file = this.files[name];
1350         if (!file) {
1351             // Look for any folders
1352             if (name.slice(-1) != "/") {
1353                 name += "/";
1354             }
1355             file = this.files[name];
1356         }
1358         if (file && !file.dir) {
1359             // file
1360             delete this.files[name];
1361         } else {
1362             // maybe a folder, delete recursively
1363             var kids = this.filter(function(relativePath, file) {
1364                 return file.name.slice(0, name.length) === name;
1365             });
1366             for (var i = 0; i < kids.length; i++) {
1367                 delete this.files[kids[i].name];
1368             }
1369         }
1371         return this;
1372     },
1374     /**
1375      * Generate the complete zip file
1376      * @param {Object} options the options to generate the zip file :
1377      * - base64, (deprecated, use type instead) true to generate base64.
1378      * - compression, "STORE" by default.
1379      * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob.
1380      * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file
1381      */
1382     generate: function(options) {
1383         options = extend(options || {}, {
1384             base64: true,
1385             compression: "STORE",
1386             compressionOptions : null,
1387             type: "base64",
1388             platform: "DOS",
1389             comment: null,
1390             mimeType: 'application/zip'
1391         });
1393         utils.checkSupport(options.type);
1395         // accept nodejs `process.platform`
1396         if(
1397           options.platform === 'darwin' ||
1398           options.platform === 'freebsd' ||
1399           options.platform === 'linux' ||
1400           options.platform === 'sunos'
1401         ) {
1402           options.platform = "UNIX";
1403         }
1404         if (options.platform === 'win32') {
1405           options.platform = "DOS";
1406         }
1408         var zipData = [],
1409             localDirLength = 0,
1410             centralDirLength = 0,
1411             writer, i,
1412             utfEncodedComment = utils.transformTo("string", this.utf8encode(options.comment || this.comment || ""));
1414         // first, generate all the zip parts.
1415         for (var name in this.files) {
1416             if (!this.files.hasOwnProperty(name)) {
1417                 continue;
1418             }
1419             var file = this.files[name];
1421             var compressionName = file.options.compression || options.compression.toUpperCase();
1422             var compression = compressions[compressionName];
1423             if (!compression) {
1424                 throw new Error(compressionName + " is not a valid compression method !");
1425             }
1426             var compressionOptions = file.options.compressionOptions || options.compressionOptions || {};
1428             var compressedObject = generateCompressedObjectFrom.call(this, file, compression, compressionOptions);
1430             var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength, options.platform);
1431             localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize;
1432             centralDirLength += zipPart.dirRecord.length;
1433             zipData.push(zipPart);
1434         }
1436         var dirEnd = "";
1438         // end of central dir signature
1439         dirEnd = signature.CENTRAL_DIRECTORY_END +
1440         // number of this disk
1441         "\x00\x00" +
1442         // number of the disk with the start of the central directory
1443         "\x00\x00" +
1444         // total number of entries in the central directory on this disk
1445         decToHex(zipData.length, 2) +
1446         // total number of entries in the central directory
1447         decToHex(zipData.length, 2) +
1448         // size of the central directory   4 bytes
1449         decToHex(centralDirLength, 4) +
1450         // offset of start of central directory with respect to the starting disk number
1451         decToHex(localDirLength, 4) +
1452         // .ZIP file comment length
1453         decToHex(utfEncodedComment.length, 2) +
1454         // .ZIP file comment
1455         utfEncodedComment;
1458         // we have all the parts (and the total length)
1459         // time to create a writer !
1460         var typeName = options.type.toLowerCase();
1461         if(typeName==="uint8array"||typeName==="arraybuffer"||typeName==="blob"||typeName==="nodebuffer") {
1462             writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length);
1463         }else{
1464             writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length);
1465         }
1467         for (i = 0; i < zipData.length; i++) {
1468             writer.append(zipData[i].fileRecord);
1469             writer.append(zipData[i].compressedObject.compressedContent);
1470         }
1471         for (i = 0; i < zipData.length; i++) {
1472             writer.append(zipData[i].dirRecord);
1473         }
1475         writer.append(dirEnd);
1477         var zip = writer.finalize();
1481         switch(options.type.toLowerCase()) {
1482             // case "zip is an Uint8Array"
1483             case "uint8array" :
1484             case "arraybuffer" :
1485             case "nodebuffer" :
1486                return utils.transformTo(options.type.toLowerCase(), zip);
1487             case "blob" :
1488                return utils.arrayBuffer2Blob(utils.transformTo("arraybuffer", zip), options.mimeType);
1489             // case "zip is a string"
1490             case "base64" :
1491                return (options.base64) ? base64.encode(zip) : zip;
1492             default : // case "string" :
1493                return zip;
1494          }
1496     },
1498     /**
1499      * @deprecated
1500      * This method will be removed in a future version without replacement.
1501      */
1502     crc32: function (input, crc) {
1503         return crc32(input, crc);
1504     },
1506     /**
1507      * @deprecated
1508      * This method will be removed in a future version without replacement.
1509      */
1510     utf8encode: function (string) {
1511         return utils.transformTo("string", utf8.utf8encode(string));
1512     },
1514     /**
1515      * @deprecated
1516      * This method will be removed in a future version without replacement.
1517      */
1518     utf8decode: function (input) {
1519         return utf8.utf8decode(input);
1520     }
1522 module.exports = out;
1524 },{"./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){
1525 'use strict';
1526 exports.LOCAL_FILE_HEADER = "PK\x03\x04";
1527 exports.CENTRAL_FILE_HEADER = "PK\x01\x02";
1528 exports.CENTRAL_DIRECTORY_END = "PK\x05\x06";
1529 exports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x06\x07";
1530 exports.ZIP64_CENTRAL_DIRECTORY_END = "PK\x06\x06";
1531 exports.DATA_DESCRIPTOR = "PK\x07\x08";
1533 },{}],15:[function(_dereq_,module,exports){
1534 'use strict';
1535 var DataReader = _dereq_('./dataReader');
1536 var utils = _dereq_('./utils');
1538 function StringReader(data, optimizedBinaryString) {
1539     this.data = data;
1540     if (!optimizedBinaryString) {
1541         this.data = utils.string2binary(this.data);
1542     }
1543     this.length = this.data.length;
1544     this.index = 0;
1546 StringReader.prototype = new DataReader();
1548  * @see DataReader.byteAt
1549  */
1550 StringReader.prototype.byteAt = function(i) {
1551     return this.data.charCodeAt(i);
1554  * @see DataReader.lastIndexOfSignature
1555  */
1556 StringReader.prototype.lastIndexOfSignature = function(sig) {
1557     return this.data.lastIndexOf(sig);
1560  * @see DataReader.readData
1561  */
1562 StringReader.prototype.readData = function(size) {
1563     this.checkOffset(size);
1564     // this will work because the constructor applied the "& 0xff" mask.
1565     var result = this.data.slice(this.index, this.index + size);
1566     this.index += size;
1567     return result;
1569 module.exports = StringReader;
1571 },{"./dataReader":5,"./utils":21}],16:[function(_dereq_,module,exports){
1572 'use strict';
1574 var utils = _dereq_('./utils');
1577  * An object to write any content to a string.
1578  * @constructor
1579  */
1580 var StringWriter = function() {
1581     this.data = [];
1583 StringWriter.prototype = {
1584     /**
1585      * Append any content to the current string.
1586      * @param {Object} input the content to add.
1587      */
1588     append: function(input) {
1589         input = utils.transformTo("string", input);
1590         this.data.push(input);
1591     },
1592     /**
1593      * Finalize the construction an return the result.
1594      * @return {string} the generated string.
1595      */
1596     finalize: function() {
1597         return this.data.join("");
1598     }
1601 module.exports = StringWriter;
1603 },{"./utils":21}],17:[function(_dereq_,module,exports){
1604 (function (Buffer){
1605 'use strict';
1606 exports.base64 = true;
1607 exports.array = true;
1608 exports.string = true;
1609 exports.arraybuffer = typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined";
1610 // contains true if JSZip can read/generate nodejs Buffer, false otherwise.
1611 // Browserify will provide a Buffer implementation for browsers, which is
1612 // an augmented Uint8Array (i.e., can be used as either Buffer or U8).
1613 exports.nodebuffer = typeof Buffer !== "undefined";
1614 // contains true if JSZip can read/generate Uint8Array, false otherwise.
1615 exports.uint8array = typeof Uint8Array !== "undefined";
1617 if (typeof ArrayBuffer === "undefined") {
1618     exports.blob = false;
1620 else {
1621     var buffer = new ArrayBuffer(0);
1622     try {
1623         exports.blob = new Blob([buffer], {
1624             type: "application/zip"
1625         }).size === 0;
1626     }
1627     catch (e) {
1628         try {
1629             var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
1630             var builder = new Builder();
1631             builder.append(buffer);
1632             exports.blob = builder.getBlob('application/zip').size === 0;
1633         }
1634         catch (e) {
1635             exports.blob = false;
1636         }
1637     }
1640 }).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined))
1641 },{}],18:[function(_dereq_,module,exports){
1642 'use strict';
1643 var DataReader = _dereq_('./dataReader');
1645 function Uint8ArrayReader(data) {
1646     if (data) {
1647         this.data = data;
1648         this.length = this.data.length;
1649         this.index = 0;
1650     }
1652 Uint8ArrayReader.prototype = new DataReader();
1654  * @see DataReader.byteAt
1655  */
1656 Uint8ArrayReader.prototype.byteAt = function(i) {
1657     return this.data[i];
1660  * @see DataReader.lastIndexOfSignature
1661  */
1662 Uint8ArrayReader.prototype.lastIndexOfSignature = function(sig) {
1663     var sig0 = sig.charCodeAt(0),
1664         sig1 = sig.charCodeAt(1),
1665         sig2 = sig.charCodeAt(2),
1666         sig3 = sig.charCodeAt(3);
1667     for (var i = this.length - 4; i >= 0; --i) {
1668         if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {
1669             return i;
1670         }
1671     }
1673     return -1;
1676  * @see DataReader.readData
1677  */
1678 Uint8ArrayReader.prototype.readData = function(size) {
1679     this.checkOffset(size);
1680     if(size === 0) {
1681         // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of [].
1682         return new Uint8Array(0);
1683     }
1684     var result = this.data.subarray(this.index, this.index + size);
1685     this.index += size;
1686     return result;
1688 module.exports = Uint8ArrayReader;
1690 },{"./dataReader":5}],19:[function(_dereq_,module,exports){
1691 'use strict';
1693 var utils = _dereq_('./utils');
1696  * An object to write any content to an Uint8Array.
1697  * @constructor
1698  * @param {number} length The length of the array.
1699  */
1700 var Uint8ArrayWriter = function(length) {
1701     this.data = new Uint8Array(length);
1702     this.index = 0;
1704 Uint8ArrayWriter.prototype = {
1705     /**
1706      * Append any content to the current array.
1707      * @param {Object} input the content to add.
1708      */
1709     append: function(input) {
1710         if (input.length !== 0) {
1711             // with an empty Uint8Array, Opera fails with a "Offset larger than array size"
1712             input = utils.transformTo("uint8array", input);
1713             this.data.set(input, this.index);
1714             this.index += input.length;
1715         }
1716     },
1717     /**
1718      * Finalize the construction an return the result.
1719      * @return {Uint8Array} the generated array.
1720      */
1721     finalize: function() {
1722         return this.data;
1723     }
1726 module.exports = Uint8ArrayWriter;
1728 },{"./utils":21}],20:[function(_dereq_,module,exports){
1729 'use strict';
1731 var utils = _dereq_('./utils');
1732 var support = _dereq_('./support');
1733 var nodeBuffer = _dereq_('./nodeBuffer');
1736  * The following functions come from pako, from pako/lib/utils/strings
1737  * released under the MIT license, see pako https://github.com/nodeca/pako/
1738  */
1740 // Table with utf8 lengths (calculated by first byte of sequence)
1741 // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
1742 // because max possible codepoint is 0x10ffff
1743 var _utf8len = new Array(256);
1744 for (var i=0; i<256; i++) {
1745   _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);
1747 _utf8len[254]=_utf8len[254]=1; // Invalid sequence start
1749 // convert string to array (typed, when possible)
1750 var string2buf = function (str) {
1751     var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
1753     // count binary size
1754     for (m_pos = 0; m_pos < str_len; m_pos++) {
1755         c = str.charCodeAt(m_pos);
1756         if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
1757             c2 = str.charCodeAt(m_pos+1);
1758             if ((c2 & 0xfc00) === 0xdc00) {
1759                 c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
1760                 m_pos++;
1761             }
1762         }
1763         buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
1764     }
1766     // allocate buffer
1767     if (support.uint8array) {
1768         buf = new Uint8Array(buf_len);
1769     } else {
1770         buf = new Array(buf_len);
1771     }
1773     // convert
1774     for (i=0, m_pos = 0; i < buf_len; m_pos++) {
1775         c = str.charCodeAt(m_pos);
1776         if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
1777             c2 = str.charCodeAt(m_pos+1);
1778             if ((c2 & 0xfc00) === 0xdc00) {
1779                 c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
1780                 m_pos++;
1781             }
1782         }
1783         if (c < 0x80) {
1784             /* one byte */
1785             buf[i++] = c;
1786         } else if (c < 0x800) {
1787             /* two bytes */
1788             buf[i++] = 0xC0 | (c >>> 6);
1789             buf[i++] = 0x80 | (c & 0x3f);
1790         } else if (c < 0x10000) {
1791             /* three bytes */
1792             buf[i++] = 0xE0 | (c >>> 12);
1793             buf[i++] = 0x80 | (c >>> 6 & 0x3f);
1794             buf[i++] = 0x80 | (c & 0x3f);
1795         } else {
1796             /* four bytes */
1797             buf[i++] = 0xf0 | (c >>> 18);
1798             buf[i++] = 0x80 | (c >>> 12 & 0x3f);
1799             buf[i++] = 0x80 | (c >>> 6 & 0x3f);
1800             buf[i++] = 0x80 | (c & 0x3f);
1801         }
1802     }
1804     return buf;
1807 // Calculate max possible position in utf8 buffer,
1808 // that will not break sequence. If that's not possible
1809 // - (very small limits) return max size as is.
1811 // buf[] - utf8 bytes array
1812 // max   - length limit (mandatory);
1813 var utf8border = function(buf, max) {
1814     var pos;
1816     max = max || buf.length;
1817     if (max > buf.length) { max = buf.length; }
1819     // go back from last position, until start of sequence found
1820     pos = max-1;
1821     while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
1823     // Fuckup - very small and broken sequence,
1824     // return max, because we should return something anyway.
1825     if (pos < 0) { return max; }
1827     // If we came to start of buffer - that means vuffer is too small,
1828     // return max too.
1829     if (pos === 0) { return max; }
1831     return (pos + _utf8len[buf[pos]] > max) ? pos : max;
1834 // convert array to string
1835 var buf2string = function (buf) {
1836     var str, i, out, c, c_len;
1837     var len = buf.length;
1839     // Reserve max possible length (2 words per char)
1840     // NB: by unknown reasons, Array is significantly faster for
1841     //     String.fromCharCode.apply than Uint16Array.
1842     var utf16buf = new Array(len*2);
1844     for (out=0, i=0; i<len;) {
1845         c = buf[i++];
1846         // quick process ascii
1847         if (c < 0x80) { utf16buf[out++] = c; continue; }
1849         c_len = _utf8len[c];
1850         // skip 5 & 6 byte codes
1851         if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }
1853         // apply mask on first byte
1854         c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
1855         // join the rest
1856         while (c_len > 1 && i < len) {
1857             c = (c << 6) | (buf[i++] & 0x3f);
1858             c_len--;
1859         }
1861         // terminated by end of string?
1862         if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
1864         if (c < 0x10000) {
1865             utf16buf[out++] = c;
1866         } else {
1867             c -= 0x10000;
1868             utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
1869             utf16buf[out++] = 0xdc00 | (c & 0x3ff);
1870         }
1871     }
1873     // shrinkBuf(utf16buf, out)
1874     if (utf16buf.length !== out) {
1875         if(utf16buf.subarray) {
1876             utf16buf = utf16buf.subarray(0, out);
1877         } else {
1878             utf16buf.length = out;
1879         }
1880     }
1882     // return String.fromCharCode.apply(null, utf16buf);
1883     return utils.applyFromCharCode(utf16buf);
1887 // That's all for the pako functions.
1891  * Transform a javascript string into an array (typed if possible) of bytes,
1892  * UTF-8 encoded.
1893  * @param {String} str the string to encode
1894  * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string.
1895  */
1896 exports.utf8encode = function utf8encode(str) {
1897     if (support.nodebuffer) {
1898         return nodeBuffer(str, "utf-8");
1899     }
1901     return string2buf(str);
1906  * Transform a bytes array (or a representation) representing an UTF-8 encoded
1907  * string into a javascript string.
1908  * @param {Array|Uint8Array|Buffer} buf the data de decode
1909  * @return {String} the decoded string.
1910  */
1911 exports.utf8decode = function utf8decode(buf) {
1912     if (support.nodebuffer) {
1913         return utils.transformTo("nodebuffer", buf).toString("utf-8");
1914     }
1916     buf = utils.transformTo(support.uint8array ? "uint8array" : "array", buf);
1918     // return buf2string(buf);
1919     // Chrome prefers to work with "small" chunks of data
1920     // for the method buf2string.
1921     // Firefox and Chrome has their own shortcut, IE doesn't seem to really care.
1922     var result = [], k = 0, len = buf.length, chunk = 65536;
1923     while (k < len) {
1924         var nextBoundary = utf8border(buf, Math.min(k + chunk, len));
1925         if (support.uint8array) {
1926             result.push(buf2string(buf.subarray(k, nextBoundary)));
1927         } else {
1928             result.push(buf2string(buf.slice(k, nextBoundary)));
1929         }
1930         k = nextBoundary;
1931     }
1932     return result.join("");
1935 // vim: set shiftwidth=4 softtabstop=4:
1937 },{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(_dereq_,module,exports){
1938 'use strict';
1939 var support = _dereq_('./support');
1940 var compressions = _dereq_('./compressions');
1941 var nodeBuffer = _dereq_('./nodeBuffer');
1943  * Convert a string to a "binary string" : a string containing only char codes between 0 and 255.
1944  * @param {string} str the string to transform.
1945  * @return {String} the binary string.
1946  */
1947 exports.string2binary = function(str) {
1948     var result = "";
1949     for (var i = 0; i < str.length; i++) {
1950         result += String.fromCharCode(str.charCodeAt(i) & 0xff);
1951     }
1952     return result;
1954 exports.arrayBuffer2Blob = function(buffer, mimeType) {
1955     exports.checkSupport("blob");
1956         mimeType = mimeType || 'application/zip';
1958     try {
1959         // Blob constructor
1960         return new Blob([buffer], {
1961             type: mimeType
1962         });
1963     }
1964     catch (e) {
1966         try {
1967             // deprecated, browser only, old way
1968             var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
1969             var builder = new Builder();
1970             builder.append(buffer);
1971             return builder.getBlob(mimeType);
1972         }
1973         catch (e) {
1975             // well, fuck ?!
1976             throw new Error("Bug : can't construct the Blob.");
1977         }
1978     }
1983  * The identity function.
1984  * @param {Object} input the input.
1985  * @return {Object} the same input.
1986  */
1987 function identity(input) {
1988     return input;
1992  * Fill in an array with a string.
1993  * @param {String} str the string to use.
1994  * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).
1995  * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.
1996  */
1997 function stringToArrayLike(str, array) {
1998     for (var i = 0; i < str.length; ++i) {
1999         array[i] = str.charCodeAt(i) & 0xFF;
2000     }
2001     return array;
2005  * Transform an array-like object to a string.
2006  * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.
2007  * @return {String} the result.
2008  */
2009 function arrayLikeToString(array) {
2010     // Performances notes :
2011     // --------------------
2012     // String.fromCharCode.apply(null, array) is the fastest, see
2013     // see http://jsperf.com/converting-a-uint8array-to-a-string/2
2014     // but the stack is limited (and we can get huge arrays !).
2015     //
2016     // result += String.fromCharCode(array[i]); generate too many strings !
2017     //
2018     // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2
2019     var chunk = 65536;
2020     var result = [],
2021         len = array.length,
2022         type = exports.getTypeOf(array),
2023         k = 0,
2024         canUseApply = true;
2025       try {
2026          switch(type) {
2027             case "uint8array":
2028                String.fromCharCode.apply(null, new Uint8Array(0));
2029                break;
2030             case "nodebuffer":
2031                String.fromCharCode.apply(null, nodeBuffer(0));
2032                break;
2033          }
2034       } catch(e) {
2035          canUseApply = false;
2036       }
2038       // no apply : slow and painful algorithm
2039       // default browser on android 4.*
2040       if (!canUseApply) {
2041          var resultStr = "";
2042          for(var i = 0; i < array.length;i++) {
2043             resultStr += String.fromCharCode(array[i]);
2044          }
2045     return resultStr;
2046     }
2047     while (k < len && chunk > 1) {
2048         try {
2049             if (type === "array" || type === "nodebuffer") {
2050                 result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));
2051             }
2052             else {
2053                 result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));
2054             }
2055             k += chunk;
2056         }
2057         catch (e) {
2058             chunk = Math.floor(chunk / 2);
2059         }
2060     }
2061     return result.join("");
2064 exports.applyFromCharCode = arrayLikeToString;
2068  * Copy the data from an array-like to an other array-like.
2069  * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.
2070  * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.
2071  * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.
2072  */
2073 function arrayLikeToArrayLike(arrayFrom, arrayTo) {
2074     for (var i = 0; i < arrayFrom.length; i++) {
2075         arrayTo[i] = arrayFrom[i];
2076     }
2077     return arrayTo;
2080 // a matrix containing functions to transform everything into everything.
2081 var transform = {};
2083 // string to ?
2084 transform["string"] = {
2085     "string": identity,
2086     "array": function(input) {
2087         return stringToArrayLike(input, new Array(input.length));
2088     },
2089     "arraybuffer": function(input) {
2090         return transform["string"]["uint8array"](input).buffer;
2091     },
2092     "uint8array": function(input) {
2093         return stringToArrayLike(input, new Uint8Array(input.length));
2094     },
2095     "nodebuffer": function(input) {
2096         return stringToArrayLike(input, nodeBuffer(input.length));
2097     }
2100 // array to ?
2101 transform["array"] = {
2102     "string": arrayLikeToString,
2103     "array": identity,
2104     "arraybuffer": function(input) {
2105         return (new Uint8Array(input)).buffer;
2106     },
2107     "uint8array": function(input) {
2108         return new Uint8Array(input);
2109     },
2110     "nodebuffer": function(input) {
2111         return nodeBuffer(input);
2112     }
2115 // arraybuffer to ?
2116 transform["arraybuffer"] = {
2117     "string": function(input) {
2118         return arrayLikeToString(new Uint8Array(input));
2119     },
2120     "array": function(input) {
2121         return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));
2122     },
2123     "arraybuffer": identity,
2124     "uint8array": function(input) {
2125         return new Uint8Array(input);
2126     },
2127     "nodebuffer": function(input) {
2128         return nodeBuffer(new Uint8Array(input));
2129     }
2132 // uint8array to ?
2133 transform["uint8array"] = {
2134     "string": arrayLikeToString,
2135     "array": function(input) {
2136         return arrayLikeToArrayLike(input, new Array(input.length));
2137     },
2138     "arraybuffer": function(input) {
2139         return input.buffer;
2140     },
2141     "uint8array": identity,
2142     "nodebuffer": function(input) {
2143         return nodeBuffer(input);
2144     }
2147 // nodebuffer to ?
2148 transform["nodebuffer"] = {
2149     "string": arrayLikeToString,
2150     "array": function(input) {
2151         return arrayLikeToArrayLike(input, new Array(input.length));
2152     },
2153     "arraybuffer": function(input) {
2154         return transform["nodebuffer"]["uint8array"](input).buffer;
2155     },
2156     "uint8array": function(input) {
2157         return arrayLikeToArrayLike(input, new Uint8Array(input.length));
2158     },
2159     "nodebuffer": identity
2163  * Transform an input into any type.
2164  * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.
2165  * If no output type is specified, the unmodified input will be returned.
2166  * @param {String} outputType the output type.
2167  * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.
2168  * @throws {Error} an Error if the browser doesn't support the requested output type.
2169  */
2170 exports.transformTo = function(outputType, input) {
2171     if (!input) {
2172         // undefined, null, etc
2173         // an empty string won't harm.
2174         input = "";
2175     }
2176     if (!outputType) {
2177         return input;
2178     }
2179     exports.checkSupport(outputType);
2180     var inputType = exports.getTypeOf(input);
2181     var result = transform[inputType][outputType](input);
2182     return result;
2186  * Return the type of the input.
2187  * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.
2188  * @param {Object} input the input to identify.
2189  * @return {String} the (lowercase) type of the input.
2190  */
2191 exports.getTypeOf = function(input) {
2192     if (typeof input === "string") {
2193         return "string";
2194     }
2195     if (Object.prototype.toString.call(input) === "[object Array]") {
2196         return "array";
2197     }
2198     if (support.nodebuffer && nodeBuffer.test(input)) {
2199         return "nodebuffer";
2200     }
2201     if (support.uint8array && input instanceof Uint8Array) {
2202         return "uint8array";
2203     }
2204     if (support.arraybuffer && input instanceof ArrayBuffer) {
2205         return "arraybuffer";
2206     }
2210  * Throw an exception if the type is not supported.
2211  * @param {String} type the type to check.
2212  * @throws {Error} an Error if the browser doesn't support the requested type.
2213  */
2214 exports.checkSupport = function(type) {
2215     var supported = support[type.toLowerCase()];
2216     if (!supported) {
2217         throw new Error(type + " is not supported by this browser");
2218     }
2220 exports.MAX_VALUE_16BITS = 65535;
2221 exports.MAX_VALUE_32BITS = -1; // well, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" is parsed as -1
2224  * Prettify a string read as binary.
2225  * @param {string} str the string to prettify.
2226  * @return {string} a pretty string.
2227  */
2228 exports.pretty = function(str) {
2229     var res = '',
2230         code, i;
2231     for (i = 0; i < (str || "").length; i++) {
2232         code = str.charCodeAt(i);
2233         res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase();
2234     }
2235     return res;
2239  * Find a compression registered in JSZip.
2240  * @param {string} compressionMethod the method magic to find.
2241  * @return {Object|null} the JSZip compression object, null if none found.
2242  */
2243 exports.findCompression = function(compressionMethod) {
2244     for (var method in compressions) {
2245         if (!compressions.hasOwnProperty(method)) {
2246             continue;
2247         }
2248         if (compressions[method].magic === compressionMethod) {
2249             return compressions[method];
2250         }
2251     }
2252     return null;
2255 * Cross-window, cross-Node-context regular expression detection
2256 * @param  {Object}  object Anything
2257 * @return {Boolean}        true if the object is a regular expression,
2258 * false otherwise
2260 exports.isRegExp = function (object) {
2261     return Object.prototype.toString.call(object) === "[object RegExp]";
2265 },{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(_dereq_,module,exports){
2266 'use strict';
2267 var StringReader = _dereq_('./stringReader');
2268 var NodeBufferReader = _dereq_('./nodeBufferReader');
2269 var Uint8ArrayReader = _dereq_('./uint8ArrayReader');
2270 var utils = _dereq_('./utils');
2271 var sig = _dereq_('./signature');
2272 var ZipEntry = _dereq_('./zipEntry');
2273 var support = _dereq_('./support');
2274 var jszipProto = _dereq_('./object');
2275 //  class ZipEntries {{{
2277  * All the entries in the zip file.
2278  * @constructor
2279  * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load.
2280  * @param {Object} loadOptions Options for loading the stream.
2281  */
2282 function ZipEntries(data, loadOptions) {
2283     this.files = [];
2284     this.loadOptions = loadOptions;
2285     if (data) {
2286         this.load(data);
2287     }
2289 ZipEntries.prototype = {
2290     /**
2291      * Check that the reader is on the speficied signature.
2292      * @param {string} expectedSignature the expected signature.
2293      * @throws {Error} if it is an other signature.
2294      */
2295     checkSignature: function(expectedSignature) {
2296         var signature = this.reader.readString(4);
2297         if (signature !== expectedSignature) {
2298             throw new Error("Corrupted zip or bug : unexpected signature " + "(" + utils.pretty(signature) + ", expected " + utils.pretty(expectedSignature) + ")");
2299         }
2300     },
2301     /**
2302      * Read the end of the central directory.
2303      */
2304     readBlockEndOfCentral: function() {
2305         this.diskNumber = this.reader.readInt(2);
2306         this.diskWithCentralDirStart = this.reader.readInt(2);
2307         this.centralDirRecordsOnThisDisk = this.reader.readInt(2);
2308         this.centralDirRecords = this.reader.readInt(2);
2309         this.centralDirSize = this.reader.readInt(4);
2310         this.centralDirOffset = this.reader.readInt(4);
2312         this.zipCommentLength = this.reader.readInt(2);
2313         // warning : the encoding depends of the system locale
2314         // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded.
2315         // On a windows machine, this field is encoded with the localized windows code page.
2316         this.zipComment = this.reader.readString(this.zipCommentLength);
2317         // To get consistent behavior with the generation part, we will assume that
2318         // this is utf8 encoded.
2319         this.zipComment = jszipProto.utf8decode(this.zipComment);
2320     },
2321     /**
2322      * Read the end of the Zip 64 central directory.
2323      * Not merged with the method readEndOfCentral :
2324      * The end of central can coexist with its Zip64 brother,
2325      * I don't want to read the wrong number of bytes !
2326      */
2327     readBlockZip64EndOfCentral: function() {
2328         this.zip64EndOfCentralSize = this.reader.readInt(8);
2329         this.versionMadeBy = this.reader.readString(2);
2330         this.versionNeeded = this.reader.readInt(2);
2331         this.diskNumber = this.reader.readInt(4);
2332         this.diskWithCentralDirStart = this.reader.readInt(4);
2333         this.centralDirRecordsOnThisDisk = this.reader.readInt(8);
2334         this.centralDirRecords = this.reader.readInt(8);
2335         this.centralDirSize = this.reader.readInt(8);
2336         this.centralDirOffset = this.reader.readInt(8);
2338         this.zip64ExtensibleData = {};
2339         var extraDataSize = this.zip64EndOfCentralSize - 44,
2340             index = 0,
2341             extraFieldId,
2342             extraFieldLength,
2343             extraFieldValue;
2344         while (index < extraDataSize) {
2345             extraFieldId = this.reader.readInt(2);
2346             extraFieldLength = this.reader.readInt(4);
2347             extraFieldValue = this.reader.readString(extraFieldLength);
2348             this.zip64ExtensibleData[extraFieldId] = {
2349                 id: extraFieldId,
2350                 length: extraFieldLength,
2351                 value: extraFieldValue
2352             };
2353         }
2354     },
2355     /**
2356      * Read the end of the Zip 64 central directory locator.
2357      */
2358     readBlockZip64EndOfCentralLocator: function() {
2359         this.diskWithZip64CentralDirStart = this.reader.readInt(4);
2360         this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);
2361         this.disksCount = this.reader.readInt(4);
2362         if (this.disksCount > 1) {
2363             throw new Error("Multi-volumes zip are not supported");
2364         }
2365     },
2366     /**
2367      * Read the local files, based on the offset read in the central part.
2368      */
2369     readLocalFiles: function() {
2370         var i, file;
2371         for (i = 0; i < this.files.length; i++) {
2372             file = this.files[i];
2373             this.reader.setIndex(file.localHeaderOffset);
2374             this.checkSignature(sig.LOCAL_FILE_HEADER);
2375             file.readLocalPart(this.reader);
2376             file.handleUTF8();
2377             file.processAttributes();
2378         }
2379     },
2380     /**
2381      * Read the central directory.
2382      */
2383     readCentralDir: function() {
2384         var file;
2386         this.reader.setIndex(this.centralDirOffset);
2387         while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) {
2388             file = new ZipEntry({
2389                 zip64: this.zip64
2390             }, this.loadOptions);
2391             file.readCentralPart(this.reader);
2392             this.files.push(file);
2393         }
2394     },
2395     /**
2396      * Read the end of central directory.
2397      */
2398     readEndOfCentral: function() {
2399         var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END);
2400         if (offset === -1) {
2401             // Check if the content is a truncated zip or complete garbage.
2402             // A "LOCAL_FILE_HEADER" is not required at the beginning (auto
2403             // extractible zip for example) but it can give a good hint.
2404             // If an ajax request was used without responseType, we will also
2405             // get unreadable data.
2406             var isGarbage = true;
2407             try {
2408                 this.reader.setIndex(0);
2409                 this.checkSignature(sig.LOCAL_FILE_HEADER);
2410                 isGarbage = false;
2411             } catch (e) {}
2413             if (isGarbage) {
2414                 throw new Error("Can't find end of central directory : is this a zip file ? " +
2415                                 "If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html");
2416             } else {
2417                 throw new Error("Corrupted zip : can't find end of central directory");
2418             }
2419         }
2420         this.reader.setIndex(offset);
2421         this.checkSignature(sig.CENTRAL_DIRECTORY_END);
2422         this.readBlockEndOfCentral();
2425         /* extract from the zip spec :
2426             4)  If one of the fields in the end of central directory
2427                 record is too small to hold required data, the field
2428                 should be set to -1 (0xFFFF or 0xFFFFFFFF) and the
2429                 ZIP64 format record should be created.
2430             5)  The end of central directory record and the
2431                 Zip64 end of central directory locator record must
2432                 reside on the same disk when splitting or spanning
2433                 an archive.
2434          */
2435         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) {
2436             this.zip64 = true;
2438             /*
2439             Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from
2440             the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents
2441             all numbers as 64-bit double precision IEEE 754 floating point numbers.
2442             So, we have 53bits for integers and bitwise operations treat everything as 32bits.
2443             see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators
2444             and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5
2445             */
2447             // should look for a zip64 EOCD locator
2448             offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
2449             if (offset === -1) {
2450                 throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");
2451             }
2452             this.reader.setIndex(offset);
2453             this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
2454             this.readBlockZip64EndOfCentralLocator();
2456             // now the zip64 EOCD record
2457             this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);
2458             this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);
2459             this.readBlockZip64EndOfCentral();
2460         }
2461     },
2462     prepareReader: function(data) {
2463         var type = utils.getTypeOf(data);
2464         if (type === "string" && !support.uint8array) {
2465             this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString);
2466         }
2467         else if (type === "nodebuffer") {
2468             this.reader = new NodeBufferReader(data);
2469         }
2470         else {
2471             this.reader = new Uint8ArrayReader(utils.transformTo("uint8array", data));
2472         }
2473     },
2474     /**
2475      * Read a zip file and create ZipEntries.
2476      * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.
2477      */
2478     load: function(data) {
2479         this.prepareReader(data);
2480         this.readEndOfCentral();
2481         this.readCentralDir();
2482         this.readLocalFiles();
2483     }
2485 // }}} end of ZipEntries
2486 module.exports = ZipEntries;
2488 },{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(_dereq_,module,exports){
2489 'use strict';
2490 var StringReader = _dereq_('./stringReader');
2491 var utils = _dereq_('./utils');
2492 var CompressedObject = _dereq_('./compressedObject');
2493 var jszipProto = _dereq_('./object');
2495 var MADE_BY_DOS = 0x00;
2496 var MADE_BY_UNIX = 0x03;
2498 // class ZipEntry {{{
2500  * An entry in the zip file.
2501  * @constructor
2502  * @param {Object} options Options of the current file.
2503  * @param {Object} loadOptions Options for loading the stream.
2504  */
2505 function ZipEntry(options, loadOptions) {
2506     this.options = options;
2507     this.loadOptions = loadOptions;
2509 ZipEntry.prototype = {
2510     /**
2511      * say if the file is encrypted.
2512      * @return {boolean} true if the file is encrypted, false otherwise.
2513      */
2514     isEncrypted: function() {
2515         // bit 1 is set
2516         return (this.bitFlag & 0x0001) === 0x0001;
2517     },
2518     /**
2519      * say if the file has utf-8 filename/comment.
2520      * @return {boolean} true if the filename/comment is in utf-8, false otherwise.
2521      */
2522     useUTF8: function() {
2523         // bit 11 is set
2524         return (this.bitFlag & 0x0800) === 0x0800;
2525     },
2526     /**
2527      * Prepare the function used to generate the compressed content from this ZipFile.
2528      * @param {DataReader} reader the reader to use.
2529      * @param {number} from the offset from where we should read the data.
2530      * @param {number} length the length of the data to read.
2531      * @return {Function} the callback to get the compressed content (the type depends of the DataReader class).
2532      */
2533     prepareCompressedContent: function(reader, from, length) {
2534         return function() {
2535             var previousIndex = reader.index;
2536             reader.setIndex(from);
2537             var compressedFileData = reader.readData(length);
2538             reader.setIndex(previousIndex);
2540             return compressedFileData;
2541         };
2542     },
2543     /**
2544      * Prepare the function used to generate the uncompressed content from this ZipFile.
2545      * @param {DataReader} reader the reader to use.
2546      * @param {number} from the offset from where we should read the data.
2547      * @param {number} length the length of the data to read.
2548      * @param {JSZip.compression} compression the compression used on this file.
2549      * @param {number} uncompressedSize the uncompressed size to expect.
2550      * @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class).
2551      */
2552     prepareContent: function(reader, from, length, compression, uncompressedSize) {
2553         return function() {
2555             var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent());
2556             var uncompressedFileData = compression.uncompress(compressedFileData);
2558             if (uncompressedFileData.length !== uncompressedSize) {
2559                 throw new Error("Bug : uncompressed data size mismatch");
2560             }
2562             return uncompressedFileData;
2563         };
2564     },
2565     /**
2566      * Read the local part of a zip file and add the info in this object.
2567      * @param {DataReader} reader the reader to use.
2568      */
2569     readLocalPart: function(reader) {
2570         var compression, localExtraFieldsLength;
2572         // we already know everything from the central dir !
2573         // If the central dir data are false, we are doomed.
2574         // On the bright side, the local part is scary  : zip64, data descriptors, both, etc.
2575         // The less data we get here, the more reliable this should be.
2576         // Let's skip the whole header and dash to the data !
2577         reader.skip(22);
2578         // in some zip created on windows, the filename stored in the central dir contains \ instead of /.
2579         // Strangely, the filename here is OK.
2580         // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes
2581         // or APPNOTE#4.4.17.1, "All slashes MUST be forward slashes '/'") but there are a lot of bad zip generators...
2582         // Search "unzip mismatching "local" filename continuing with "central" filename version" on
2583         // the internet.
2584         //
2585         // I think I see the logic here : the central directory is used to display
2586         // content and the local directory is used to extract the files. Mixing / and \
2587         // may be used to display \ to windows users and use / when extracting the files.
2588         // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394
2589         this.fileNameLength = reader.readInt(2);
2590         localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir
2591         this.fileName = reader.readString(this.fileNameLength);
2592         reader.skip(localExtraFieldsLength);
2594         if (this.compressedSize == -1 || this.uncompressedSize == -1) {
2595             throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " + "(compressedSize == -1 || uncompressedSize == -1)");
2596         }
2598         compression = utils.findCompression(this.compressionMethod);
2599         if (compression === null) { // no compression found
2600             throw new Error("Corrupted zip : compression " + utils.pretty(this.compressionMethod) + " unknown (inner file : " + this.fileName + ")");
2601         }
2602         this.decompressed = new CompressedObject();
2603         this.decompressed.compressedSize = this.compressedSize;
2604         this.decompressed.uncompressedSize = this.uncompressedSize;
2605         this.decompressed.crc32 = this.crc32;
2606         this.decompressed.compressionMethod = this.compressionMethod;
2607         this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression);
2608         this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize);
2610         // we need to compute the crc32...
2611         if (this.loadOptions.checkCRC32) {
2612             this.decompressed = utils.transformTo("string", this.decompressed.getContent());
2613             if (jszipProto.crc32(this.decompressed) !== this.crc32) {
2614                 throw new Error("Corrupted zip : CRC32 mismatch");
2615             }
2616         }
2617     },
2619     /**
2620      * Read the central part of a zip file and add the info in this object.
2621      * @param {DataReader} reader the reader to use.
2622      */
2623     readCentralPart: function(reader) {
2624         this.versionMadeBy = reader.readInt(2);
2625         this.versionNeeded = reader.readInt(2);
2626         this.bitFlag = reader.readInt(2);
2627         this.compressionMethod = reader.readString(2);
2628         this.date = reader.readDate();
2629         this.crc32 = reader.readInt(4);
2630         this.compressedSize = reader.readInt(4);
2631         this.uncompressedSize = reader.readInt(4);
2632         this.fileNameLength = reader.readInt(2);
2633         this.extraFieldsLength = reader.readInt(2);
2634         this.fileCommentLength = reader.readInt(2);
2635         this.diskNumberStart = reader.readInt(2);
2636         this.internalFileAttributes = reader.readInt(2);
2637         this.externalFileAttributes = reader.readInt(4);
2638         this.localHeaderOffset = reader.readInt(4);
2640         if (this.isEncrypted()) {
2641             throw new Error("Encrypted zip are not supported");
2642         }
2644         this.fileName = reader.readString(this.fileNameLength);
2645         this.readExtraFields(reader);
2646         this.parseZIP64ExtraField(reader);
2647         this.fileComment = reader.readString(this.fileCommentLength);
2648     },
2650     /**
2651      * Parse the external file attributes and get the unix/dos permissions.
2652      */
2653     processAttributes: function () {
2654         this.unixPermissions = null;
2655         this.dosPermissions = null;
2656         var madeBy = this.versionMadeBy >> 8;
2658         // Check if we have the DOS directory flag set.
2659         // We look for it in the DOS and UNIX permissions
2660         // but some unknown platform could set it as a compatibility flag.
2661         this.dir = this.externalFileAttributes & 0x0010 ? true : false;
2663         if(madeBy === MADE_BY_DOS) {
2664             // first 6 bits (0 to 5)
2665             this.dosPermissions = this.externalFileAttributes & 0x3F;
2666         }
2668         if(madeBy === MADE_BY_UNIX) {
2669             this.unixPermissions = (this.externalFileAttributes >> 16) & 0xFFFF;
2670             // the octal permissions are in (this.unixPermissions & 0x01FF).toString(8);
2671         }
2673         // fail safe : if the name ends with a / it probably means a folder
2674         if (!this.dir && this.fileName.slice(-1) === '/') {
2675             this.dir = true;
2676         }
2677     },
2679     /**
2680      * Parse the ZIP64 extra field and merge the info in the current ZipEntry.
2681      * @param {DataReader} reader the reader to use.
2682      */
2683     parseZIP64ExtraField: function(reader) {
2685         if (!this.extraFields[0x0001]) {
2686             return;
2687         }
2689         // should be something, preparing the extra reader
2690         var extraReader = new StringReader(this.extraFields[0x0001].value);
2692         // I really hope that these 64bits integer can fit in 32 bits integer, because js
2693         // won't let us have more.
2694         if (this.uncompressedSize === utils.MAX_VALUE_32BITS) {
2695             this.uncompressedSize = extraReader.readInt(8);
2696         }
2697         if (this.compressedSize === utils.MAX_VALUE_32BITS) {
2698             this.compressedSize = extraReader.readInt(8);
2699         }
2700         if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) {
2701             this.localHeaderOffset = extraReader.readInt(8);
2702         }
2703         if (this.diskNumberStart === utils.MAX_VALUE_32BITS) {
2704             this.diskNumberStart = extraReader.readInt(4);
2705         }
2706     },
2707     /**
2708      * Read the central part of a zip file and add the info in this object.
2709      * @param {DataReader} reader the reader to use.
2710      */
2711     readExtraFields: function(reader) {
2712         var start = reader.index,
2713             extraFieldId,
2714             extraFieldLength,
2715             extraFieldValue;
2717         this.extraFields = this.extraFields || {};
2719         while (reader.index < start + this.extraFieldsLength) {
2720             extraFieldId = reader.readInt(2);
2721             extraFieldLength = reader.readInt(2);
2722             extraFieldValue = reader.readString(extraFieldLength);
2724             this.extraFields[extraFieldId] = {
2725                 id: extraFieldId,
2726                 length: extraFieldLength,
2727                 value: extraFieldValue
2728             };
2729         }
2730     },
2731     /**
2732      * Apply an UTF8 transformation if needed.
2733      */
2734     handleUTF8: function() {
2735         if (this.useUTF8()) {
2736             this.fileName = jszipProto.utf8decode(this.fileName);
2737             this.fileComment = jszipProto.utf8decode(this.fileComment);
2738         } else {
2739             var upath = this.findExtraFieldUnicodePath();
2740             if (upath !== null) {
2741                 this.fileName = upath;
2742             }
2743             var ucomment = this.findExtraFieldUnicodeComment();
2744             if (ucomment !== null) {
2745                 this.fileComment = ucomment;
2746             }
2747         }
2748     },
2750     /**
2751      * Find the unicode path declared in the extra field, if any.
2752      * @return {String} the unicode path, null otherwise.
2753      */
2754     findExtraFieldUnicodePath: function() {
2755         var upathField = this.extraFields[0x7075];
2756         if (upathField) {
2757             var extraReader = new StringReader(upathField.value);
2759             // wrong version
2760             if (extraReader.readInt(1) !== 1) {
2761                 return null;
2762             }
2764             // the crc of the filename changed, this field is out of date.
2765             if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) {
2766                 return null;
2767             }
2769             return jszipProto.utf8decode(extraReader.readString(upathField.length - 5));
2770         }
2771         return null;
2772     },
2774     /**
2775      * Find the unicode comment declared in the extra field, if any.
2776      * @return {String} the unicode comment, null otherwise.
2777      */
2778     findExtraFieldUnicodeComment: function() {
2779         var ucommentField = this.extraFields[0x6375];
2780         if (ucommentField) {
2781             var extraReader = new StringReader(ucommentField.value);
2783             // wrong version
2784             if (extraReader.readInt(1) !== 1) {
2785                 return null;
2786             }
2788             // the crc of the comment changed, this field is out of date.
2789             if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) {
2790                 return null;
2791             }
2793             return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5));
2794         }
2795         return null;
2796     }
2798 module.exports = ZipEntry;
2800 },{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(_dereq_,module,exports){
2801 // Top level file is just a mixin of submodules & constants
2802 'use strict';
2804 var assign    = _dereq_('./lib/utils/common').assign;
2806 var deflate   = _dereq_('./lib/deflate');
2807 var inflate   = _dereq_('./lib/inflate');
2808 var constants = _dereq_('./lib/zlib/constants');
2810 var pako = {};
2812 assign(pako, deflate, inflate, constants);
2814 module.exports = pako;
2815 },{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(_dereq_,module,exports){
2816 'use strict';
2819 var zlib_deflate = _dereq_('./zlib/deflate.js');
2820 var utils = _dereq_('./utils/common');
2821 var strings = _dereq_('./utils/strings');
2822 var msg = _dereq_('./zlib/messages');
2823 var zstream = _dereq_('./zlib/zstream');
2826 /* Public constants ==========================================================*/
2827 /* ===========================================================================*/
2829 var Z_NO_FLUSH      = 0;
2830 var Z_FINISH        = 4;
2832 var Z_OK            = 0;
2833 var Z_STREAM_END    = 1;
2835 var Z_DEFAULT_COMPRESSION = -1;
2837 var Z_DEFAULT_STRATEGY    = 0;
2839 var Z_DEFLATED  = 8;
2841 /* ===========================================================================*/
2845  * class Deflate
2847  * Generic JS-style wrapper for zlib calls. If you don't need
2848  * streaming behaviour - use more simple functions: [[deflate]],
2849  * [[deflateRaw]] and [[gzip]].
2850  **/
2852 /* internal
2853  * Deflate.chunks -> Array
2855  * Chunks of output data, if [[Deflate#onData]] not overriden.
2856  **/
2859  * Deflate.result -> Uint8Array|Array
2861  * Compressed result, generated by default [[Deflate#onData]]
2862  * and [[Deflate#onEnd]] handlers. Filled after you push last chunk
2863  * (call [[Deflate#push]] with `Z_FINISH` / `true` param).
2864  **/
2867  * Deflate.err -> Number
2869  * Error code after deflate finished. 0 (Z_OK) on success.
2870  * You will not need it in real life, because deflate errors
2871  * are possible only on wrong options or bad `onData` / `onEnd`
2872  * custom handlers.
2873  **/
2876  * Deflate.msg -> String
2878  * Error message, if [[Deflate.err]] != 0
2879  **/
2883  * new Deflate(options)
2884  * - options (Object): zlib deflate options.
2886  * Creates new deflator instance with specified params. Throws exception
2887  * on bad params. Supported options:
2889  * - `level`
2890  * - `windowBits`
2891  * - `memLevel`
2892  * - `strategy`
2894  * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
2895  * for more information on these.
2897  * Additional options, for internal needs:
2899  * - `chunkSize` - size of generated data chunks (16K by default)
2900  * - `raw` (Boolean) - do raw deflate
2901  * - `gzip` (Boolean) - create gzip wrapper
2902  * - `to` (String) - if equal to 'string', then result will be "binary string"
2903  *    (each char code [0..255])
2904  * - `header` (Object) - custom header for gzip
2905  *   - `text` (Boolean) - true if compressed data believed to be text
2906  *   - `time` (Number) - modification time, unix timestamp
2907  *   - `os` (Number) - operation system code
2908  *   - `extra` (Array) - array of bytes with extra data (max 65536)
2909  *   - `name` (String) - file name (binary string)
2910  *   - `comment` (String) - comment (binary string)
2911  *   - `hcrc` (Boolean) - true if header crc should be added
2913  * ##### Example:
2915  * ```javascript
2916  * var pako = require('pako')
2917  *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
2918  *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
2920  * var deflate = new pako.Deflate({ level: 3});
2922  * deflate.push(chunk1, false);
2923  * deflate.push(chunk2, true);  // true -> last chunk
2925  * if (deflate.err) { throw new Error(deflate.err); }
2927  * console.log(deflate.result);
2928  * ```
2929  **/
2930 var Deflate = function(options) {
2932   this.options = utils.assign({
2933     level: Z_DEFAULT_COMPRESSION,
2934     method: Z_DEFLATED,
2935     chunkSize: 16384,
2936     windowBits: 15,
2937     memLevel: 8,
2938     strategy: Z_DEFAULT_STRATEGY,
2939     to: ''
2940   }, options || {});
2942   var opt = this.options;
2944   if (opt.raw && (opt.windowBits > 0)) {
2945     opt.windowBits = -opt.windowBits;
2946   }
2948   else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {
2949     opt.windowBits += 16;
2950   }
2952   this.err    = 0;      // error code, if happens (0 = Z_OK)
2953   this.msg    = '';     // error message
2954   this.ended  = false;  // used to avoid multiple onEnd() calls
2955   this.chunks = [];     // chunks of compressed data
2957   this.strm = new zstream();
2958   this.strm.avail_out = 0;
2960   var status = zlib_deflate.deflateInit2(
2961     this.strm,
2962     opt.level,
2963     opt.method,
2964     opt.windowBits,
2965     opt.memLevel,
2966     opt.strategy
2967   );
2969   if (status !== Z_OK) {
2970     throw new Error(msg[status]);
2971   }
2973   if (opt.header) {
2974     zlib_deflate.deflateSetHeader(this.strm, opt.header);
2975   }
2979  * Deflate#push(data[, mode]) -> Boolean
2980  * - data (Uint8Array|Array|String): input data. Strings will be converted to
2981  *   utf8 byte sequence.
2982  * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
2983  *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
2985  * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with
2986  * new compressed chunks. Returns `true` on success. The last data block must have
2987  * mode Z_FINISH (or `true`). That flush internal pending buffers and call
2988  * [[Deflate#onEnd]].
2990  * On fail call [[Deflate#onEnd]] with error code and return false.
2992  * We strongly recommend to use `Uint8Array` on input for best speed (output
2993  * array format is detected automatically). Also, don't skip last param and always
2994  * use the same type in your code (boolean or number). That will improve JS speed.
2996  * For regular `Array`-s make sure all elements are [0..255].
2998  * ##### Example
3000  * ```javascript
3001  * push(chunk, false); // push one of data chunks
3002  * ...
3003  * push(chunk, true);  // push last chunk
3004  * ```
3005  **/
3006 Deflate.prototype.push = function(data, mode) {
3007   var strm = this.strm;
3008   var chunkSize = this.options.chunkSize;
3009   var status, _mode;
3011   if (this.ended) { return false; }
3013   _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);
3015   // Convert data if needed
3016   if (typeof data === 'string') {
3017     // If we need to compress text, change encoding to utf8.
3018     strm.input = strings.string2buf(data);
3019   } else {
3020     strm.input = data;
3021   }
3023   strm.next_in = 0;
3024   strm.avail_in = strm.input.length;
3026   do {
3027     if (strm.avail_out === 0) {
3028       strm.output = new utils.Buf8(chunkSize);
3029       strm.next_out = 0;
3030       strm.avail_out = chunkSize;
3031     }
3032     status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */
3034     if (status !== Z_STREAM_END && status !== Z_OK) {
3035       this.onEnd(status);
3036       this.ended = true;
3037       return false;
3038     }
3039     if (strm.avail_out === 0 || (strm.avail_in === 0 && _mode === Z_FINISH)) {
3040       if (this.options.to === 'string') {
3041         this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));
3042       } else {
3043         this.onData(utils.shrinkBuf(strm.output, strm.next_out));
3044       }
3045     }
3046   } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);
3048   // Finalize on the last chunk.
3049   if (_mode === Z_FINISH) {
3050     status = zlib_deflate.deflateEnd(this.strm);
3051     this.onEnd(status);
3052     this.ended = true;
3053     return status === Z_OK;
3054   }
3056   return true;
3061  * Deflate#onData(chunk) -> Void
3062  * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
3063  *   on js engine support. When string output requested, each chunk
3064  *   will be string.
3066  * By default, stores data blocks in `chunks[]` property and glue
3067  * those in `onEnd`. Override this handler, if you need another behaviour.
3068  **/
3069 Deflate.prototype.onData = function(chunk) {
3070   this.chunks.push(chunk);
3075  * Deflate#onEnd(status) -> Void
3076  * - status (Number): deflate status. 0 (Z_OK) on success,
3077  *   other if not.
3079  * Called once after you tell deflate that input stream complete
3080  * or error happenned. By default - join collected chunks,
3081  * free memory and fill `results` / `err` properties.
3082  **/
3083 Deflate.prototype.onEnd = function(status) {
3084   // On success - join
3085   if (status === Z_OK) {
3086     if (this.options.to === 'string') {
3087       this.result = this.chunks.join('');
3088     } else {
3089       this.result = utils.flattenChunks(this.chunks);
3090     }
3091   }
3092   this.chunks = [];
3093   this.err = status;
3094   this.msg = this.strm.msg;
3099  * deflate(data[, options]) -> Uint8Array|Array|String
3100  * - data (Uint8Array|Array|String): input data to compress.
3101  * - options (Object): zlib deflate options.
3103  * Compress `data` with deflate alrorythm and `options`.
3105  * Supported options are:
3107  * - level
3108  * - windowBits
3109  * - memLevel
3110  * - strategy
3112  * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
3113  * for more information on these.
3115  * Sugar (options):
3117  * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
3118  *   negative windowBits implicitly.
3119  * - `to` (String) - if equal to 'string', then result will be "binary string"
3120  *    (each char code [0..255])
3122  * ##### Example:
3124  * ```javascript
3125  * var pako = require('pako')
3126  *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);
3128  * console.log(pako.deflate(data));
3129  * ```
3130  **/
3131 function deflate(input, options) {
3132   var deflator = new Deflate(options);
3134   deflator.push(input, true);
3136   // That will never happens, if you don't cheat with options :)
3137   if (deflator.err) { throw deflator.msg; }
3139   return deflator.result;
3144  * deflateRaw(data[, options]) -> Uint8Array|Array|String
3145  * - data (Uint8Array|Array|String): input data to compress.
3146  * - options (Object): zlib deflate options.
3148  * The same as [[deflate]], but creates raw data, without wrapper
3149  * (header and adler32 crc).
3150  **/
3151 function deflateRaw(input, options) {
3152   options = options || {};
3153   options.raw = true;
3154   return deflate(input, options);
3159  * gzip(data[, options]) -> Uint8Array|Array|String
3160  * - data (Uint8Array|Array|String): input data to compress.
3161  * - options (Object): zlib deflate options.
3163  * The same as [[deflate]], but create gzip wrapper instead of
3164  * deflate one.
3165  **/
3166 function gzip(input, options) {
3167   options = options || {};
3168   options.gzip = true;
3169   return deflate(input, options);
3173 exports.Deflate = Deflate;
3174 exports.deflate = deflate;
3175 exports.deflateRaw = deflateRaw;
3176 exports.gzip = gzip;
3177 },{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(_dereq_,module,exports){
3178 'use strict';
3181 var zlib_inflate = _dereq_('./zlib/inflate.js');
3182 var utils = _dereq_('./utils/common');
3183 var strings = _dereq_('./utils/strings');
3184 var c = _dereq_('./zlib/constants');
3185 var msg = _dereq_('./zlib/messages');
3186 var zstream = _dereq_('./zlib/zstream');
3187 var gzheader = _dereq_('./zlib/gzheader');
3191  * class Inflate
3193  * Generic JS-style wrapper for zlib calls. If you don't need
3194  * streaming behaviour - use more simple functions: [[inflate]]
3195  * and [[inflateRaw]].
3196  **/
3198 /* internal
3199  * inflate.chunks -> Array
3201  * Chunks of output data, if [[Inflate#onData]] not overriden.
3202  **/
3205  * Inflate.result -> Uint8Array|Array|String
3207  * Uncompressed result, generated by default [[Inflate#onData]]
3208  * and [[Inflate#onEnd]] handlers. Filled after you push last chunk
3209  * (call [[Inflate#push]] with `Z_FINISH` / `true` param).
3210  **/
3213  * Inflate.err -> Number
3215  * Error code after inflate finished. 0 (Z_OK) on success.
3216  * Should be checked if broken data possible.
3217  **/
3220  * Inflate.msg -> String
3222  * Error message, if [[Inflate.err]] != 0
3223  **/
3227  * new Inflate(options)
3228  * - options (Object): zlib inflate options.
3230  * Creates new inflator instance with specified params. Throws exception
3231  * on bad params. Supported options:
3233  * - `windowBits`
3235  * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
3236  * for more information on these.
3238  * Additional options, for internal needs:
3240  * - `chunkSize` - size of generated data chunks (16K by default)
3241  * - `raw` (Boolean) - do raw inflate
3242  * - `to` (String) - if equal to 'string', then result will be converted
3243  *   from utf8 to utf16 (javascript) string. When string output requested,
3244  *   chunk length can differ from `chunkSize`, depending on content.
3246  * By default, when no options set, autodetect deflate/gzip data format via
3247  * wrapper header.
3249  * ##### Example:
3251  * ```javascript
3252  * var pako = require('pako')
3253  *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
3254  *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
3256  * var inflate = new pako.Inflate({ level: 3});
3258  * inflate.push(chunk1, false);
3259  * inflate.push(chunk2, true);  // true -> last chunk
3261  * if (inflate.err) { throw new Error(inflate.err); }
3263  * console.log(inflate.result);
3264  * ```
3265  **/
3266 var Inflate = function(options) {
3268   this.options = utils.assign({
3269     chunkSize: 16384,
3270     windowBits: 0,
3271     to: ''
3272   }, options || {});
3274   var opt = this.options;
3276   // Force window size for `raw` data, if not set directly,
3277   // because we have no header for autodetect.
3278   if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {
3279     opt.windowBits = -opt.windowBits;
3280     if (opt.windowBits === 0) { opt.windowBits = -15; }
3281   }
3283   // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
3284   if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&
3285       !(options && options.windowBits)) {
3286     opt.windowBits += 32;
3287   }
3289   // Gzip header has no info about windows size, we can do autodetect only
3290   // for deflate. So, if window size not set, force it to max when gzip possible
3291   if ((opt.windowBits > 15) && (opt.windowBits < 48)) {
3292     // bit 3 (16) -> gzipped data
3293     // bit 4 (32) -> autodetect gzip/deflate
3294     if ((opt.windowBits & 15) === 0) {
3295       opt.windowBits |= 15;
3296     }
3297   }
3299   this.err    = 0;      // error code, if happens (0 = Z_OK)
3300   this.msg    = '';     // error message
3301   this.ended  = false;  // used to avoid multiple onEnd() calls
3302   this.chunks = [];     // chunks of compressed data
3304   this.strm   = new zstream();
3305   this.strm.avail_out = 0;
3307   var status  = zlib_inflate.inflateInit2(
3308     this.strm,
3309     opt.windowBits
3310   );
3312   if (status !== c.Z_OK) {
3313     throw new Error(msg[status]);
3314   }
3316   this.header = new gzheader();
3318   zlib_inflate.inflateGetHeader(this.strm, this.header);
3322  * Inflate#push(data[, mode]) -> Boolean
3323  * - data (Uint8Array|Array|String): input data
3324  * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
3325  *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
3327  * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
3328  * new output chunks. Returns `true` on success. The last data block must have
3329  * mode Z_FINISH (or `true`). That flush internal pending buffers and call
3330  * [[Inflate#onEnd]].
3332  * On fail call [[Inflate#onEnd]] with error code and return false.
3334  * We strongly recommend to use `Uint8Array` on input for best speed (output
3335  * format is detected automatically). Also, don't skip last param and always
3336  * use the same type in your code (boolean or number). That will improve JS speed.
3338  * For regular `Array`-s make sure all elements are [0..255].
3340  * ##### Example
3342  * ```javascript
3343  * push(chunk, false); // push one of data chunks
3344  * ...
3345  * push(chunk, true);  // push last chunk
3346  * ```
3347  **/
3348 Inflate.prototype.push = function(data, mode) {
3349   var strm = this.strm;
3350   var chunkSize = this.options.chunkSize;
3351   var status, _mode;
3352   var next_out_utf8, tail, utf8str;
3354   if (this.ended) { return false; }
3355   _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);
3357   // Convert data if needed
3358   if (typeof data === 'string') {
3359     // Only binary strings can be decompressed on practice
3360     strm.input = strings.binstring2buf(data);
3361   } else {
3362     strm.input = data;
3363   }
3365   strm.next_in = 0;
3366   strm.avail_in = strm.input.length;
3368   do {
3369     if (strm.avail_out === 0) {
3370       strm.output = new utils.Buf8(chunkSize);
3371       strm.next_out = 0;
3372       strm.avail_out = chunkSize;
3373     }
3375     status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */
3377     if (status !== c.Z_STREAM_END && status !== c.Z_OK) {
3378       this.onEnd(status);
3379       this.ended = true;
3380       return false;
3381     }
3383     if (strm.next_out) {
3384       if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && _mode === c.Z_FINISH)) {
3386         if (this.options.to === 'string') {
3388           next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
3390           tail = strm.next_out - next_out_utf8;
3391           utf8str = strings.buf2string(strm.output, next_out_utf8);
3393           // move tail
3394           strm.next_out = tail;
3395           strm.avail_out = chunkSize - tail;
3396           if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }
3398           this.onData(utf8str);
3400         } else {
3401           this.onData(utils.shrinkBuf(strm.output, strm.next_out));
3402         }
3403       }
3404     }
3405   } while ((strm.avail_in > 0) && status !== c.Z_STREAM_END);
3407   if (status === c.Z_STREAM_END) {
3408     _mode = c.Z_FINISH;
3409   }
3410   // Finalize on the last chunk.
3411   if (_mode === c.Z_FINISH) {
3412     status = zlib_inflate.inflateEnd(this.strm);
3413     this.onEnd(status);
3414     this.ended = true;
3415     return status === c.Z_OK;
3416   }
3418   return true;
3423  * Inflate#onData(chunk) -> Void
3424  * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
3425  *   on js engine support. When string output requested, each chunk
3426  *   will be string.
3428  * By default, stores data blocks in `chunks[]` property and glue
3429  * those in `onEnd`. Override this handler, if you need another behaviour.
3430  **/
3431 Inflate.prototype.onData = function(chunk) {
3432   this.chunks.push(chunk);
3437  * Inflate#onEnd(status) -> Void
3438  * - status (Number): inflate status. 0 (Z_OK) on success,
3439  *   other if not.
3441  * Called once after you tell inflate that input stream complete
3442  * or error happenned. By default - join collected chunks,
3443  * free memory and fill `results` / `err` properties.
3444  **/
3445 Inflate.prototype.onEnd = function(status) {
3446   // On success - join
3447   if (status === c.Z_OK) {
3448     if (this.options.to === 'string') {
3449       // Glue & convert here, until we teach pako to send
3450       // utf8 alligned strings to onData
3451       this.result = this.chunks.join('');
3452     } else {
3453       this.result = utils.flattenChunks(this.chunks);
3454     }
3455   }
3456   this.chunks = [];
3457   this.err = status;
3458   this.msg = this.strm.msg;
3463  * inflate(data[, options]) -> Uint8Array|Array|String
3464  * - data (Uint8Array|Array|String): input data to decompress.
3465  * - options (Object): zlib inflate options.
3467  * Decompress `data` with inflate/ungzip and `options`. Autodetect
3468  * format via wrapper header by default. That's why we don't provide
3469  * separate `ungzip` method.
3471  * Supported options are:
3473  * - windowBits
3475  * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
3476  * for more information.
3478  * Sugar (options):
3480  * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
3481  *   negative windowBits implicitly.
3482  * - `to` (String) - if equal to 'string', then result will be converted
3483  *   from utf8 to utf16 (javascript) string. When string output requested,
3484  *   chunk length can differ from `chunkSize`, depending on content.
3487  * ##### Example:
3489  * ```javascript
3490  * var pako = require('pako')
3491  *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])
3492  *   , output;
3494  * try {
3495  *   output = pako.inflate(input);
3496  * } catch (err)
3497  *   console.log(err);
3498  * }
3499  * ```
3500  **/
3501 function inflate(input, options) {
3502   var inflator = new Inflate(options);
3504   inflator.push(input, true);
3506   // That will never happens, if you don't cheat with options :)
3507   if (inflator.err) { throw inflator.msg; }
3509   return inflator.result;
3514  * inflateRaw(data[, options]) -> Uint8Array|Array|String
3515  * - data (Uint8Array|Array|String): input data to decompress.
3516  * - options (Object): zlib inflate options.
3518  * The same as [[inflate]], but creates raw data, without wrapper
3519  * (header and adler32 crc).
3520  **/
3521 function inflateRaw(input, options) {
3522   options = options || {};
3523   options.raw = true;
3524   return inflate(input, options);
3529  * ungzip(data[, options]) -> Uint8Array|Array|String
3530  * - data (Uint8Array|Array|String): input data to decompress.
3531  * - options (Object): zlib inflate options.
3533  * Just shortcut to [[inflate]], because it autodetects format
3534  * by header.content. Done for convenience.
3535  **/
3538 exports.Inflate = Inflate;
3539 exports.inflate = inflate;
3540 exports.inflateRaw = inflateRaw;
3541 exports.ungzip  = inflate;
3543 },{"./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){
3544 'use strict';
3547 var TYPED_OK =  (typeof Uint8Array !== 'undefined') &&
3548                 (typeof Uint16Array !== 'undefined') &&
3549                 (typeof Int32Array !== 'undefined');
3552 exports.assign = function (obj /*from1, from2, from3, ...*/) {
3553   var sources = Array.prototype.slice.call(arguments, 1);
3554   while (sources.length) {
3555     var source = sources.shift();
3556     if (!source) { continue; }
3558     if (typeof(source) !== 'object') {
3559       throw new TypeError(source + 'must be non-object');
3560     }
3562     for (var p in source) {
3563       if (source.hasOwnProperty(p)) {
3564         obj[p] = source[p];
3565       }
3566     }
3567   }
3569   return obj;
3573 // reduce buffer size, avoiding mem copy
3574 exports.shrinkBuf = function (buf, size) {
3575   if (buf.length === size) { return buf; }
3576   if (buf.subarray) { return buf.subarray(0, size); }
3577   buf.length = size;
3578   return buf;
3582 var fnTyped = {
3583   arraySet: function (dest, src, src_offs, len, dest_offs) {
3584     if (src.subarray && dest.subarray) {
3585       dest.set(src.subarray(src_offs, src_offs+len), dest_offs);
3586       return;
3587     }
3588     // Fallback to ordinary array
3589     for(var i=0; i<len; i++) {
3590       dest[dest_offs + i] = src[src_offs + i];
3591     }
3592   },
3593   // Join array of chunks to single array.
3594   flattenChunks: function(chunks) {
3595     var i, l, len, pos, chunk, result;
3597     // calculate data length
3598     len = 0;
3599     for (i=0, l=chunks.length; i<l; i++) {
3600       len += chunks[i].length;
3601     }
3603     // join chunks
3604     result = new Uint8Array(len);
3605     pos = 0;
3606     for (i=0, l=chunks.length; i<l; i++) {
3607       chunk = chunks[i];
3608       result.set(chunk, pos);
3609       pos += chunk.length;
3610     }
3612     return result;
3613   }
3616 var fnUntyped = {
3617   arraySet: function (dest, src, src_offs, len, dest_offs) {
3618     for(var i=0; i<len; i++) {
3619       dest[dest_offs + i] = src[src_offs + i];
3620     }
3621   },
3622   // Join array of chunks to single array.
3623   flattenChunks: function(chunks) {
3624     return [].concat.apply([], chunks);
3625   }
3629 // Enable/Disable typed arrays use, for testing
3631 exports.setTyped = function (on) {
3632   if (on) {
3633     exports.Buf8  = Uint8Array;
3634     exports.Buf16 = Uint16Array;
3635     exports.Buf32 = Int32Array;
3636     exports.assign(exports, fnTyped);
3637   } else {
3638     exports.Buf8  = Array;
3639     exports.Buf16 = Array;
3640     exports.Buf32 = Array;
3641     exports.assign(exports, fnUntyped);
3642   }
3645 exports.setTyped(TYPED_OK);
3646 },{}],28:[function(_dereq_,module,exports){
3647 // String encode/decode helpers
3648 'use strict';
3651 var utils = _dereq_('./common');
3654 // Quick check if we can use fast array to bin string conversion
3656 // - apply(Array) can fail on Android 2.2
3657 // - apply(Uint8Array) can fail on iOS 5.1 Safary
3659 var STR_APPLY_OK = true;
3660 var STR_APPLY_UIA_OK = true;
3662 try { String.fromCharCode.apply(null, [0]); } catch(__) { STR_APPLY_OK = false; }
3663 try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch(__) { STR_APPLY_UIA_OK = false; }
3666 // Table with utf8 lengths (calculated by first byte of sequence)
3667 // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
3668 // because max possible codepoint is 0x10ffff
3669 var _utf8len = new utils.Buf8(256);
3670 for (var i=0; i<256; i++) {
3671   _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);
3673 _utf8len[254]=_utf8len[254]=1; // Invalid sequence start
3676 // convert string to array (typed, when possible)
3677 exports.string2buf = function (str) {
3678   var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
3680   // count binary size
3681   for (m_pos = 0; m_pos < str_len; m_pos++) {
3682     c = str.charCodeAt(m_pos);
3683     if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
3684       c2 = str.charCodeAt(m_pos+1);
3685       if ((c2 & 0xfc00) === 0xdc00) {
3686         c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
3687         m_pos++;
3688       }
3689     }
3690     buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
3691   }
3693   // allocate buffer
3694   buf = new utils.Buf8(buf_len);
3696   // convert
3697   for (i=0, m_pos = 0; i < buf_len; m_pos++) {
3698     c = str.charCodeAt(m_pos);
3699     if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
3700       c2 = str.charCodeAt(m_pos+1);
3701       if ((c2 & 0xfc00) === 0xdc00) {
3702         c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
3703         m_pos++;
3704       }
3705     }
3706     if (c < 0x80) {
3707       /* one byte */
3708       buf[i++] = c;
3709     } else if (c < 0x800) {
3710       /* two bytes */
3711       buf[i++] = 0xC0 | (c >>> 6);
3712       buf[i++] = 0x80 | (c & 0x3f);
3713     } else if (c < 0x10000) {
3714       /* three bytes */
3715       buf[i++] = 0xE0 | (c >>> 12);
3716       buf[i++] = 0x80 | (c >>> 6 & 0x3f);
3717       buf[i++] = 0x80 | (c & 0x3f);
3718     } else {
3719       /* four bytes */
3720       buf[i++] = 0xf0 | (c >>> 18);
3721       buf[i++] = 0x80 | (c >>> 12 & 0x3f);
3722       buf[i++] = 0x80 | (c >>> 6 & 0x3f);
3723       buf[i++] = 0x80 | (c & 0x3f);
3724     }
3725   }
3727   return buf;
3730 // Helper (used in 2 places)
3731 function buf2binstring(buf, len) {
3732   // use fallback for big arrays to avoid stack overflow
3733   if (len < 65537) {
3734     if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {
3735       return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));
3736     }
3737   }
3739   var result = '';
3740   for(var i=0; i < len; i++) {
3741     result += String.fromCharCode(buf[i]);
3742   }
3743   return result;
3747 // Convert byte array to binary string
3748 exports.buf2binstring = function(buf) {
3749   return buf2binstring(buf, buf.length);
3753 // Convert binary string (typed, when possible)
3754 exports.binstring2buf = function(str) {
3755   var buf = new utils.Buf8(str.length);
3756   for(var i=0, len=buf.length; i < len; i++) {
3757     buf[i] = str.charCodeAt(i);
3758   }
3759   return buf;
3763 // convert array to string
3764 exports.buf2string = function (buf, max) {
3765   var i, out, c, c_len;
3766   var len = max || buf.length;
3768   // Reserve max possible length (2 words per char)
3769   // NB: by unknown reasons, Array is significantly faster for
3770   //     String.fromCharCode.apply than Uint16Array.
3771   var utf16buf = new Array(len*2);
3773   for (out=0, i=0; i<len;) {
3774     c = buf[i++];
3775     // quick process ascii
3776     if (c < 0x80) { utf16buf[out++] = c; continue; }
3778     c_len = _utf8len[c];
3779     // skip 5 & 6 byte codes
3780     if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }
3782     // apply mask on first byte
3783     c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
3784     // join the rest
3785     while (c_len > 1 && i < len) {
3786       c = (c << 6) | (buf[i++] & 0x3f);
3787       c_len--;
3788     }
3790     // terminated by end of string?
3791     if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
3793     if (c < 0x10000) {
3794       utf16buf[out++] = c;
3795     } else {
3796       c -= 0x10000;
3797       utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
3798       utf16buf[out++] = 0xdc00 | (c & 0x3ff);
3799     }
3800   }
3802   return buf2binstring(utf16buf, out);
3806 // Calculate max possible position in utf8 buffer,
3807 // that will not break sequence. If that's not possible
3808 // - (very small limits) return max size as is.
3810 // buf[] - utf8 bytes array
3811 // max   - length limit (mandatory);
3812 exports.utf8border = function(buf, max) {
3813   var pos;
3815   max = max || buf.length;
3816   if (max > buf.length) { max = buf.length; }
3818   // go back from last position, until start of sequence found
3819   pos = max-1;
3820   while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
3822   // Fuckup - very small and broken sequence,
3823   // return max, because we should return something anyway.
3824   if (pos < 0) { return max; }
3826   // If we came to start of buffer - that means vuffer is too small,
3827   // return max too.
3828   if (pos === 0) { return max; }
3830   return (pos + _utf8len[buf[pos]] > max) ? pos : max;
3833 },{"./common":27}],29:[function(_dereq_,module,exports){
3834 'use strict';
3836 // Note: adler32 takes 12% for level 0 and 2% for level 6.
3837 // It doesn't worth to make additional optimizationa as in original.
3838 // Small size is preferable.
3840 function adler32(adler, buf, len, pos) {
3841   var s1 = (adler & 0xffff) |0
3842     , s2 = ((adler >>> 16) & 0xffff) |0
3843     , n = 0;
3845   while (len !== 0) {
3846     // Set limit ~ twice less than 5552, to keep
3847     // s2 in 31-bits, because we force signed ints.
3848     // in other case %= will fail.
3849     n = len > 2000 ? 2000 : len;
3850     len -= n;
3852     do {
3853       s1 = (s1 + buf[pos++]) |0;
3854       s2 = (s2 + s1) |0;
3855     } while (--n);
3857     s1 %= 65521;
3858     s2 %= 65521;
3859   }
3861   return (s1 | (s2 << 16)) |0;
3865 module.exports = adler32;
3866 },{}],30:[function(_dereq_,module,exports){
3867 module.exports = {
3869   /* Allowed flush values; see deflate() and inflate() below for details */
3870   Z_NO_FLUSH:         0,
3871   Z_PARTIAL_FLUSH:    1,
3872   Z_SYNC_FLUSH:       2,
3873   Z_FULL_FLUSH:       3,
3874   Z_FINISH:           4,
3875   Z_BLOCK:            5,
3876   Z_TREES:            6,
3878   /* Return codes for the compression/decompression functions. Negative values
3879   * are errors, positive values are used for special but normal events.
3880   */
3881   Z_OK:               0,
3882   Z_STREAM_END:       1,
3883   Z_NEED_DICT:        2,
3884   Z_ERRNO:           -1,
3885   Z_STREAM_ERROR:    -2,
3886   Z_DATA_ERROR:      -3,
3887   //Z_MEM_ERROR:     -4,
3888   Z_BUF_ERROR:       -5,
3889   //Z_VERSION_ERROR: -6,
3891   /* compression levels */
3892   Z_NO_COMPRESSION:         0,
3893   Z_BEST_SPEED:             1,
3894   Z_BEST_COMPRESSION:       9,
3895   Z_DEFAULT_COMPRESSION:   -1,
3898   Z_FILTERED:               1,
3899   Z_HUFFMAN_ONLY:           2,
3900   Z_RLE:                    3,
3901   Z_FIXED:                  4,
3902   Z_DEFAULT_STRATEGY:       0,
3904   /* Possible values of the data_type field (though see inflate()) */
3905   Z_BINARY:                 0,
3906   Z_TEXT:                   1,
3907   //Z_ASCII:                1, // = Z_TEXT (deprecated)
3908   Z_UNKNOWN:                2,
3910   /* The deflate compression method */
3911   Z_DEFLATED:               8
3912   //Z_NULL:                 null // Use -1 or null inline, depending on var type
3914 },{}],31:[function(_dereq_,module,exports){
3915 'use strict';
3917 // Note: we can't get significant speed boost here.
3918 // So write code to minimize size - no pregenerated tables
3919 // and array tools dependencies.
3922 // Use ordinary array, since untyped makes no boost here
3923 function makeTable() {
3924   var c, table = [];
3926   for(var n =0; n < 256; n++){
3927     c = n;
3928     for(var k =0; k < 8; k++){
3929       c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
3930     }
3931     table[n] = c;
3932   }
3934   return table;
3937 // Create table on load. Just 255 signed longs. Not a problem.
3938 var crcTable = makeTable();
3941 function crc32(crc, buf, len, pos) {
3942   var t = crcTable
3943     , end = pos + len;
3945   crc = crc ^ (-1);
3947   for (var i = pos; i < end; i++ ) {
3948     crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
3949   }
3951   return (crc ^ (-1)); // >>> 0;
3955 module.exports = crc32;
3956 },{}],32:[function(_dereq_,module,exports){
3957 'use strict';
3959 var utils   = _dereq_('../utils/common');
3960 var trees   = _dereq_('./trees');
3961 var adler32 = _dereq_('./adler32');
3962 var crc32   = _dereq_('./crc32');
3963 var msg   = _dereq_('./messages');
3965 /* Public constants ==========================================================*/
3966 /* ===========================================================================*/
3969 /* Allowed flush values; see deflate() and inflate() below for details */
3970 var Z_NO_FLUSH      = 0;
3971 var Z_PARTIAL_FLUSH = 1;
3972 //var Z_SYNC_FLUSH    = 2;
3973 var Z_FULL_FLUSH    = 3;
3974 var Z_FINISH        = 4;
3975 var Z_BLOCK         = 5;
3976 //var Z_TREES         = 6;
3979 /* Return codes for the compression/decompression functions. Negative values
3980  * are errors, positive values are used for special but normal events.
3981  */
3982 var Z_OK            = 0;
3983 var Z_STREAM_END    = 1;
3984 //var Z_NEED_DICT     = 2;
3985 //var Z_ERRNO         = -1;
3986 var Z_STREAM_ERROR  = -2;
3987 var Z_DATA_ERROR    = -3;
3988 //var Z_MEM_ERROR     = -4;
3989 var Z_BUF_ERROR     = -5;
3990 //var Z_VERSION_ERROR = -6;
3993 /* compression levels */
3994 //var Z_NO_COMPRESSION      = 0;
3995 //var Z_BEST_SPEED          = 1;
3996 //var Z_BEST_COMPRESSION    = 9;
3997 var Z_DEFAULT_COMPRESSION = -1;
4000 var Z_FILTERED            = 1;
4001 var Z_HUFFMAN_ONLY        = 2;
4002 var Z_RLE                 = 3;
4003 var Z_FIXED               = 4;
4004 var Z_DEFAULT_STRATEGY    = 0;
4006 /* Possible values of the data_type field (though see inflate()) */
4007 //var Z_BINARY              = 0;
4008 //var Z_TEXT                = 1;
4009 //var Z_ASCII               = 1; // = Z_TEXT
4010 var Z_UNKNOWN             = 2;
4013 /* The deflate compression method */
4014 var Z_DEFLATED  = 8;
4016 /*============================================================================*/
4019 var MAX_MEM_LEVEL = 9;
4020 /* Maximum value for memLevel in deflateInit2 */
4021 var MAX_WBITS = 15;
4022 /* 32K LZ77 window */
4023 var DEF_MEM_LEVEL = 8;
4026 var LENGTH_CODES  = 29;
4027 /* number of length codes, not counting the special END_BLOCK code */
4028 var LITERALS      = 256;
4029 /* number of literal bytes 0..255 */
4030 var L_CODES       = LITERALS + 1 + LENGTH_CODES;
4031 /* number of Literal or Length codes, including the END_BLOCK code */
4032 var D_CODES       = 30;
4033 /* number of distance codes */
4034 var BL_CODES      = 19;
4035 /* number of codes used to transfer the bit lengths */
4036 var HEAP_SIZE     = 2*L_CODES + 1;
4037 /* maximum heap size */
4038 var MAX_BITS  = 15;
4039 /* All codes must not exceed MAX_BITS bits */
4041 var MIN_MATCH = 3;
4042 var MAX_MATCH = 258;
4043 var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
4045 var PRESET_DICT = 0x20;
4047 var INIT_STATE = 42;
4048 var EXTRA_STATE = 69;
4049 var NAME_STATE = 73;
4050 var COMMENT_STATE = 91;
4051 var HCRC_STATE = 103;
4052 var BUSY_STATE = 113;
4053 var FINISH_STATE = 666;
4055 var BS_NEED_MORE      = 1; /* block not completed, need more input or more output */
4056 var BS_BLOCK_DONE     = 2; /* block flush performed */
4057 var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
4058 var BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */
4060 var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.
4062 function err(strm, errorCode) {
4063   strm.msg = msg[errorCode];
4064   return errorCode;
4067 function rank(f) {
4068   return ((f) << 1) - ((f) > 4 ? 9 : 0);
4071 function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
4074 /* =========================================================================
4075  * Flush as much pending output as possible. All deflate() output goes
4076  * through this function so some applications may wish to modify it
4077  * to avoid allocating a large strm->output buffer and copying into it.
4078  * (See also read_buf()).
4079  */
4080 function flush_pending(strm) {
4081   var s = strm.state;
4083   //_tr_flush_bits(s);
4084   var len = s.pending;
4085   if (len > strm.avail_out) {
4086     len = strm.avail_out;
4087   }
4088   if (len === 0) { return; }
4090   utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
4091   strm.next_out += len;
4092   s.pending_out += len;
4093   strm.total_out += len;
4094   strm.avail_out -= len;
4095   s.pending -= len;
4096   if (s.pending === 0) {
4097     s.pending_out = 0;
4098   }
4102 function flush_block_only (s, last) {
4103   trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
4104   s.block_start = s.strstart;
4105   flush_pending(s.strm);
4109 function put_byte(s, b) {
4110   s.pending_buf[s.pending++] = b;
4114 /* =========================================================================
4115  * Put a short in the pending buffer. The 16-bit value is put in MSB order.
4116  * IN assertion: the stream state is correct and there is enough room in
4117  * pending_buf.
4118  */
4119 function putShortMSB(s, b) {
4120 //  put_byte(s, (Byte)(b >> 8));
4121 //  put_byte(s, (Byte)(b & 0xff));
4122   s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
4123   s.pending_buf[s.pending++] = b & 0xff;
4127 /* ===========================================================================
4128  * Read a new buffer from the current input stream, update the adler32
4129  * and total number of bytes read.  All deflate() input goes through
4130  * this function so some applications may wish to modify it to avoid
4131  * allocating a large strm->input buffer and copying from it.
4132  * (See also flush_pending()).
4133  */
4134 function read_buf(strm, buf, start, size) {
4135   var len = strm.avail_in;
4137   if (len > size) { len = size; }
4138   if (len === 0) { return 0; }
4140   strm.avail_in -= len;
4142   utils.arraySet(buf, strm.input, strm.next_in, len, start);
4143   if (strm.state.wrap === 1) {
4144     strm.adler = adler32(strm.adler, buf, len, start);
4145   }
4147   else if (strm.state.wrap === 2) {
4148     strm.adler = crc32(strm.adler, buf, len, start);
4149   }
4151   strm.next_in += len;
4152   strm.total_in += len;
4154   return len;
4158 /* ===========================================================================
4159  * Set match_start to the longest match starting at the given string and
4160  * return its length. Matches shorter or equal to prev_length are discarded,
4161  * in which case the result is equal to prev_length and match_start is
4162  * garbage.
4163  * IN assertions: cur_match is the head of the hash chain for the current
4164  *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
4165  * OUT assertion: the match length is not greater than s->lookahead.
4166  */
4167 function longest_match(s, cur_match) {
4168   var chain_length = s.max_chain_length;      /* max hash chain length */
4169   var scan = s.strstart; /* current string */
4170   var match;                       /* matched string */
4171   var len;                           /* length of current match */
4172   var best_len = s.prev_length;              /* best match length so far */
4173   var nice_match = s.nice_match;             /* stop if match long enough */
4174   var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
4175       s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;
4177   var _win = s.window; // shortcut
4179   var wmask = s.w_mask;
4180   var prev  = s.prev;
4182   /* Stop when cur_match becomes <= limit. To simplify the code,
4183    * we prevent matches with the string of window index 0.
4184    */
4186   var strend = s.strstart + MAX_MATCH;
4187   var scan_end1  = _win[scan + best_len - 1];
4188   var scan_end   = _win[scan + best_len];
4190   /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
4191    * It is easy to get rid of this optimization if necessary.
4192    */
4193   // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
4195   /* Do not waste too much time if we already have a good match: */
4196   if (s.prev_length >= s.good_match) {
4197     chain_length >>= 2;
4198   }
4199   /* Do not look for matches beyond the end of the input. This is necessary
4200    * to make deflate deterministic.
4201    */
4202   if (nice_match > s.lookahead) { nice_match = s.lookahead; }
4204   // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
4206   do {
4207     // Assert(cur_match < s->strstart, "no future");
4208     match = cur_match;
4210     /* Skip to next match if the match length cannot increase
4211      * or if the match length is less than 2.  Note that the checks below
4212      * for insufficient lookahead only occur occasionally for performance
4213      * reasons.  Therefore uninitialized memory will be accessed, and
4214      * conditional jumps will be made that depend on those values.
4215      * However the length of the match is limited to the lookahead, so
4216      * the output of deflate is not affected by the uninitialized values.
4217      */
4219     if (_win[match + best_len]     !== scan_end  ||
4220         _win[match + best_len - 1] !== scan_end1 ||
4221         _win[match]                !== _win[scan] ||
4222         _win[++match]              !== _win[scan + 1]) {
4223       continue;
4224     }
4226     /* The check at best_len-1 can be removed because it will be made
4227      * again later. (This heuristic is not always a win.)
4228      * It is not necessary to compare scan[2] and match[2] since they
4229      * are always equal when the other bytes match, given that
4230      * the hash keys are equal and that HASH_BITS >= 8.
4231      */
4232     scan += 2;
4233     match++;
4234     // Assert(*scan == *match, "match[2]?");
4236     /* We check for insufficient lookahead only every 8th comparison;
4237      * the 256th check will be made at strstart+258.
4238      */
4239     do {
4240       /*jshint noempty:false*/
4241     } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
4242              _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
4243              _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
4244              _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
4245              scan < strend);
4247     // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
4249     len = MAX_MATCH - (strend - scan);
4250     scan = strend - MAX_MATCH;
4252     if (len > best_len) {
4253       s.match_start = cur_match;
4254       best_len = len;
4255       if (len >= nice_match) {
4256         break;
4257       }
4258       scan_end1  = _win[scan + best_len - 1];
4259       scan_end   = _win[scan + best_len];
4260     }
4261   } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
4263   if (best_len <= s.lookahead) {
4264     return best_len;
4265   }
4266   return s.lookahead;
4270 /* ===========================================================================
4271  * Fill the window when the lookahead becomes insufficient.
4272  * Updates strstart and lookahead.
4274  * IN assertion: lookahead < MIN_LOOKAHEAD
4275  * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
4276  *    At least one byte has been read, or avail_in == 0; reads are
4277  *    performed for at least two bytes (required for the zip translate_eol
4278  *    option -- not supported here).
4279  */
4280 function fill_window(s) {
4281   var _w_size = s.w_size;
4282   var p, n, m, more, str;
4284   //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
4286   do {
4287     more = s.window_size - s.lookahead - s.strstart;
4289     // JS ints have 32 bit, block below not needed
4290     /* Deal with !@#$% 64K limit: */
4291     //if (sizeof(int) <= 2) {
4292     //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
4293     //        more = wsize;
4294     //
4295     //  } else if (more == (unsigned)(-1)) {
4296     //        /* Very unlikely, but possible on 16 bit machine if
4297     //         * strstart == 0 && lookahead == 1 (input done a byte at time)
4298     //         */
4299     //        more--;
4300     //    }
4301     //}
4304     /* If the window is almost full and there is insufficient lookahead,
4305      * move the upper half to the lower one to make room in the upper half.
4306      */
4307     if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
4309       utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
4310       s.match_start -= _w_size;
4311       s.strstart -= _w_size;
4312       /* we now have strstart >= MAX_DIST */
4313       s.block_start -= _w_size;
4315       /* Slide the hash table (could be avoided with 32 bit values
4316        at the expense of memory usage). We slide even when level == 0
4317        to keep the hash table consistent if we switch back to level > 0
4318        later. (Using level 0 permanently is not an optimal usage of
4319        zlib, so we don't care about this pathological case.)
4320        */
4322       n = s.hash_size;
4323       p = n;
4324       do {
4325         m = s.head[--p];
4326         s.head[p] = (m >= _w_size ? m - _w_size : 0);
4327       } while (--n);
4329       n = _w_size;
4330       p = n;
4331       do {
4332         m = s.prev[--p];
4333         s.prev[p] = (m >= _w_size ? m - _w_size : 0);
4334         /* If n is not on any hash chain, prev[n] is garbage but
4335          * its value will never be used.
4336          */
4337       } while (--n);
4339       more += _w_size;
4340     }
4341     if (s.strm.avail_in === 0) {
4342       break;
4343     }
4345     /* If there was no sliding:
4346      *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
4347      *    more == window_size - lookahead - strstart
4348      * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
4349      * => more >= window_size - 2*WSIZE + 2
4350      * In the BIG_MEM or MMAP case (not yet supported),
4351      *   window_size == input_size + MIN_LOOKAHEAD  &&
4352      *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
4353      * Otherwise, window_size == 2*WSIZE so more >= 2.
4354      * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
4355      */
4356     //Assert(more >= 2, "more < 2");
4357     n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
4358     s.lookahead += n;
4360     /* Initialize the hash value now that we have some input: */
4361     if (s.lookahead + s.insert >= MIN_MATCH) {
4362       str = s.strstart - s.insert;
4363       s.ins_h = s.window[str];
4365       /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
4366       s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
4367 //#if MIN_MATCH != 3
4368 //        Call update_hash() MIN_MATCH-3 more times
4369 //#endif
4370       while (s.insert) {
4371         /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
4372         s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH-1]) & s.hash_mask;
4374         s.prev[str & s.w_mask] = s.head[s.ins_h];
4375         s.head[s.ins_h] = str;
4376         str++;
4377         s.insert--;
4378         if (s.lookahead + s.insert < MIN_MATCH) {
4379           break;
4380         }
4381       }
4382     }
4383     /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
4384      * but this is not important since only literal bytes will be emitted.
4385      */
4387   } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
4389   /* If the WIN_INIT bytes after the end of the current data have never been
4390    * written, then zero those bytes in order to avoid memory check reports of
4391    * the use of uninitialized (or uninitialised as Julian writes) bytes by
4392    * the longest match routines.  Update the high water mark for the next
4393    * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
4394    * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
4395    */
4396 //  if (s.high_water < s.window_size) {
4397 //    var curr = s.strstart + s.lookahead;
4398 //    var init = 0;
4400 //    if (s.high_water < curr) {
4401 //      /* Previous high water mark below current data -- zero WIN_INIT
4402 //       * bytes or up to end of window, whichever is less.
4403 //       */
4404 //      init = s.window_size - curr;
4405 //      if (init > WIN_INIT)
4406 //        init = WIN_INIT;
4407 //      zmemzero(s->window + curr, (unsigned)init);
4408 //      s->high_water = curr + init;
4409 //    }
4410 //    else if (s->high_water < (ulg)curr + WIN_INIT) {
4411 //      /* High water mark at or above current data, but below current data
4412 //       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
4413 //       * to end of window, whichever is less.
4414 //       */
4415 //      init = (ulg)curr + WIN_INIT - s->high_water;
4416 //      if (init > s->window_size - s->high_water)
4417 //        init = s->window_size - s->high_water;
4418 //      zmemzero(s->window + s->high_water, (unsigned)init);
4419 //      s->high_water += init;
4420 //    }
4421 //  }
4423 //  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
4424 //    "not enough room for search");
4427 /* ===========================================================================
4428  * Copy without compression as much as possible from the input stream, return
4429  * the current block state.
4430  * This function does not insert new strings in the dictionary since
4431  * uncompressible data is probably not useful. This function is used
4432  * only for the level=0 compression option.
4433  * NOTE: this function should be optimized to avoid extra copying from
4434  * window to pending_buf.
4435  */
4436 function deflate_stored(s, flush) {
4437   /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
4438    * to pending_buf_size, and each stored block has a 5 byte header:
4439    */
4440   var max_block_size = 0xffff;
4442   if (max_block_size > s.pending_buf_size - 5) {
4443     max_block_size = s.pending_buf_size - 5;
4444   }
4446   /* Copy as much as possible from input to output: */
4447   for (;;) {
4448     /* Fill the window as much as possible: */
4449     if (s.lookahead <= 1) {
4451       //Assert(s->strstart < s->w_size+MAX_DIST(s) ||
4452       //  s->block_start >= (long)s->w_size, "slide too late");
4453 //      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
4454 //        s.block_start >= s.w_size)) {
4455 //        throw  new Error("slide too late");
4456 //      }
4458       fill_window(s);
4459       if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
4460         return BS_NEED_MORE;
4461       }
4463       if (s.lookahead === 0) {
4464         break;
4465       }
4466       /* flush the current block */
4467     }
4468     //Assert(s->block_start >= 0L, "block gone");
4469 //    if (s.block_start < 0) throw new Error("block gone");
4471     s.strstart += s.lookahead;
4472     s.lookahead = 0;
4474     /* Emit a stored block if pending_buf will be full: */
4475     var max_start = s.block_start + max_block_size;
4477     if (s.strstart === 0 || s.strstart >= max_start) {
4478       /* strstart == 0 is possible when wraparound on 16-bit machine */
4479       s.lookahead = s.strstart - max_start;
4480       s.strstart = max_start;
4481       /*** FLUSH_BLOCK(s, 0); ***/
4482       flush_block_only(s, false);
4483       if (s.strm.avail_out === 0) {
4484         return BS_NEED_MORE;
4485       }
4486       /***/
4489     }
4490     /* Flush if we may have to slide, otherwise block_start may become
4491      * negative and the data will be gone:
4492      */
4493     if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
4494       /*** FLUSH_BLOCK(s, 0); ***/
4495       flush_block_only(s, false);
4496       if (s.strm.avail_out === 0) {
4497         return BS_NEED_MORE;
4498       }
4499       /***/
4500     }
4501   }
4503   s.insert = 0;
4505   if (flush === Z_FINISH) {
4506     /*** FLUSH_BLOCK(s, 1); ***/
4507     flush_block_only(s, true);
4508     if (s.strm.avail_out === 0) {
4509       return BS_FINISH_STARTED;
4510     }
4511     /***/
4512     return BS_FINISH_DONE;
4513   }
4515   if (s.strstart > s.block_start) {
4516     /*** FLUSH_BLOCK(s, 0); ***/
4517     flush_block_only(s, false);
4518     if (s.strm.avail_out === 0) {
4519       return BS_NEED_MORE;
4520     }
4521     /***/
4522   }
4524   return BS_NEED_MORE;
4527 /* ===========================================================================
4528  * Compress as much as possible from the input stream, return the current
4529  * block state.
4530  * This function does not perform lazy evaluation of matches and inserts
4531  * new strings in the dictionary only for unmatched strings or for short
4532  * matches. It is used only for the fast compression options.
4533  */
4534 function deflate_fast(s, flush) {
4535   var hash_head;        /* head of the hash chain */
4536   var bflush;           /* set if current block must be flushed */
4538   for (;;) {
4539     /* Make sure that we always have enough lookahead, except
4540      * at the end of the input file. We need MAX_MATCH bytes
4541      * for the next match, plus MIN_MATCH bytes to insert the
4542      * string following the next match.
4543      */
4544     if (s.lookahead < MIN_LOOKAHEAD) {
4545       fill_window(s);
4546       if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
4547         return BS_NEED_MORE;
4548       }
4549       if (s.lookahead === 0) {
4550         break; /* flush the current block */
4551       }
4552     }
4554     /* Insert the string window[strstart .. strstart+2] in the
4555      * dictionary, and set hash_head to the head of the hash chain:
4556      */
4557     hash_head = 0/*NIL*/;
4558     if (s.lookahead >= MIN_MATCH) {
4559       /*** INSERT_STRING(s, s.strstart, hash_head); ***/
4560       s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
4561       hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
4562       s.head[s.ins_h] = s.strstart;
4563       /***/
4564     }
4566     /* Find the longest match, discarding those <= prev_length.
4567      * At this point we have always match_length < MIN_MATCH
4568      */
4569     if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
4570       /* To simplify the code, we prevent matches with the string
4571        * of window index 0 (in particular we have to avoid a match
4572        * of the string with itself at the start of the input file).
4573        */
4574       s.match_length = longest_match(s, hash_head);
4575       /* longest_match() sets match_start */
4576     }
4577     if (s.match_length >= MIN_MATCH) {
4578       // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
4580       /*** _tr_tally_dist(s, s.strstart - s.match_start,
4581                      s.match_length - MIN_MATCH, bflush); ***/
4582       bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);
4584       s.lookahead -= s.match_length;
4586       /* Insert new strings in the hash table only if the match length
4587        * is not too large. This saves time but degrades compression.
4588        */
4589       if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {
4590         s.match_length--; /* string at strstart already in table */
4591         do {
4592           s.strstart++;
4593           /*** INSERT_STRING(s, s.strstart, hash_head); ***/
4594           s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
4595           hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
4596           s.head[s.ins_h] = s.strstart;
4597           /***/
4598           /* strstart never exceeds WSIZE-MAX_MATCH, so there are
4599            * always MIN_MATCH bytes ahead.
4600            */
4601         } while (--s.match_length !== 0);
4602         s.strstart++;
4603       } else
4604       {
4605         s.strstart += s.match_length;
4606         s.match_length = 0;
4607         s.ins_h = s.window[s.strstart];
4608         /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
4609         s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;
4611 //#if MIN_MATCH != 3
4612 //                Call UPDATE_HASH() MIN_MATCH-3 more times
4613 //#endif
4614         /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
4615          * matter since it will be recomputed at next deflate call.
4616          */
4617       }
4618     } else {
4619       /* No match, output a literal byte */
4620       //Tracevv((stderr,"%c", s.window[s.strstart]));
4621       /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
4622       bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
4624       s.lookahead--;
4625       s.strstart++;
4626     }
4627     if (bflush) {
4628       /*** FLUSH_BLOCK(s, 0); ***/
4629       flush_block_only(s, false);
4630       if (s.strm.avail_out === 0) {
4631         return BS_NEED_MORE;
4632       }
4633       /***/
4634     }
4635   }
4636   s.insert = ((s.strstart < (MIN_MATCH-1)) ? s.strstart : MIN_MATCH-1);
4637   if (flush === Z_FINISH) {
4638     /*** FLUSH_BLOCK(s, 1); ***/
4639     flush_block_only(s, true);
4640     if (s.strm.avail_out === 0) {
4641       return BS_FINISH_STARTED;
4642     }
4643     /***/
4644     return BS_FINISH_DONE;
4645   }
4646   if (s.last_lit) {
4647     /*** FLUSH_BLOCK(s, 0); ***/
4648     flush_block_only(s, false);
4649     if (s.strm.avail_out === 0) {
4650       return BS_NEED_MORE;
4651     }
4652     /***/
4653   }
4654   return BS_BLOCK_DONE;
4657 /* ===========================================================================
4658  * Same as above, but achieves better compression. We use a lazy
4659  * evaluation for matches: a match is finally adopted only if there is
4660  * no better match at the next window position.
4661  */
4662 function deflate_slow(s, flush) {
4663   var hash_head;          /* head of hash chain */
4664   var bflush;              /* set if current block must be flushed */
4666   var max_insert;
4668   /* Process the input block. */
4669   for (;;) {
4670     /* Make sure that we always have enough lookahead, except
4671      * at the end of the input file. We need MAX_MATCH bytes
4672      * for the next match, plus MIN_MATCH bytes to insert the
4673      * string following the next match.
4674      */
4675     if (s.lookahead < MIN_LOOKAHEAD) {
4676       fill_window(s);
4677       if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
4678         return BS_NEED_MORE;
4679       }
4680       if (s.lookahead === 0) { break; } /* flush the current block */
4681     }
4683     /* Insert the string window[strstart .. strstart+2] in the
4684      * dictionary, and set hash_head to the head of the hash chain:
4685      */
4686     hash_head = 0/*NIL*/;
4687     if (s.lookahead >= MIN_MATCH) {
4688       /*** INSERT_STRING(s, s.strstart, hash_head); ***/
4689       s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
4690       hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
4691       s.head[s.ins_h] = s.strstart;
4692       /***/
4693     }
4695     /* Find the longest match, discarding those <= prev_length.
4696      */
4697     s.prev_length = s.match_length;
4698     s.prev_match = s.match_start;
4699     s.match_length = MIN_MATCH-1;
4701     if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
4702         s.strstart - hash_head <= (s.w_size-MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
4703       /* To simplify the code, we prevent matches with the string
4704        * of window index 0 (in particular we have to avoid a match
4705        * of the string with itself at the start of the input file).
4706        */
4707       s.match_length = longest_match(s, hash_head);
4708       /* longest_match() sets match_start */
4710       if (s.match_length <= 5 &&
4711          (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
4713         /* If prev_match is also MIN_MATCH, match_start is garbage
4714          * but we will ignore the current match anyway.
4715          */
4716         s.match_length = MIN_MATCH-1;
4717       }
4718     }
4719     /* If there was a match at the previous step and the current
4720      * match is not better, output the previous match:
4721      */
4722     if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
4723       max_insert = s.strstart + s.lookahead - MIN_MATCH;
4724       /* Do not insert strings in hash table beyond this. */
4726       //check_match(s, s.strstart-1, s.prev_match, s.prev_length);
4728       /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
4729                      s.prev_length - MIN_MATCH, bflush);***/
4730       bflush = trees._tr_tally(s, s.strstart - 1- s.prev_match, s.prev_length - MIN_MATCH);
4731       /* Insert in hash table all strings up to the end of the match.
4732        * strstart-1 and strstart are already inserted. If there is not
4733        * enough lookahead, the last two strings are not inserted in
4734        * the hash table.
4735        */
4736       s.lookahead -= s.prev_length-1;
4737       s.prev_length -= 2;
4738       do {
4739         if (++s.strstart <= max_insert) {
4740           /*** INSERT_STRING(s, s.strstart, hash_head); ***/
4741           s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
4742           hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
4743           s.head[s.ins_h] = s.strstart;
4744           /***/
4745         }
4746       } while (--s.prev_length !== 0);
4747       s.match_available = 0;
4748       s.match_length = MIN_MATCH-1;
4749       s.strstart++;
4751       if (bflush) {
4752         /*** FLUSH_BLOCK(s, 0); ***/
4753         flush_block_only(s, false);
4754         if (s.strm.avail_out === 0) {
4755           return BS_NEED_MORE;
4756         }
4757         /***/
4758       }
4760     } else if (s.match_available) {
4761       /* If there was no match at the previous position, output a
4762        * single literal. If there was a match but the current match
4763        * is longer, truncate the previous match to a single literal.
4764        */
4765       //Tracevv((stderr,"%c", s->window[s->strstart-1]));
4766       /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
4767       bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);
4769       if (bflush) {
4770         /*** FLUSH_BLOCK_ONLY(s, 0) ***/
4771         flush_block_only(s, false);
4772         /***/
4773       }
4774       s.strstart++;
4775       s.lookahead--;
4776       if (s.strm.avail_out === 0) {
4777         return BS_NEED_MORE;
4778       }
4779     } else {
4780       /* There is no previous match to compare with, wait for
4781        * the next step to decide.
4782        */
4783       s.match_available = 1;
4784       s.strstart++;
4785       s.lookahead--;
4786     }
4787   }
4788   //Assert (flush != Z_NO_FLUSH, "no flush?");
4789   if (s.match_available) {
4790     //Tracevv((stderr,"%c", s->window[s->strstart-1]));
4791     /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
4792     bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);
4794     s.match_available = 0;
4795   }
4796   s.insert = s.strstart < MIN_MATCH-1 ? s.strstart : MIN_MATCH-1;
4797   if (flush === Z_FINISH) {
4798     /*** FLUSH_BLOCK(s, 1); ***/
4799     flush_block_only(s, true);
4800     if (s.strm.avail_out === 0) {
4801       return BS_FINISH_STARTED;
4802     }
4803     /***/
4804     return BS_FINISH_DONE;
4805   }
4806   if (s.last_lit) {
4807     /*** FLUSH_BLOCK(s, 0); ***/
4808     flush_block_only(s, false);
4809     if (s.strm.avail_out === 0) {
4810       return BS_NEED_MORE;
4811     }
4812     /***/
4813   }
4815   return BS_BLOCK_DONE;
4819 /* ===========================================================================
4820  * For Z_RLE, simply look for runs of bytes, generate matches only of distance
4821  * one.  Do not maintain a hash table.  (It will be regenerated if this run of
4822  * deflate switches away from Z_RLE.)
4823  */
4824 function deflate_rle(s, flush) {
4825   var bflush;            /* set if current block must be flushed */
4826   var prev;              /* byte at distance one to match */
4827   var scan, strend;      /* scan goes up to strend for length of run */
4829   var _win = s.window;
4831   for (;;) {
4832     /* Make sure that we always have enough lookahead, except
4833      * at the end of the input file. We need MAX_MATCH bytes
4834      * for the longest run, plus one for the unrolled loop.
4835      */
4836     if (s.lookahead <= MAX_MATCH) {
4837       fill_window(s);
4838       if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
4839         return BS_NEED_MORE;
4840       }
4841       if (s.lookahead === 0) { break; } /* flush the current block */
4842     }
4844     /* See how many times the previous byte repeats */
4845     s.match_length = 0;
4846     if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
4847       scan = s.strstart - 1;
4848       prev = _win[scan];
4849       if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
4850         strend = s.strstart + MAX_MATCH;
4851         do {
4852           /*jshint noempty:false*/
4853         } while (prev === _win[++scan] && prev === _win[++scan] &&
4854                  prev === _win[++scan] && prev === _win[++scan] &&
4855                  prev === _win[++scan] && prev === _win[++scan] &&
4856                  prev === _win[++scan] && prev === _win[++scan] &&
4857                  scan < strend);
4858         s.match_length = MAX_MATCH - (strend - scan);
4859         if (s.match_length > s.lookahead) {
4860           s.match_length = s.lookahead;
4861         }
4862       }
4863       //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
4864     }
4866     /* Emit match if have run of MIN_MATCH or longer, else emit literal */
4867     if (s.match_length >= MIN_MATCH) {
4868       //check_match(s, s.strstart, s.strstart - 1, s.match_length);
4870       /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
4871       bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);
4873       s.lookahead -= s.match_length;
4874       s.strstart += s.match_length;
4875       s.match_length = 0;
4876     } else {
4877       /* No match, output a literal byte */
4878       //Tracevv((stderr,"%c", s->window[s->strstart]));
4879       /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
4880       bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
4882       s.lookahead--;
4883       s.strstart++;
4884     }
4885     if (bflush) {
4886       /*** FLUSH_BLOCK(s, 0); ***/
4887       flush_block_only(s, false);
4888       if (s.strm.avail_out === 0) {
4889         return BS_NEED_MORE;
4890       }
4891       /***/
4892     }
4893   }
4894   s.insert = 0;
4895   if (flush === Z_FINISH) {
4896     /*** FLUSH_BLOCK(s, 1); ***/
4897     flush_block_only(s, true);
4898     if (s.strm.avail_out === 0) {
4899       return BS_FINISH_STARTED;
4900     }
4901     /***/
4902     return BS_FINISH_DONE;
4903   }
4904   if (s.last_lit) {
4905     /*** FLUSH_BLOCK(s, 0); ***/
4906     flush_block_only(s, false);
4907     if (s.strm.avail_out === 0) {
4908       return BS_NEED_MORE;
4909     }
4910     /***/
4911   }
4912   return BS_BLOCK_DONE;
4915 /* ===========================================================================
4916  * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.
4917  * (It will be regenerated if this run of deflate switches away from Huffman.)
4918  */
4919 function deflate_huff(s, flush) {
4920   var bflush;             /* set if current block must be flushed */
4922   for (;;) {
4923     /* Make sure that we have a literal to write. */
4924     if (s.lookahead === 0) {
4925       fill_window(s);
4926       if (s.lookahead === 0) {
4927         if (flush === Z_NO_FLUSH) {
4928           return BS_NEED_MORE;
4929         }
4930         break;      /* flush the current block */
4931       }
4932     }
4934     /* Output a literal byte */
4935     s.match_length = 0;
4936     //Tracevv((stderr,"%c", s->window[s->strstart]));
4937     /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
4938     bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
4939     s.lookahead--;
4940     s.strstart++;
4941     if (bflush) {
4942       /*** FLUSH_BLOCK(s, 0); ***/
4943       flush_block_only(s, false);
4944       if (s.strm.avail_out === 0) {
4945         return BS_NEED_MORE;
4946       }
4947       /***/
4948     }
4949   }
4950   s.insert = 0;
4951   if (flush === Z_FINISH) {
4952     /*** FLUSH_BLOCK(s, 1); ***/
4953     flush_block_only(s, true);
4954     if (s.strm.avail_out === 0) {
4955       return BS_FINISH_STARTED;
4956     }
4957     /***/
4958     return BS_FINISH_DONE;
4959   }
4960   if (s.last_lit) {
4961     /*** FLUSH_BLOCK(s, 0); ***/
4962     flush_block_only(s, false);
4963     if (s.strm.avail_out === 0) {
4964       return BS_NEED_MORE;
4965     }
4966     /***/
4967   }
4968   return BS_BLOCK_DONE;
4971 /* Values for max_lazy_match, good_match and max_chain_length, depending on
4972  * the desired pack level (0..9). The values given below have been tuned to
4973  * exclude worst case performance for pathological files. Better values may be
4974  * found for specific files.
4975  */
4976 var Config = function (good_length, max_lazy, nice_length, max_chain, func) {
4977   this.good_length = good_length;
4978   this.max_lazy = max_lazy;
4979   this.nice_length = nice_length;
4980   this.max_chain = max_chain;
4981   this.func = func;
4984 var configuration_table;
4986 configuration_table = [
4987   /*      good lazy nice chain */
4988   new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */
4989   new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */
4990   new Config(4, 5, 16, 8, deflate_fast),           /* 2 */
4991   new Config(4, 6, 32, 32, deflate_fast),          /* 3 */
4993   new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */
4994   new Config(8, 16, 32, 32, deflate_slow),         /* 5 */
4995   new Config(8, 16, 128, 128, deflate_slow),       /* 6 */
4996   new Config(8, 32, 128, 256, deflate_slow),       /* 7 */
4997   new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */
4998   new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */
5002 /* ===========================================================================
5003  * Initialize the "longest match" routines for a new zlib stream
5004  */
5005 function lm_init(s) {
5006   s.window_size = 2 * s.w_size;
5008   /*** CLEAR_HASH(s); ***/
5009   zero(s.head); // Fill with NIL (= 0);
5011   /* Set the default configuration parameters:
5012    */
5013   s.max_lazy_match = configuration_table[s.level].max_lazy;
5014   s.good_match = configuration_table[s.level].good_length;
5015   s.nice_match = configuration_table[s.level].nice_length;
5016   s.max_chain_length = configuration_table[s.level].max_chain;
5018   s.strstart = 0;
5019   s.block_start = 0;
5020   s.lookahead = 0;
5021   s.insert = 0;
5022   s.match_length = s.prev_length = MIN_MATCH - 1;
5023   s.match_available = 0;
5024   s.ins_h = 0;
5028 function DeflateState() {
5029   this.strm = null;            /* pointer back to this zlib stream */
5030   this.status = 0;            /* as the name implies */
5031   this.pending_buf = null;      /* output still pending */
5032   this.pending_buf_size = 0;  /* size of pending_buf */
5033   this.pending_out = 0;       /* next pending byte to output to the stream */
5034   this.pending = 0;           /* nb of bytes in the pending buffer */
5035   this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
5036   this.gzhead = null;         /* gzip header information to write */
5037   this.gzindex = 0;           /* where in extra, name, or comment */
5038   this.method = Z_DEFLATED; /* can only be DEFLATED */
5039   this.last_flush = -1;   /* value of flush param for previous deflate call */
5041   this.w_size = 0;  /* LZ77 window size (32K by default) */
5042   this.w_bits = 0;  /* log2(w_size)  (8..16) */
5043   this.w_mask = 0;  /* w_size - 1 */
5045   this.window = null;
5046   /* Sliding window. Input bytes are read into the second half of the window,
5047    * and move to the first half later to keep a dictionary of at least wSize
5048    * bytes. With this organization, matches are limited to a distance of
5049    * wSize-MAX_MATCH bytes, but this ensures that IO is always
5050    * performed with a length multiple of the block size.
5051    */
5053   this.window_size = 0;
5054   /* Actual size of window: 2*wSize, except when the user input buffer
5055    * is directly used as sliding window.
5056    */
5058   this.prev = null;
5059   /* Link to older string with same hash index. To limit the size of this
5060    * array to 64K, this link is maintained only for the last 32K strings.
5061    * An index in this array is thus a window index modulo 32K.
5062    */
5064   this.head = null;   /* Heads of the hash chains or NIL. */
5066   this.ins_h = 0;       /* hash index of string to be inserted */
5067   this.hash_size = 0;   /* number of elements in hash table */
5068   this.hash_bits = 0;   /* log2(hash_size) */
5069   this.hash_mask = 0;   /* hash_size-1 */
5071   this.hash_shift = 0;
5072   /* Number of bits by which ins_h must be shifted at each input
5073    * step. It must be such that after MIN_MATCH steps, the oldest
5074    * byte no longer takes part in the hash key, that is:
5075    *   hash_shift * MIN_MATCH >= hash_bits
5076    */
5078   this.block_start = 0;
5079   /* Window position at the beginning of the current output block. Gets
5080    * negative when the window is moved backwards.
5081    */
5083   this.match_length = 0;      /* length of best match */
5084   this.prev_match = 0;        /* previous match */
5085   this.match_available = 0;   /* set if previous match exists */
5086   this.strstart = 0;          /* start of string to insert */
5087   this.match_start = 0;       /* start of matching string */
5088   this.lookahead = 0;         /* number of valid bytes ahead in window */
5090   this.prev_length = 0;
5091   /* Length of the best match at previous step. Matches not greater than this
5092    * are discarded. This is used in the lazy match evaluation.
5093    */
5095   this.max_chain_length = 0;
5096   /* To speed up deflation, hash chains are never searched beyond this
5097    * length.  A higher limit improves compression ratio but degrades the
5098    * speed.
5099    */
5101   this.max_lazy_match = 0;
5102   /* Attempt to find a better match only when the current match is strictly
5103    * smaller than this value. This mechanism is used only for compression
5104    * levels >= 4.
5105    */
5106   // That's alias to max_lazy_match, don't use directly
5107   //this.max_insert_length = 0;
5108   /* Insert new strings in the hash table only if the match length is not
5109    * greater than this length. This saves time but degrades compression.
5110    * max_insert_length is used only for compression levels <= 3.
5111    */
5113   this.level = 0;     /* compression level (1..9) */
5114   this.strategy = 0;  /* favor or force Huffman coding*/
5116   this.good_match = 0;
5117   /* Use a faster search when the previous match is longer than this */
5119   this.nice_match = 0; /* Stop searching when current match exceeds this */
5121               /* used by trees.c: */
5123   /* Didn't use ct_data typedef below to suppress compiler warning */
5125   // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
5126   // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
5127   // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */
5129   // Use flat array of DOUBLE size, with interleaved fata,
5130   // because JS does not support effective
5131   this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);
5132   this.dyn_dtree  = new utils.Buf16((2*D_CODES+1) * 2);
5133   this.bl_tree    = new utils.Buf16((2*BL_CODES+1) * 2);
5134   zero(this.dyn_ltree);
5135   zero(this.dyn_dtree);
5136   zero(this.bl_tree);
5138   this.l_desc   = null;         /* desc. for literal tree */
5139   this.d_desc   = null;         /* desc. for distance tree */
5140   this.bl_desc  = null;         /* desc. for bit length tree */
5142   //ush bl_count[MAX_BITS+1];
5143   this.bl_count = new utils.Buf16(MAX_BITS+1);
5144   /* number of codes at each bit length for an optimal tree */
5146   //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
5147   this.heap = new utils.Buf16(2*L_CODES+1);  /* heap used to build the Huffman trees */
5148   zero(this.heap);
5150   this.heap_len = 0;               /* number of elements in the heap */
5151   this.heap_max = 0;               /* element of largest frequency */
5152   /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
5153    * The same heap array is used to build all trees.
5154    */
5156   this.depth = new utils.Buf16(2*L_CODES+1); //uch depth[2*L_CODES+1];
5157   zero(this.depth);
5158   /* Depth of each subtree used as tie breaker for trees of equal frequency
5159    */
5161   this.l_buf = 0;          /* buffer index for literals or lengths */
5163   this.lit_bufsize = 0;
5164   /* Size of match buffer for literals/lengths.  There are 4 reasons for
5165    * limiting lit_bufsize to 64K:
5166    *   - frequencies can be kept in 16 bit counters
5167    *   - if compression is not successful for the first block, all input
5168    *     data is still in the window so we can still emit a stored block even
5169    *     when input comes from standard input.  (This can also be done for
5170    *     all blocks if lit_bufsize is not greater than 32K.)
5171    *   - if compression is not successful for a file smaller than 64K, we can
5172    *     even emit a stored file instead of a stored block (saving 5 bytes).
5173    *     This is applicable only for zip (not gzip or zlib).
5174    *   - creating new Huffman trees less frequently may not provide fast
5175    *     adaptation to changes in the input data statistics. (Take for
5176    *     example a binary file with poorly compressible code followed by
5177    *     a highly compressible string table.) Smaller buffer sizes give
5178    *     fast adaptation but have of course the overhead of transmitting
5179    *     trees more frequently.
5180    *   - I can't count above 4
5181    */
5183   this.last_lit = 0;      /* running index in l_buf */
5185   this.d_buf = 0;
5186   /* Buffer index for distances. To simplify the code, d_buf and l_buf have
5187    * the same number of elements. To use different lengths, an extra flag
5188    * array would be necessary.
5189    */
5191   this.opt_len = 0;       /* bit length of current block with optimal trees */
5192   this.static_len = 0;    /* bit length of current block with static trees */
5193   this.matches = 0;       /* number of string matches in current block */
5194   this.insert = 0;        /* bytes at end of window left to insert */
5197   this.bi_buf = 0;
5198   /* Output buffer. bits are inserted starting at the bottom (least
5199    * significant bits).
5200    */
5201   this.bi_valid = 0;
5202   /* Number of valid bits in bi_buf.  All bits above the last valid bit
5203    * are always zero.
5204    */
5206   // Used for window memory init. We safely ignore it for JS. That makes
5207   // sense only for pointers and memory check tools.
5208   //this.high_water = 0;
5209   /* High water mark offset in window for initialized bytes -- bytes above
5210    * this are set to zero in order to avoid memory check warnings when
5211    * longest match routines access bytes past the input.  This is then
5212    * updated to the new high water mark.
5213    */
5217 function deflateResetKeep(strm) {
5218   var s;
5220   if (!strm || !strm.state) {
5221     return err(strm, Z_STREAM_ERROR);
5222   }
5224   strm.total_in = strm.total_out = 0;
5225   strm.data_type = Z_UNKNOWN;
5227   s = strm.state;
5228   s.pending = 0;
5229   s.pending_out = 0;
5231   if (s.wrap < 0) {
5232     s.wrap = -s.wrap;
5233     /* was made negative by deflate(..., Z_FINISH); */
5234   }
5235   s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
5236   strm.adler = (s.wrap === 2) ?
5237     0  // crc32(0, Z_NULL, 0)
5238   :
5239     1; // adler32(0, Z_NULL, 0)
5240   s.last_flush = Z_NO_FLUSH;
5241   trees._tr_init(s);
5242   return Z_OK;
5246 function deflateReset(strm) {
5247   var ret = deflateResetKeep(strm);
5248   if (ret === Z_OK) {
5249     lm_init(strm.state);
5250   }
5251   return ret;
5255 function deflateSetHeader(strm, head) {
5256   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
5257   if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
5258   strm.state.gzhead = head;
5259   return Z_OK;
5263 function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
5264   if (!strm) { // === Z_NULL
5265     return Z_STREAM_ERROR;
5266   }
5267   var wrap = 1;
5269   if (level === Z_DEFAULT_COMPRESSION) {
5270     level = 6;
5271   }
5273   if (windowBits < 0) { /* suppress zlib wrapper */
5274     wrap = 0;
5275     windowBits = -windowBits;
5276   }
5278   else if (windowBits > 15) {
5279     wrap = 2;           /* write gzip wrapper instead */
5280     windowBits -= 16;
5281   }
5284   if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
5285     windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
5286     strategy < 0 || strategy > Z_FIXED) {
5287     return err(strm, Z_STREAM_ERROR);
5288   }
5291   if (windowBits === 8) {
5292     windowBits = 9;
5293   }
5294   /* until 256-byte window bug fixed */
5296   var s = new DeflateState();
5298   strm.state = s;
5299   s.strm = strm;
5301   s.wrap = wrap;
5302   s.gzhead = null;
5303   s.w_bits = windowBits;
5304   s.w_size = 1 << s.w_bits;
5305   s.w_mask = s.w_size - 1;
5307   s.hash_bits = memLevel + 7;
5308   s.hash_size = 1 << s.hash_bits;
5309   s.hash_mask = s.hash_size - 1;
5310   s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
5312   s.window = new utils.Buf8(s.w_size * 2);
5313   s.head = new utils.Buf16(s.hash_size);
5314   s.prev = new utils.Buf16(s.w_size);
5316   // Don't need mem init magic for JS.
5317   //s.high_water = 0;  /* nothing written to s->window yet */
5319   s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
5321   s.pending_buf_size = s.lit_bufsize * 4;
5322   s.pending_buf = new utils.Buf8(s.pending_buf_size);
5324   s.d_buf = s.lit_bufsize >> 1;
5325   s.l_buf = (1 + 2) * s.lit_bufsize;
5327   s.level = level;
5328   s.strategy = strategy;
5329   s.method = method;
5331   return deflateReset(strm);
5334 function deflateInit(strm, level) {
5335   return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
5339 function deflate(strm, flush) {
5340   var old_flush, s;
5341   var beg, val; // for gzip header write only
5343   if (!strm || !strm.state ||
5344     flush > Z_BLOCK || flush < 0) {
5345     return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
5346   }
5348   s = strm.state;
5350   if (!strm.output ||
5351       (!strm.input && strm.avail_in !== 0) ||
5352       (s.status === FINISH_STATE && flush !== Z_FINISH)) {
5353     return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
5354   }
5356   s.strm = strm; /* just in case */
5357   old_flush = s.last_flush;
5358   s.last_flush = flush;
5360   /* Write the header */
5361   if (s.status === INIT_STATE) {
5363     if (s.wrap === 2) { // GZIP header
5364       strm.adler = 0;  //crc32(0L, Z_NULL, 0);
5365       put_byte(s, 31);
5366       put_byte(s, 139);
5367       put_byte(s, 8);
5368       if (!s.gzhead) { // s->gzhead == Z_NULL
5369         put_byte(s, 0);
5370         put_byte(s, 0);
5371         put_byte(s, 0);
5372         put_byte(s, 0);
5373         put_byte(s, 0);
5374         put_byte(s, s.level === 9 ? 2 :
5375                     (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
5376                      4 : 0));
5377         put_byte(s, OS_CODE);
5378         s.status = BUSY_STATE;
5379       }
5380       else {
5381         put_byte(s, (s.gzhead.text ? 1 : 0) +
5382                     (s.gzhead.hcrc ? 2 : 0) +
5383                     (!s.gzhead.extra ? 0 : 4) +
5384                     (!s.gzhead.name ? 0 : 8) +
5385                     (!s.gzhead.comment ? 0 : 16)
5386                 );
5387         put_byte(s, s.gzhead.time & 0xff);
5388         put_byte(s, (s.gzhead.time >> 8) & 0xff);
5389         put_byte(s, (s.gzhead.time >> 16) & 0xff);
5390         put_byte(s, (s.gzhead.time >> 24) & 0xff);
5391         put_byte(s, s.level === 9 ? 2 :
5392                     (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
5393                      4 : 0));
5394         put_byte(s, s.gzhead.os & 0xff);
5395         if (s.gzhead.extra && s.gzhead.extra.length) {
5396           put_byte(s, s.gzhead.extra.length & 0xff);
5397           put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
5398         }
5399         if (s.gzhead.hcrc) {
5400           strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
5401         }
5402         s.gzindex = 0;
5403         s.status = EXTRA_STATE;
5404       }
5405     }
5406     else // DEFLATE header
5407     {
5408       var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
5409       var level_flags = -1;
5411       if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
5412         level_flags = 0;
5413       } else if (s.level < 6) {
5414         level_flags = 1;
5415       } else if (s.level === 6) {
5416         level_flags = 2;
5417       } else {
5418         level_flags = 3;
5419       }
5420       header |= (level_flags << 6);
5421       if (s.strstart !== 0) { header |= PRESET_DICT; }
5422       header += 31 - (header % 31);
5424       s.status = BUSY_STATE;
5425       putShortMSB(s, header);
5427       /* Save the adler32 of the preset dictionary: */
5428       if (s.strstart !== 0) {
5429         putShortMSB(s, strm.adler >>> 16);
5430         putShortMSB(s, strm.adler & 0xffff);
5431       }
5432       strm.adler = 1; // adler32(0L, Z_NULL, 0);
5433     }
5434   }
5436 //#ifdef GZIP
5437   if (s.status === EXTRA_STATE) {
5438     if (s.gzhead.extra/* != Z_NULL*/) {
5439       beg = s.pending;  /* start of bytes to update crc */
5441       while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
5442         if (s.pending === s.pending_buf_size) {
5443           if (s.gzhead.hcrc && s.pending > beg) {
5444             strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5445           }
5446           flush_pending(strm);
5447           beg = s.pending;
5448           if (s.pending === s.pending_buf_size) {
5449             break;
5450           }
5451         }
5452         put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
5453         s.gzindex++;
5454       }
5455       if (s.gzhead.hcrc && s.pending > beg) {
5456         strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5457       }
5458       if (s.gzindex === s.gzhead.extra.length) {
5459         s.gzindex = 0;
5460         s.status = NAME_STATE;
5461       }
5462     }
5463     else {
5464       s.status = NAME_STATE;
5465     }
5466   }
5467   if (s.status === NAME_STATE) {
5468     if (s.gzhead.name/* != Z_NULL*/) {
5469       beg = s.pending;  /* start of bytes to update crc */
5470       //int val;
5472       do {
5473         if (s.pending === s.pending_buf_size) {
5474           if (s.gzhead.hcrc && s.pending > beg) {
5475             strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5476           }
5477           flush_pending(strm);
5478           beg = s.pending;
5479           if (s.pending === s.pending_buf_size) {
5480             val = 1;
5481             break;
5482           }
5483         }
5484         // JS specific: little magic to add zero terminator to end of string
5485         if (s.gzindex < s.gzhead.name.length) {
5486           val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
5487         } else {
5488           val = 0;
5489         }
5490         put_byte(s, val);
5491       } while (val !== 0);
5493       if (s.gzhead.hcrc && s.pending > beg){
5494         strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5495       }
5496       if (val === 0) {
5497         s.gzindex = 0;
5498         s.status = COMMENT_STATE;
5499       }
5500     }
5501     else {
5502       s.status = COMMENT_STATE;
5503     }
5504   }
5505   if (s.status === COMMENT_STATE) {
5506     if (s.gzhead.comment/* != Z_NULL*/) {
5507       beg = s.pending;  /* start of bytes to update crc */
5508       //int val;
5510       do {
5511         if (s.pending === s.pending_buf_size) {
5512           if (s.gzhead.hcrc && s.pending > beg) {
5513             strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5514           }
5515           flush_pending(strm);
5516           beg = s.pending;
5517           if (s.pending === s.pending_buf_size) {
5518             val = 1;
5519             break;
5520           }
5521         }
5522         // JS specific: little magic to add zero terminator to end of string
5523         if (s.gzindex < s.gzhead.comment.length) {
5524           val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
5525         } else {
5526           val = 0;
5527         }
5528         put_byte(s, val);
5529       } while (val !== 0);
5531       if (s.gzhead.hcrc && s.pending > beg) {
5532         strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5533       }
5534       if (val === 0) {
5535         s.status = HCRC_STATE;
5536       }
5537     }
5538     else {
5539       s.status = HCRC_STATE;
5540     }
5541   }
5542   if (s.status === HCRC_STATE) {
5543     if (s.gzhead.hcrc) {
5544       if (s.pending + 2 > s.pending_buf_size) {
5545         flush_pending(strm);
5546       }
5547       if (s.pending + 2 <= s.pending_buf_size) {
5548         put_byte(s, strm.adler & 0xff);
5549         put_byte(s, (strm.adler >> 8) & 0xff);
5550         strm.adler = 0; //crc32(0L, Z_NULL, 0);
5551         s.status = BUSY_STATE;
5552       }
5553     }
5554     else {
5555       s.status = BUSY_STATE;
5556     }
5557   }
5558 //#endif
5560   /* Flush as much pending output as possible */
5561   if (s.pending !== 0) {
5562     flush_pending(strm);
5563     if (strm.avail_out === 0) {
5564       /* Since avail_out is 0, deflate will be called again with
5565        * more output space, but possibly with both pending and
5566        * avail_in equal to zero. There won't be anything to do,
5567        * but this is not an error situation so make sure we
5568        * return OK instead of BUF_ERROR at next call of deflate:
5569        */
5570       s.last_flush = -1;
5571       return Z_OK;
5572     }
5574     /* Make sure there is something to do and avoid duplicate consecutive
5575      * flushes. For repeated and useless calls with Z_FINISH, we keep
5576      * returning Z_STREAM_END instead of Z_BUF_ERROR.
5577      */
5578   } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
5579     flush !== Z_FINISH) {
5580     return err(strm, Z_BUF_ERROR);
5581   }
5583   /* User must not provide more input after the first FINISH: */
5584   if (s.status === FINISH_STATE && strm.avail_in !== 0) {
5585     return err(strm, Z_BUF_ERROR);
5586   }
5588   /* Start a new block or continue the current one.
5589    */
5590   if (strm.avail_in !== 0 || s.lookahead !== 0 ||
5591     (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
5592     var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
5593       (s.strategy === Z_RLE ? deflate_rle(s, flush) :
5594         configuration_table[s.level].func(s, flush));
5596     if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
5597       s.status = FINISH_STATE;
5598     }
5599     if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
5600       if (strm.avail_out === 0) {
5601         s.last_flush = -1;
5602         /* avoid BUF_ERROR next call, see above */
5603       }
5604       return Z_OK;
5605       /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
5606        * of deflate should use the same flush parameter to make sure
5607        * that the flush is complete. So we don't have to output an
5608        * empty block here, this will be done at next call. This also
5609        * ensures that for a very small output buffer, we emit at most
5610        * one empty block.
5611        */
5612     }
5613     if (bstate === BS_BLOCK_DONE) {
5614       if (flush === Z_PARTIAL_FLUSH) {
5615         trees._tr_align(s);
5616       }
5617       else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
5619         trees._tr_stored_block(s, 0, 0, false);
5620         /* For a full flush, this empty block will be recognized
5621          * as a special marker by inflate_sync().
5622          */
5623         if (flush === Z_FULL_FLUSH) {
5624           /*** CLEAR_HASH(s); ***/             /* forget history */
5625           zero(s.head); // Fill with NIL (= 0);
5627           if (s.lookahead === 0) {
5628             s.strstart = 0;
5629             s.block_start = 0;
5630             s.insert = 0;
5631           }
5632         }
5633       }
5634       flush_pending(strm);
5635       if (strm.avail_out === 0) {
5636         s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
5637         return Z_OK;
5638       }
5639     }
5640   }
5641   //Assert(strm->avail_out > 0, "bug2");
5642   //if (strm.avail_out <= 0) { throw new Error("bug2");}
5644   if (flush !== Z_FINISH) { return Z_OK; }
5645   if (s.wrap <= 0) { return Z_STREAM_END; }
5647   /* Write the trailer */
5648   if (s.wrap === 2) {
5649     put_byte(s, strm.adler & 0xff);
5650     put_byte(s, (strm.adler >> 8) & 0xff);
5651     put_byte(s, (strm.adler >> 16) & 0xff);
5652     put_byte(s, (strm.adler >> 24) & 0xff);
5653     put_byte(s, strm.total_in & 0xff);
5654     put_byte(s, (strm.total_in >> 8) & 0xff);
5655     put_byte(s, (strm.total_in >> 16) & 0xff);
5656     put_byte(s, (strm.total_in >> 24) & 0xff);
5657   }
5658   else
5659   {
5660     putShortMSB(s, strm.adler >>> 16);
5661     putShortMSB(s, strm.adler & 0xffff);
5662   }
5664   flush_pending(strm);
5665   /* If avail_out is zero, the application will call deflate again
5666    * to flush the rest.
5667    */
5668   if (s.wrap > 0) { s.wrap = -s.wrap; }
5669   /* write the trailer only once! */
5670   return s.pending !== 0 ? Z_OK : Z_STREAM_END;
5673 function deflateEnd(strm) {
5674   var status;
5676   if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
5677     return Z_STREAM_ERROR;
5678   }
5680   status = strm.state.status;
5681   if (status !== INIT_STATE &&
5682     status !== EXTRA_STATE &&
5683     status !== NAME_STATE &&
5684     status !== COMMENT_STATE &&
5685     status !== HCRC_STATE &&
5686     status !== BUSY_STATE &&
5687     status !== FINISH_STATE
5688   ) {
5689     return err(strm, Z_STREAM_ERROR);
5690   }
5692   strm.state = null;
5694   return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
5697 /* =========================================================================
5698  * Copy the source state to the destination state
5699  */
5700 //function deflateCopy(dest, source) {
5704 exports.deflateInit = deflateInit;
5705 exports.deflateInit2 = deflateInit2;
5706 exports.deflateReset = deflateReset;
5707 exports.deflateResetKeep = deflateResetKeep;
5708 exports.deflateSetHeader = deflateSetHeader;
5709 exports.deflate = deflate;
5710 exports.deflateEnd = deflateEnd;
5711 exports.deflateInfo = 'pako deflate (from Nodeca project)';
5713 /* Not implemented
5714 exports.deflateBound = deflateBound;
5715 exports.deflateCopy = deflateCopy;
5716 exports.deflateSetDictionary = deflateSetDictionary;
5717 exports.deflateParams = deflateParams;
5718 exports.deflatePending = deflatePending;
5719 exports.deflatePrime = deflatePrime;
5720 exports.deflateTune = deflateTune;
5722 },{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(_dereq_,module,exports){
5723 'use strict';
5726 function GZheader() {
5727   /* true if compressed data believed to be text */
5728   this.text       = 0;
5729   /* modification time */
5730   this.time       = 0;
5731   /* extra flags (not used when writing a gzip file) */
5732   this.xflags     = 0;
5733   /* operating system */
5734   this.os         = 0;
5735   /* pointer to extra field or Z_NULL if none */
5736   this.extra      = null;
5737   /* extra field length (valid if extra != Z_NULL) */
5738   this.extra_len  = 0; // Actually, we don't need it in JS,
5739                        // but leave for few code modifications
5741   //
5742   // Setup limits is not necessary because in js we should not preallocate memory
5743   // for inflate use constant limit in 65536 bytes
5744   //
5746   /* space at extra (only when reading header) */
5747   // this.extra_max  = 0;
5748   /* pointer to zero-terminated file name or Z_NULL */
5749   this.name       = '';
5750   /* space at name (only when reading header) */
5751   // this.name_max   = 0;
5752   /* pointer to zero-terminated comment or Z_NULL */
5753   this.comment    = '';
5754   /* space at comment (only when reading header) */
5755   // this.comm_max   = 0;
5756   /* true if there was or will be a header crc */
5757   this.hcrc       = 0;
5758   /* true when done reading gzip header (not used when writing a gzip file) */
5759   this.done       = false;
5762 module.exports = GZheader;
5763 },{}],34:[function(_dereq_,module,exports){
5764 'use strict';
5766 // See state defs from inflate.js
5767 var BAD = 30;       /* got a data error -- remain here until reset */
5768 var TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
5771    Decode literal, length, and distance codes and write out the resulting
5772    literal and match bytes until either not enough input or output is
5773    available, an end-of-block is encountered, or a data error is encountered.
5774    When large enough input and output buffers are supplied to inflate(), for
5775    example, a 16K input buffer and a 64K output buffer, more than 95% of the
5776    inflate execution time is spent in this routine.
5778    Entry assumptions:
5780         state.mode === LEN
5781         strm.avail_in >= 6
5782         strm.avail_out >= 258
5783         start >= strm.avail_out
5784         state.bits < 8
5786    On return, state.mode is one of:
5788         LEN -- ran out of enough output space or enough available input
5789         TYPE -- reached end of block code, inflate() to interpret next block
5790         BAD -- error in block data
5792    Notes:
5794     - The maximum input bits used by a length/distance pair is 15 bits for the
5795       length code, 5 bits for the length extra, 15 bits for the distance code,
5796       and 13 bits for the distance extra.  This totals 48 bits, or six bytes.
5797       Therefore if strm.avail_in >= 6, then there is enough input to avoid
5798       checking for available input while decoding.
5800     - The maximum bytes that a single length/distance pair can output is 258
5801       bytes, which is the maximum length that can be coded.  inflate_fast()
5802       requires strm.avail_out >= 258 for each loop to avoid checking for
5803       output space.
5804  */
5805 module.exports = function inflate_fast(strm, start) {
5806   var state;
5807   var _in;                    /* local strm.input */
5808   var last;                   /* have enough input while in < last */
5809   var _out;                   /* local strm.output */
5810   var beg;                    /* inflate()'s initial strm.output */
5811   var end;                    /* while out < end, enough space available */
5812 //#ifdef INFLATE_STRICT
5813   var dmax;                   /* maximum distance from zlib header */
5814 //#endif
5815   var wsize;                  /* window size or zero if not using window */
5816   var whave;                  /* valid bytes in the window */
5817   var wnext;                  /* window write index */
5818   var window;                 /* allocated sliding window, if wsize != 0 */
5819   var hold;                   /* local strm.hold */
5820   var bits;                   /* local strm.bits */
5821   var lcode;                  /* local strm.lencode */
5822   var dcode;                  /* local strm.distcode */
5823   var lmask;                  /* mask for first level of length codes */
5824   var dmask;                  /* mask for first level of distance codes */
5825   var here;                   /* retrieved table entry */
5826   var op;                     /* code bits, operation, extra bits, or */
5827                               /*  window position, window bytes to copy */
5828   var len;                    /* match length, unused bytes */
5829   var dist;                   /* match distance */
5830   var from;                   /* where to copy match from */
5831   var from_source;
5834   var input, output; // JS specific, because we have no pointers
5836   /* copy state to local variables */
5837   state = strm.state;
5838   //here = state.here;
5839   _in = strm.next_in;
5840   input = strm.input;
5841   last = _in + (strm.avail_in - 5);
5842   _out = strm.next_out;
5843   output = strm.output;
5844   beg = _out - (start - strm.avail_out);
5845   end = _out + (strm.avail_out - 257);
5846 //#ifdef INFLATE_STRICT
5847   dmax = state.dmax;
5848 //#endif
5849   wsize = state.wsize;
5850   whave = state.whave;
5851   wnext = state.wnext;
5852   window = state.window;
5853   hold = state.hold;
5854   bits = state.bits;
5855   lcode = state.lencode;
5856   dcode = state.distcode;
5857   lmask = (1 << state.lenbits) - 1;
5858   dmask = (1 << state.distbits) - 1;
5861   /* decode literals and length/distances until end-of-block or not enough
5862      input data or output space */
5864   top:
5865   do {
5866     if (bits < 15) {
5867       hold += input[_in++] << bits;
5868       bits += 8;
5869       hold += input[_in++] << bits;
5870       bits += 8;
5871     }
5873     here = lcode[hold & lmask];
5875     dolen:
5876     for (;;) { // Goto emulation
5877       op = here >>> 24/*here.bits*/;
5878       hold >>>= op;
5879       bits -= op;
5880       op = (here >>> 16) & 0xff/*here.op*/;
5881       if (op === 0) {                          /* literal */
5882         //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
5883         //        "inflate:         literal '%c'\n" :
5884         //        "inflate:         literal 0x%02x\n", here.val));
5885         output[_out++] = here & 0xffff/*here.val*/;
5886       }
5887       else if (op & 16) {                     /* length base */
5888         len = here & 0xffff/*here.val*/;
5889         op &= 15;                           /* number of extra bits */
5890         if (op) {
5891           if (bits < op) {
5892             hold += input[_in++] << bits;
5893             bits += 8;
5894           }
5895           len += hold & ((1 << op) - 1);
5896           hold >>>= op;
5897           bits -= op;
5898         }
5899         //Tracevv((stderr, "inflate:         length %u\n", len));
5900         if (bits < 15) {
5901           hold += input[_in++] << bits;
5902           bits += 8;
5903           hold += input[_in++] << bits;
5904           bits += 8;
5905         }
5906         here = dcode[hold & dmask];
5908         dodist:
5909         for (;;) { // goto emulation
5910           op = here >>> 24/*here.bits*/;
5911           hold >>>= op;
5912           bits -= op;
5913           op = (here >>> 16) & 0xff/*here.op*/;
5915           if (op & 16) {                      /* distance base */
5916             dist = here & 0xffff/*here.val*/;
5917             op &= 15;                       /* number of extra bits */
5918             if (bits < op) {
5919               hold += input[_in++] << bits;
5920               bits += 8;
5921               if (bits < op) {
5922                 hold += input[_in++] << bits;
5923                 bits += 8;
5924               }
5925             }
5926             dist += hold & ((1 << op) - 1);
5927 //#ifdef INFLATE_STRICT
5928             if (dist > dmax) {
5929               strm.msg = 'invalid distance too far back';
5930               state.mode = BAD;
5931               break top;
5932             }
5933 //#endif
5934             hold >>>= op;
5935             bits -= op;
5936             //Tracevv((stderr, "inflate:         distance %u\n", dist));
5937             op = _out - beg;                /* max distance in output */
5938             if (dist > op) {                /* see if copy from window */
5939               op = dist - op;               /* distance back in window */
5940               if (op > whave) {
5941                 if (state.sane) {
5942                   strm.msg = 'invalid distance too far back';
5943                   state.mode = BAD;
5944                   break top;
5945                 }
5947 // (!) This block is disabled in zlib defailts,
5948 // don't enable it for binary compatibility
5949 //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
5950 //                if (len <= op - whave) {
5951 //                  do {
5952 //                    output[_out++] = 0;
5953 //                  } while (--len);
5954 //                  continue top;
5955 //                }
5956 //                len -= op - whave;
5957 //                do {
5958 //                  output[_out++] = 0;
5959 //                } while (--op > whave);
5960 //                if (op === 0) {
5961 //                  from = _out - dist;
5962 //                  do {
5963 //                    output[_out++] = output[from++];
5964 //                  } while (--len);
5965 //                  continue top;
5966 //                }
5967 //#endif
5968               }
5969               from = 0; // window index
5970               from_source = window;
5971               if (wnext === 0) {           /* very common case */
5972                 from += wsize - op;
5973                 if (op < len) {         /* some from window */
5974                   len -= op;
5975                   do {
5976                     output[_out++] = window[from++];
5977                   } while (--op);
5978                   from = _out - dist;  /* rest from output */
5979                   from_source = output;
5980                 }
5981               }
5982               else if (wnext < op) {      /* wrap around window */
5983                 from += wsize + wnext - op;
5984                 op -= wnext;
5985                 if (op < len) {         /* some from end of window */
5986                   len -= op;
5987                   do {
5988                     output[_out++] = window[from++];
5989                   } while (--op);
5990                   from = 0;
5991                   if (wnext < len) {  /* some from start of window */
5992                     op = wnext;
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               }
6002               else {                      /* contiguous in window */
6003                 from += wnext - op;
6004                 if (op < len) {         /* some from window */
6005                   len -= op;
6006                   do {
6007                     output[_out++] = window[from++];
6008                   } while (--op);
6009                   from = _out - dist;  /* rest from output */
6010                   from_source = output;
6011                 }
6012               }
6013               while (len > 2) {
6014                 output[_out++] = from_source[from++];
6015                 output[_out++] = from_source[from++];
6016                 output[_out++] = from_source[from++];
6017                 len -= 3;
6018               }
6019               if (len) {
6020                 output[_out++] = from_source[from++];
6021                 if (len > 1) {
6022                   output[_out++] = from_source[from++];
6023                 }
6024               }
6025             }
6026             else {
6027               from = _out - dist;          /* copy direct from output */
6028               do {                        /* minimum length is three */
6029                 output[_out++] = output[from++];
6030                 output[_out++] = output[from++];
6031                 output[_out++] = output[from++];
6032                 len -= 3;
6033               } while (len > 2);
6034               if (len) {
6035                 output[_out++] = output[from++];
6036                 if (len > 1) {
6037                   output[_out++] = output[from++];
6038                 }
6039               }
6040             }
6041           }
6042           else if ((op & 64) === 0) {          /* 2nd level distance code */
6043             here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
6044             continue dodist;
6045           }
6046           else {
6047             strm.msg = 'invalid distance code';
6048             state.mode = BAD;
6049             break top;
6050           }
6052           break; // need to emulate goto via "continue"
6053         }
6054       }
6055       else if ((op & 64) === 0) {              /* 2nd level length code */
6056         here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
6057         continue dolen;
6058       }
6059       else if (op & 32) {                     /* end-of-block */
6060         //Tracevv((stderr, "inflate:         end of block\n"));
6061         state.mode = TYPE;
6062         break top;
6063       }
6064       else {
6065         strm.msg = 'invalid literal/length code';
6066         state.mode = BAD;
6067         break top;
6068       }
6070       break; // need to emulate goto via "continue"
6071     }
6072   } while (_in < last && _out < end);
6074   /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
6075   len = bits >> 3;
6076   _in -= len;
6077   bits -= len << 3;
6078   hold &= (1 << bits) - 1;
6080   /* update state and return */
6081   strm.next_in = _in;
6082   strm.next_out = _out;
6083   strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
6084   strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
6085   state.hold = hold;
6086   state.bits = bits;
6087   return;
6090 },{}],35:[function(_dereq_,module,exports){
6091 'use strict';
6094 var utils = _dereq_('../utils/common');
6095 var adler32 = _dereq_('./adler32');
6096 var crc32   = _dereq_('./crc32');
6097 var inflate_fast = _dereq_('./inffast');
6098 var inflate_table = _dereq_('./inftrees');
6100 var CODES = 0;
6101 var LENS = 1;
6102 var DISTS = 2;
6104 /* Public constants ==========================================================*/
6105 /* ===========================================================================*/
6108 /* Allowed flush values; see deflate() and inflate() below for details */
6109 //var Z_NO_FLUSH      = 0;
6110 //var Z_PARTIAL_FLUSH = 1;
6111 //var Z_SYNC_FLUSH    = 2;
6112 //var Z_FULL_FLUSH    = 3;
6113 var Z_FINISH        = 4;
6114 var Z_BLOCK         = 5;
6115 var Z_TREES         = 6;
6118 /* Return codes for the compression/decompression functions. Negative values
6119  * are errors, positive values are used for special but normal events.
6120  */
6121 var Z_OK            = 0;
6122 var Z_STREAM_END    = 1;
6123 var Z_NEED_DICT     = 2;
6124 //var Z_ERRNO         = -1;
6125 var Z_STREAM_ERROR  = -2;
6126 var Z_DATA_ERROR    = -3;
6127 var Z_MEM_ERROR     = -4;
6128 var Z_BUF_ERROR     = -5;
6129 //var Z_VERSION_ERROR = -6;
6131 /* The deflate compression method */
6132 var Z_DEFLATED  = 8;
6135 /* STATES ====================================================================*/
6136 /* ===========================================================================*/
6139 var    HEAD = 1;       /* i: waiting for magic header */
6140 var    FLAGS = 2;      /* i: waiting for method and flags (gzip) */
6141 var    TIME = 3;       /* i: waiting for modification time (gzip) */
6142 var    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */
6143 var    EXLEN = 5;      /* i: waiting for extra length (gzip) */
6144 var    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */
6145 var    NAME = 7;       /* i: waiting for end of file name (gzip) */
6146 var    COMMENT = 8;    /* i: waiting for end of comment (gzip) */
6147 var    HCRC = 9;       /* i: waiting for header crc (gzip) */
6148 var    DICTID = 10;    /* i: waiting for dictionary check value */
6149 var    DICT = 11;      /* waiting for inflateSetDictionary() call */
6150 var        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
6151 var        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */
6152 var        STORED = 14;    /* i: waiting for stored size (length and complement) */
6153 var        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */
6154 var        COPY = 16;      /* i/o: waiting for input or output to copy stored block */
6155 var        TABLE = 17;     /* i: waiting for dynamic block table lengths */
6156 var        LENLENS = 18;   /* i: waiting for code length code lengths */
6157 var        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */
6158 var            LEN_ = 20;      /* i: same as LEN below, but only first time in */
6159 var            LEN = 21;       /* i: waiting for length/lit/eob code */
6160 var            LENEXT = 22;    /* i: waiting for length extra bits */
6161 var            DIST = 23;      /* i: waiting for distance code */
6162 var            DISTEXT = 24;   /* i: waiting for distance extra bits */
6163 var            MATCH = 25;     /* o: waiting for output space to copy string */
6164 var            LIT = 26;       /* o: waiting for output space to write literal */
6165 var    CHECK = 27;     /* i: waiting for 32-bit check value */
6166 var    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */
6167 var    DONE = 29;      /* finished check, done -- remain here until reset */
6168 var    BAD = 30;       /* got a data error -- remain here until reset */
6169 var    MEM = 31;       /* got an inflate() memory error -- remain here until reset */
6170 var    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */
6172 /* ===========================================================================*/
6176 var ENOUGH_LENS = 852;
6177 var ENOUGH_DISTS = 592;
6178 //var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);
6180 var MAX_WBITS = 15;
6181 /* 32K LZ77 window */
6182 var DEF_WBITS = MAX_WBITS;
6185 function ZSWAP32(q) {
6186   return  (((q >>> 24) & 0xff) +
6187           ((q >>> 8) & 0xff00) +
6188           ((q & 0xff00) << 8) +
6189           ((q & 0xff) << 24));
6193 function InflateState() {
6194   this.mode = 0;             /* current inflate mode */
6195   this.last = false;          /* true if processing last block */
6196   this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
6197   this.havedict = false;      /* true if dictionary provided */
6198   this.flags = 0;             /* gzip header method and flags (0 if zlib) */
6199   this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */
6200   this.check = 0;             /* protected copy of check value */
6201   this.total = 0;             /* protected copy of output count */
6202   // TODO: may be {}
6203   this.head = null;           /* where to save gzip header information */
6205   /* sliding window */
6206   this.wbits = 0;             /* log base 2 of requested window size */
6207   this.wsize = 0;             /* window size or zero if not using window */
6208   this.whave = 0;             /* valid bytes in the window */
6209   this.wnext = 0;             /* window write index */
6210   this.window = null;         /* allocated sliding window, if needed */
6212   /* bit accumulator */
6213   this.hold = 0;              /* input bit accumulator */
6214   this.bits = 0;              /* number of bits in "in" */
6216   /* for string and stored block copying */
6217   this.length = 0;            /* literal or length of data to copy */
6218   this.offset = 0;            /* distance back to copy string from */
6220   /* for table and code decoding */
6221   this.extra = 0;             /* extra bits needed */
6223   /* fixed and dynamic code tables */
6224   this.lencode = null;          /* starting table for length/literal codes */
6225   this.distcode = null;         /* starting table for distance codes */
6226   this.lenbits = 0;           /* index bits for lencode */
6227   this.distbits = 0;          /* index bits for distcode */
6229   /* dynamic table building */
6230   this.ncode = 0;             /* number of code length code lengths */
6231   this.nlen = 0;              /* number of length code lengths */
6232   this.ndist = 0;             /* number of distance code lengths */
6233   this.have = 0;              /* number of code lengths in lens[] */
6234   this.next = null;              /* next available space in codes[] */
6236   this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
6237   this.work = new utils.Buf16(288); /* work area for code table building */
6239   /*
6240    because we don't have pointers in js, we use lencode and distcode directly
6241    as buffers so we don't need codes
6242   */
6243   //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */
6244   this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */
6245   this.distdyn = null;             /* dynamic table for distance codes (JS specific) */
6246   this.sane = 0;                   /* if false, allow invalid distance too far */
6247   this.back = 0;                   /* bits back of last unprocessed length/lit */
6248   this.was = 0;                    /* initial length of match */
6251 function inflateResetKeep(strm) {
6252   var state;
6254   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
6255   state = strm.state;
6256   strm.total_in = strm.total_out = state.total = 0;
6257   strm.msg = ''; /*Z_NULL*/
6258   if (state.wrap) {       /* to support ill-conceived Java test suite */
6259     strm.adler = state.wrap & 1;
6260   }
6261   state.mode = HEAD;
6262   state.last = 0;
6263   state.havedict = 0;
6264   state.dmax = 32768;
6265   state.head = null/*Z_NULL*/;
6266   state.hold = 0;
6267   state.bits = 0;
6268   //state.lencode = state.distcode = state.next = state.codes;
6269   state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
6270   state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
6272   state.sane = 1;
6273   state.back = -1;
6274   //Tracev((stderr, "inflate: reset\n"));
6275   return Z_OK;
6278 function inflateReset(strm) {
6279   var state;
6281   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
6282   state = strm.state;
6283   state.wsize = 0;
6284   state.whave = 0;
6285   state.wnext = 0;
6286   return inflateResetKeep(strm);
6290 function inflateReset2(strm, windowBits) {
6291   var wrap;
6292   var state;
6294   /* get the state */
6295   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
6296   state = strm.state;
6298   /* extract wrap request from windowBits parameter */
6299   if (windowBits < 0) {
6300     wrap = 0;
6301     windowBits = -windowBits;
6302   }
6303   else {
6304     wrap = (windowBits >> 4) + 1;
6305     if (windowBits < 48) {
6306       windowBits &= 15;
6307     }
6308   }
6310   /* set number of window bits, free window if different */
6311   if (windowBits && (windowBits < 8 || windowBits > 15)) {
6312     return Z_STREAM_ERROR;
6313   }
6314   if (state.window !== null && state.wbits !== windowBits) {
6315     state.window = null;
6316   }
6318   /* update state and reset the rest of it */
6319   state.wrap = wrap;
6320   state.wbits = windowBits;
6321   return inflateReset(strm);
6324 function inflateInit2(strm, windowBits) {
6325   var ret;
6326   var state;
6328   if (!strm) { return Z_STREAM_ERROR; }
6329   //strm.msg = Z_NULL;                 /* in case we return an error */
6331   state = new InflateState();
6333   //if (state === Z_NULL) return Z_MEM_ERROR;
6334   //Tracev((stderr, "inflate: allocated\n"));
6335   strm.state = state;
6336   state.window = null/*Z_NULL*/;
6337   ret = inflateReset2(strm, windowBits);
6338   if (ret !== Z_OK) {
6339     strm.state = null/*Z_NULL*/;
6340   }
6341   return ret;
6344 function inflateInit(strm) {
6345   return inflateInit2(strm, DEF_WBITS);
6350  Return state with length and distance decoding tables and index sizes set to
6351  fixed code decoding.  Normally this returns fixed tables from inffixed.h.
6352  If BUILDFIXED is defined, then instead this routine builds the tables the
6353  first time it's called, and returns those tables the first time and
6354  thereafter.  This reduces the size of the code by about 2K bytes, in
6355  exchange for a little execution time.  However, BUILDFIXED should not be
6356  used for threaded applications, since the rewriting of the tables and virgin
6357  may not be thread-safe.
6358  */
6359 var virgin = true;
6361 var lenfix, distfix; // We have no pointers in JS, so keep tables separate
6363 function fixedtables(state) {
6364   /* build fixed huffman tables if first call (may not be thread safe) */
6365   if (virgin) {
6366     var sym;
6368     lenfix = new utils.Buf32(512);
6369     distfix = new utils.Buf32(32);
6371     /* literal/length table */
6372     sym = 0;
6373     while (sym < 144) { state.lens[sym++] = 8; }
6374     while (sym < 256) { state.lens[sym++] = 9; }
6375     while (sym < 280) { state.lens[sym++] = 7; }
6376     while (sym < 288) { state.lens[sym++] = 8; }
6378     inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, {bits: 9});
6380     /* distance table */
6381     sym = 0;
6382     while (sym < 32) { state.lens[sym++] = 5; }
6384     inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, {bits: 5});
6386     /* do this just once */
6387     virgin = false;
6388   }
6390   state.lencode = lenfix;
6391   state.lenbits = 9;
6392   state.distcode = distfix;
6393   state.distbits = 5;
6398  Update the window with the last wsize (normally 32K) bytes written before
6399  returning.  If window does not exist yet, create it.  This is only called
6400  when a window is already in use, or when output has been written during this
6401  inflate call, but the end of the deflate stream has not been reached yet.
6402  It is also called to create a window for dictionary data when a dictionary
6403  is loaded.
6405  Providing output buffers larger than 32K to inflate() should provide a speed
6406  advantage, since only the last 32K of output is copied to the sliding window
6407  upon return from inflate(), and since all distances after the first 32K of
6408  output will fall in the output data, making match copies simpler and faster.
6409  The advantage may be dependent on the size of the processor's data caches.
6410  */
6411 function updatewindow(strm, src, end, copy) {
6412   var dist;
6413   var state = strm.state;
6415   /* if it hasn't been done already, allocate space for the window */
6416   if (state.window === null) {
6417     state.wsize = 1 << state.wbits;
6418     state.wnext = 0;
6419     state.whave = 0;
6421     state.window = new utils.Buf8(state.wsize);
6422   }
6424   /* copy state->wsize or less output bytes into the circular window */
6425   if (copy >= state.wsize) {
6426     utils.arraySet(state.window,src, end - state.wsize, state.wsize, 0);
6427     state.wnext = 0;
6428     state.whave = state.wsize;
6429   }
6430   else {
6431     dist = state.wsize - state.wnext;
6432     if (dist > copy) {
6433       dist = copy;
6434     }
6435     //zmemcpy(state->window + state->wnext, end - copy, dist);
6436     utils.arraySet(state.window,src, end - copy, dist, state.wnext);
6437     copy -= dist;
6438     if (copy) {
6439       //zmemcpy(state->window, end - copy, copy);
6440       utils.arraySet(state.window,src, end - copy, copy, 0);
6441       state.wnext = copy;
6442       state.whave = state.wsize;
6443     }
6444     else {
6445       state.wnext += dist;
6446       if (state.wnext === state.wsize) { state.wnext = 0; }
6447       if (state.whave < state.wsize) { state.whave += dist; }
6448     }
6449   }
6450   return 0;
6453 function inflate(strm, flush) {
6454   var state;
6455   var input, output;          // input/output buffers
6456   var next;                   /* next input INDEX */
6457   var put;                    /* next output INDEX */
6458   var have, left;             /* available input and output */
6459   var hold;                   /* bit buffer */
6460   var bits;                   /* bits in bit buffer */
6461   var _in, _out;              /* save starting available input and output */
6462   var copy;                   /* number of stored or match bytes to copy */
6463   var from;                   /* where to copy match bytes from */
6464   var from_source;
6465   var here = 0;               /* current decoding table entry */
6466   var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
6467   //var last;                   /* parent table entry */
6468   var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
6469   var len;                    /* length to copy for repeats, bits to drop */
6470   var ret;                    /* return code */
6471   var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */
6472   var opts;
6474   var n; // temporary var for NEED_BITS
6476   var order = /* permutation of code lengths */
6477     [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
6480   if (!strm || !strm.state || !strm.output ||
6481       (!strm.input && strm.avail_in !== 0)) {
6482     return Z_STREAM_ERROR;
6483   }
6485   state = strm.state;
6486   if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */
6489   //--- LOAD() ---
6490   put = strm.next_out;
6491   output = strm.output;
6492   left = strm.avail_out;
6493   next = strm.next_in;
6494   input = strm.input;
6495   have = strm.avail_in;
6496   hold = state.hold;
6497   bits = state.bits;
6498   //---
6500   _in = have;
6501   _out = left;
6502   ret = Z_OK;
6504   inf_leave: // goto emulation
6505   for (;;) {
6506     switch (state.mode) {
6507     case HEAD:
6508       if (state.wrap === 0) {
6509         state.mode = TYPEDO;
6510         break;
6511       }
6512       //=== NEEDBITS(16);
6513       while (bits < 16) {
6514         if (have === 0) { break inf_leave; }
6515         have--;
6516         hold += input[next++] << bits;
6517         bits += 8;
6518       }
6519       //===//
6520       if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */
6521         state.check = 0/*crc32(0L, Z_NULL, 0)*/;
6522         //=== CRC2(state.check, hold);
6523         hbuf[0] = hold & 0xff;
6524         hbuf[1] = (hold >>> 8) & 0xff;
6525         state.check = crc32(state.check, hbuf, 2, 0);
6526         //===//
6528         //=== INITBITS();
6529         hold = 0;
6530         bits = 0;
6531         //===//
6532         state.mode = FLAGS;
6533         break;
6534       }
6535       state.flags = 0;           /* expect zlib header */
6536       if (state.head) {
6537         state.head.done = false;
6538       }
6539       if (!(state.wrap & 1) ||   /* check if zlib header allowed */
6540         (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
6541         strm.msg = 'incorrect header check';
6542         state.mode = BAD;
6543         break;
6544       }
6545       if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
6546         strm.msg = 'unknown compression method';
6547         state.mode = BAD;
6548         break;
6549       }
6550       //--- DROPBITS(4) ---//
6551       hold >>>= 4;
6552       bits -= 4;
6553       //---//
6554       len = (hold & 0x0f)/*BITS(4)*/ + 8;
6555       if (state.wbits === 0) {
6556         state.wbits = len;
6557       }
6558       else if (len > state.wbits) {
6559         strm.msg = 'invalid window size';
6560         state.mode = BAD;
6561         break;
6562       }
6563       state.dmax = 1 << len;
6564       //Tracev((stderr, "inflate:   zlib header ok\n"));
6565       strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
6566       state.mode = hold & 0x200 ? DICTID : TYPE;
6567       //=== INITBITS();
6568       hold = 0;
6569       bits = 0;
6570       //===//
6571       break;
6572     case FLAGS:
6573       //=== NEEDBITS(16); */
6574       while (bits < 16) {
6575         if (have === 0) { break inf_leave; }
6576         have--;
6577         hold += input[next++] << bits;
6578         bits += 8;
6579       }
6580       //===//
6581       state.flags = hold;
6582       if ((state.flags & 0xff) !== Z_DEFLATED) {
6583         strm.msg = 'unknown compression method';
6584         state.mode = BAD;
6585         break;
6586       }
6587       if (state.flags & 0xe000) {
6588         strm.msg = 'unknown header flags set';
6589         state.mode = BAD;
6590         break;
6591       }
6592       if (state.head) {
6593         state.head.text = ((hold >> 8) & 1);
6594       }
6595       if (state.flags & 0x0200) {
6596         //=== CRC2(state.check, hold);
6597         hbuf[0] = hold & 0xff;
6598         hbuf[1] = (hold >>> 8) & 0xff;
6599         state.check = crc32(state.check, hbuf, 2, 0);
6600         //===//
6601       }
6602       //=== INITBITS();
6603       hold = 0;
6604       bits = 0;
6605       //===//
6606       state.mode = TIME;
6607       /* falls through */
6608     case TIME:
6609       //=== NEEDBITS(32); */
6610       while (bits < 32) {
6611         if (have === 0) { break inf_leave; }
6612         have--;
6613         hold += input[next++] << bits;
6614         bits += 8;
6615       }
6616       //===//
6617       if (state.head) {
6618         state.head.time = hold;
6619       }
6620       if (state.flags & 0x0200) {
6621         //=== CRC4(state.check, hold)
6622         hbuf[0] = hold & 0xff;
6623         hbuf[1] = (hold >>> 8) & 0xff;
6624         hbuf[2] = (hold >>> 16) & 0xff;
6625         hbuf[3] = (hold >>> 24) & 0xff;
6626         state.check = crc32(state.check, hbuf, 4, 0);
6627         //===
6628       }
6629       //=== INITBITS();
6630       hold = 0;
6631       bits = 0;
6632       //===//
6633       state.mode = OS;
6634       /* falls through */
6635     case OS:
6636       //=== NEEDBITS(16); */
6637       while (bits < 16) {
6638         if (have === 0) { break inf_leave; }
6639         have--;
6640         hold += input[next++] << bits;
6641         bits += 8;
6642       }
6643       //===//
6644       if (state.head) {
6645         state.head.xflags = (hold & 0xff);
6646         state.head.os = (hold >> 8);
6647       }
6648       if (state.flags & 0x0200) {
6649         //=== CRC2(state.check, hold);
6650         hbuf[0] = hold & 0xff;
6651         hbuf[1] = (hold >>> 8) & 0xff;
6652         state.check = crc32(state.check, hbuf, 2, 0);
6653         //===//
6654       }
6655       //=== INITBITS();
6656       hold = 0;
6657       bits = 0;
6658       //===//
6659       state.mode = EXLEN;
6660       /* falls through */
6661     case EXLEN:
6662       if (state.flags & 0x0400) {
6663         //=== NEEDBITS(16); */
6664         while (bits < 16) {
6665           if (have === 0) { break inf_leave; }
6666           have--;
6667           hold += input[next++] << bits;
6668           bits += 8;
6669         }
6670         //===//
6671         state.length = hold;
6672         if (state.head) {
6673           state.head.extra_len = hold;
6674         }
6675         if (state.flags & 0x0200) {
6676           //=== CRC2(state.check, hold);
6677           hbuf[0] = hold & 0xff;
6678           hbuf[1] = (hold >>> 8) & 0xff;
6679           state.check = crc32(state.check, hbuf, 2, 0);
6680           //===//
6681         }
6682         //=== INITBITS();
6683         hold = 0;
6684         bits = 0;
6685         //===//
6686       }
6687       else if (state.head) {
6688         state.head.extra = null/*Z_NULL*/;
6689       }
6690       state.mode = EXTRA;
6691       /* falls through */
6692     case EXTRA:
6693       if (state.flags & 0x0400) {
6694         copy = state.length;
6695         if (copy > have) { copy = have; }
6696         if (copy) {
6697           if (state.head) {
6698             len = state.head.extra_len - state.length;
6699             if (!state.head.extra) {
6700               // Use untyped array for more conveniend processing later
6701               state.head.extra = new Array(state.head.extra_len);
6702             }
6703             utils.arraySet(
6704               state.head.extra,
6705               input,
6706               next,
6707               // extra field is limited to 65536 bytes
6708               // - no need for additional size check
6709               copy,
6710               /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
6711               len
6712             );
6713             //zmemcpy(state.head.extra + len, next,
6714             //        len + copy > state.head.extra_max ?
6715             //        state.head.extra_max - len : copy);
6716           }
6717           if (state.flags & 0x0200) {
6718             state.check = crc32(state.check, input, copy, next);
6719           }
6720           have -= copy;
6721           next += copy;
6722           state.length -= copy;
6723         }
6724         if (state.length) { break inf_leave; }
6725       }
6726       state.length = 0;
6727       state.mode = NAME;
6728       /* falls through */
6729     case NAME:
6730       if (state.flags & 0x0800) {
6731         if (have === 0) { break inf_leave; }
6732         copy = 0;
6733         do {
6734           // TODO: 2 or 1 bytes?
6735           len = input[next + copy++];
6736           /* use constant limit because in js we should not preallocate memory */
6737           if (state.head && len &&
6738               (state.length < 65536 /*state.head.name_max*/)) {
6739             state.head.name += String.fromCharCode(len);
6740           }
6741         } while (len && copy < have);
6743         if (state.flags & 0x0200) {
6744           state.check = crc32(state.check, input, copy, next);
6745         }
6746         have -= copy;
6747         next += copy;
6748         if (len) { break inf_leave; }
6749       }
6750       else if (state.head) {
6751         state.head.name = null;
6752       }
6753       state.length = 0;
6754       state.mode = COMMENT;
6755       /* falls through */
6756     case COMMENT:
6757       if (state.flags & 0x1000) {
6758         if (have === 0) { break inf_leave; }
6759         copy = 0;
6760         do {
6761           len = input[next + copy++];
6762           /* use constant limit because in js we should not preallocate memory */
6763           if (state.head && len &&
6764               (state.length < 65536 /*state.head.comm_max*/)) {
6765             state.head.comment += String.fromCharCode(len);
6766           }
6767         } while (len && copy < have);
6768         if (state.flags & 0x0200) {
6769           state.check = crc32(state.check, input, copy, next);
6770         }
6771         have -= copy;
6772         next += copy;
6773         if (len) { break inf_leave; }
6774       }
6775       else if (state.head) {
6776         state.head.comment = null;
6777       }
6778       state.mode = HCRC;
6779       /* falls through */
6780     case HCRC:
6781       if (state.flags & 0x0200) {
6782         //=== NEEDBITS(16); */
6783         while (bits < 16) {
6784           if (have === 0) { break inf_leave; }
6785           have--;
6786           hold += input[next++] << bits;
6787           bits += 8;
6788         }
6789         //===//
6790         if (hold !== (state.check & 0xffff)) {
6791           strm.msg = 'header crc mismatch';
6792           state.mode = BAD;
6793           break;
6794         }
6795         //=== INITBITS();
6796         hold = 0;
6797         bits = 0;
6798         //===//
6799       }
6800       if (state.head) {
6801         state.head.hcrc = ((state.flags >> 9) & 1);
6802         state.head.done = true;
6803       }
6804       strm.adler = state.check = 0 /*crc32(0L, Z_NULL, 0)*/;
6805       state.mode = TYPE;
6806       break;
6807     case DICTID:
6808       //=== NEEDBITS(32); */
6809       while (bits < 32) {
6810         if (have === 0) { break inf_leave; }
6811         have--;
6812         hold += input[next++] << bits;
6813         bits += 8;
6814       }
6815       //===//
6816       strm.adler = state.check = ZSWAP32(hold);
6817       //=== INITBITS();
6818       hold = 0;
6819       bits = 0;
6820       //===//
6821       state.mode = DICT;
6822       /* falls through */
6823     case DICT:
6824       if (state.havedict === 0) {
6825         //--- RESTORE() ---
6826         strm.next_out = put;
6827         strm.avail_out = left;
6828         strm.next_in = next;
6829         strm.avail_in = have;
6830         state.hold = hold;
6831         state.bits = bits;
6832         //---
6833         return Z_NEED_DICT;
6834       }
6835       strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
6836       state.mode = TYPE;
6837       /* falls through */
6838     case TYPE:
6839       if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
6840       /* falls through */
6841     case TYPEDO:
6842       if (state.last) {
6843         //--- BYTEBITS() ---//
6844         hold >>>= bits & 7;
6845         bits -= bits & 7;
6846         //---//
6847         state.mode = CHECK;
6848         break;
6849       }
6850       //=== NEEDBITS(3); */
6851       while (bits < 3) {
6852         if (have === 0) { break inf_leave; }
6853         have--;
6854         hold += input[next++] << bits;
6855         bits += 8;
6856       }
6857       //===//
6858       state.last = (hold & 0x01)/*BITS(1)*/;
6859       //--- DROPBITS(1) ---//
6860       hold >>>= 1;
6861       bits -= 1;
6862       //---//
6864       switch ((hold & 0x03)/*BITS(2)*/) {
6865       case 0:                             /* stored block */
6866         //Tracev((stderr, "inflate:     stored block%s\n",
6867         //        state.last ? " (last)" : ""));
6868         state.mode = STORED;
6869         break;
6870       case 1:                             /* fixed block */
6871         fixedtables(state);
6872         //Tracev((stderr, "inflate:     fixed codes block%s\n",
6873         //        state.last ? " (last)" : ""));
6874         state.mode = LEN_;             /* decode codes */
6875         if (flush === Z_TREES) {
6876           //--- DROPBITS(2) ---//
6877           hold >>>= 2;
6878           bits -= 2;
6879           //---//
6880           break inf_leave;
6881         }
6882         break;
6883       case 2:                             /* dynamic block */
6884         //Tracev((stderr, "inflate:     dynamic codes block%s\n",
6885         //        state.last ? " (last)" : ""));
6886         state.mode = TABLE;
6887         break;
6888       case 3:
6889         strm.msg = 'invalid block type';
6890         state.mode = BAD;
6891       }
6892       //--- DROPBITS(2) ---//
6893       hold >>>= 2;
6894       bits -= 2;
6895       //---//
6896       break;
6897     case STORED:
6898       //--- BYTEBITS() ---// /* go to byte boundary */
6899       hold >>>= bits & 7;
6900       bits -= bits & 7;
6901       //---//
6902       //=== NEEDBITS(32); */
6903       while (bits < 32) {
6904         if (have === 0) { break inf_leave; }
6905         have--;
6906         hold += input[next++] << bits;
6907         bits += 8;
6908       }
6909       //===//
6910       if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
6911         strm.msg = 'invalid stored block lengths';
6912         state.mode = BAD;
6913         break;
6914       }
6915       state.length = hold & 0xffff;
6916       //Tracev((stderr, "inflate:       stored length %u\n",
6917       //        state.length));
6918       //=== INITBITS();
6919       hold = 0;
6920       bits = 0;
6921       //===//
6922       state.mode = COPY_;
6923       if (flush === Z_TREES) { break inf_leave; }
6924       /* falls through */
6925     case COPY_:
6926       state.mode = COPY;
6927       /* falls through */
6928     case COPY:
6929       copy = state.length;
6930       if (copy) {
6931         if (copy > have) { copy = have; }
6932         if (copy > left) { copy = left; }
6933         if (copy === 0) { break inf_leave; }
6934         //--- zmemcpy(put, next, copy); ---
6935         utils.arraySet(output, input, next, copy, put);
6936         //---//
6937         have -= copy;
6938         next += copy;
6939         left -= copy;
6940         put += copy;
6941         state.length -= copy;
6942         break;
6943       }
6944       //Tracev((stderr, "inflate:       stored end\n"));
6945       state.mode = TYPE;
6946       break;
6947     case TABLE:
6948       //=== NEEDBITS(14); */
6949       while (bits < 14) {
6950         if (have === 0) { break inf_leave; }
6951         have--;
6952         hold += input[next++] << bits;
6953         bits += 8;
6954       }
6955       //===//
6956       state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
6957       //--- DROPBITS(5) ---//
6958       hold >>>= 5;
6959       bits -= 5;
6960       //---//
6961       state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
6962       //--- DROPBITS(5) ---//
6963       hold >>>= 5;
6964       bits -= 5;
6965       //---//
6966       state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
6967       //--- DROPBITS(4) ---//
6968       hold >>>= 4;
6969       bits -= 4;
6970       //---//
6971 //#ifndef PKZIP_BUG_WORKAROUND
6972       if (state.nlen > 286 || state.ndist > 30) {
6973         strm.msg = 'too many length or distance symbols';
6974         state.mode = BAD;
6975         break;
6976       }
6977 //#endif
6978       //Tracev((stderr, "inflate:       table sizes ok\n"));
6979       state.have = 0;
6980       state.mode = LENLENS;
6981       /* falls through */
6982     case LENLENS:
6983       while (state.have < state.ncode) {
6984         //=== NEEDBITS(3);
6985         while (bits < 3) {
6986           if (have === 0) { break inf_leave; }
6987           have--;
6988           hold += input[next++] << bits;
6989           bits += 8;
6990         }
6991         //===//
6992         state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
6993         //--- DROPBITS(3) ---//
6994         hold >>>= 3;
6995         bits -= 3;
6996         //---//
6997       }
6998       while (state.have < 19) {
6999         state.lens[order[state.have++]] = 0;
7000       }
7001       // We have separate tables & no pointers. 2 commented lines below not needed.
7002       //state.next = state.codes;
7003       //state.lencode = state.next;
7004       // Switch to use dynamic table
7005       state.lencode = state.lendyn;
7006       state.lenbits = 7;
7008       opts = {bits: state.lenbits};
7009       ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
7010       state.lenbits = opts.bits;
7012       if (ret) {
7013         strm.msg = 'invalid code lengths set';
7014         state.mode = BAD;
7015         break;
7016       }
7017       //Tracev((stderr, "inflate:       code lengths ok\n"));
7018       state.have = 0;
7019       state.mode = CODELENS;
7020       /* falls through */
7021     case CODELENS:
7022       while (state.have < state.nlen + state.ndist) {
7023         for (;;) {
7024           here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
7025           here_bits = here >>> 24;
7026           here_op = (here >>> 16) & 0xff;
7027           here_val = here & 0xffff;
7029           if ((here_bits) <= bits) { break; }
7030           //--- PULLBYTE() ---//
7031           if (have === 0) { break inf_leave; }
7032           have--;
7033           hold += input[next++] << bits;
7034           bits += 8;
7035           //---//
7036         }
7037         if (here_val < 16) {
7038           //--- DROPBITS(here.bits) ---//
7039           hold >>>= here_bits;
7040           bits -= here_bits;
7041           //---//
7042           state.lens[state.have++] = here_val;
7043         }
7044         else {
7045           if (here_val === 16) {
7046             //=== NEEDBITS(here.bits + 2);
7047             n = here_bits + 2;
7048             while (bits < n) {
7049               if (have === 0) { break inf_leave; }
7050               have--;
7051               hold += input[next++] << bits;
7052               bits += 8;
7053             }
7054             //===//
7055             //--- DROPBITS(here.bits) ---//
7056             hold >>>= here_bits;
7057             bits -= here_bits;
7058             //---//
7059             if (state.have === 0) {
7060               strm.msg = 'invalid bit length repeat';
7061               state.mode = BAD;
7062               break;
7063             }
7064             len = state.lens[state.have - 1];
7065             copy = 3 + (hold & 0x03);//BITS(2);
7066             //--- DROPBITS(2) ---//
7067             hold >>>= 2;
7068             bits -= 2;
7069             //---//
7070           }
7071           else if (here_val === 17) {
7072             //=== NEEDBITS(here.bits + 3);
7073             n = here_bits + 3;
7074             while (bits < n) {
7075               if (have === 0) { break inf_leave; }
7076               have--;
7077               hold += input[next++] << bits;
7078               bits += 8;
7079             }
7080             //===//
7081             //--- DROPBITS(here.bits) ---//
7082             hold >>>= here_bits;
7083             bits -= here_bits;
7084             //---//
7085             len = 0;
7086             copy = 3 + (hold & 0x07);//BITS(3);
7087             //--- DROPBITS(3) ---//
7088             hold >>>= 3;
7089             bits -= 3;
7090             //---//
7091           }
7092           else {
7093             //=== NEEDBITS(here.bits + 7);
7094             n = here_bits + 7;
7095             while (bits < n) {
7096               if (have === 0) { break inf_leave; }
7097               have--;
7098               hold += input[next++] << bits;
7099               bits += 8;
7100             }
7101             //===//
7102             //--- DROPBITS(here.bits) ---//
7103             hold >>>= here_bits;
7104             bits -= here_bits;
7105             //---//
7106             len = 0;
7107             copy = 11 + (hold & 0x7f);//BITS(7);
7108             //--- DROPBITS(7) ---//
7109             hold >>>= 7;
7110             bits -= 7;
7111             //---//
7112           }
7113           if (state.have + copy > state.nlen + state.ndist) {
7114             strm.msg = 'invalid bit length repeat';
7115             state.mode = BAD;
7116             break;
7117           }
7118           while (copy--) {
7119             state.lens[state.have++] = len;
7120           }
7121         }
7122       }
7124       /* handle error breaks in while */
7125       if (state.mode === BAD) { break; }
7127       /* check for end-of-block code (better have one) */
7128       if (state.lens[256] === 0) {
7129         strm.msg = 'invalid code -- missing end-of-block';
7130         state.mode = BAD;
7131         break;
7132       }
7134       /* build code tables -- note: do not change the lenbits or distbits
7135          values here (9 and 6) without reading the comments in inftrees.h
7136          concerning the ENOUGH constants, which depend on those values */
7137       state.lenbits = 9;
7139       opts = {bits: state.lenbits};
7140       ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
7141       // We have separate tables & no pointers. 2 commented lines below not needed.
7142       // state.next_index = opts.table_index;
7143       state.lenbits = opts.bits;
7144       // state.lencode = state.next;
7146       if (ret) {
7147         strm.msg = 'invalid literal/lengths set';
7148         state.mode = BAD;
7149         break;
7150       }
7152       state.distbits = 6;
7153       //state.distcode.copy(state.codes);
7154       // Switch to use dynamic table
7155       state.distcode = state.distdyn;
7156       opts = {bits: state.distbits};
7157       ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
7158       // We have separate tables & no pointers. 2 commented lines below not needed.
7159       // state.next_index = opts.table_index;
7160       state.distbits = opts.bits;
7161       // state.distcode = state.next;
7163       if (ret) {
7164         strm.msg = 'invalid distances set';
7165         state.mode = BAD;
7166         break;
7167       }
7168       //Tracev((stderr, 'inflate:       codes ok\n'));
7169       state.mode = LEN_;
7170       if (flush === Z_TREES) { break inf_leave; }
7171       /* falls through */
7172     case LEN_:
7173       state.mode = LEN;
7174       /* falls through */
7175     case LEN:
7176       if (have >= 6 && left >= 258) {
7177         //--- RESTORE() ---
7178         strm.next_out = put;
7179         strm.avail_out = left;
7180         strm.next_in = next;
7181         strm.avail_in = have;
7182         state.hold = hold;
7183         state.bits = bits;
7184         //---
7185         inflate_fast(strm, _out);
7186         //--- LOAD() ---
7187         put = strm.next_out;
7188         output = strm.output;
7189         left = strm.avail_out;
7190         next = strm.next_in;
7191         input = strm.input;
7192         have = strm.avail_in;
7193         hold = state.hold;
7194         bits = state.bits;
7195         //---
7197         if (state.mode === TYPE) {
7198           state.back = -1;
7199         }
7200         break;
7201       }
7202       state.back = 0;
7203       for (;;) {
7204         here = state.lencode[hold & ((1 << state.lenbits) -1)];  /*BITS(state.lenbits)*/
7205         here_bits = here >>> 24;
7206         here_op = (here >>> 16) & 0xff;
7207         here_val = here & 0xffff;
7209         if (here_bits <= bits) { break; }
7210         //--- PULLBYTE() ---//
7211         if (have === 0) { break inf_leave; }
7212         have--;
7213         hold += input[next++] << bits;
7214         bits += 8;
7215         //---//
7216       }
7217       if (here_op && (here_op & 0xf0) === 0) {
7218         last_bits = here_bits;
7219         last_op = here_op;
7220         last_val = here_val;
7221         for (;;) {
7222           here = state.lencode[last_val +
7223                   ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];
7224           here_bits = here >>> 24;
7225           here_op = (here >>> 16) & 0xff;
7226           here_val = here & 0xffff;
7228           if ((last_bits + here_bits) <= bits) { break; }
7229           //--- PULLBYTE() ---//
7230           if (have === 0) { break inf_leave; }
7231           have--;
7232           hold += input[next++] << bits;
7233           bits += 8;
7234           //---//
7235         }
7236         //--- DROPBITS(last.bits) ---//
7237         hold >>>= last_bits;
7238         bits -= last_bits;
7239         //---//
7240         state.back += last_bits;
7241       }
7242       //--- DROPBITS(here.bits) ---//
7243       hold >>>= here_bits;
7244       bits -= here_bits;
7245       //---//
7246       state.back += here_bits;
7247       state.length = here_val;
7248       if (here_op === 0) {
7249         //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
7250         //        "inflate:         literal '%c'\n" :
7251         //        "inflate:         literal 0x%02x\n", here.val));
7252         state.mode = LIT;
7253         break;
7254       }
7255       if (here_op & 32) {
7256         //Tracevv((stderr, "inflate:         end of block\n"));
7257         state.back = -1;
7258         state.mode = TYPE;
7259         break;
7260       }
7261       if (here_op & 64) {
7262         strm.msg = 'invalid literal/length code';
7263         state.mode = BAD;
7264         break;
7265       }
7266       state.extra = here_op & 15;
7267       state.mode = LENEXT;
7268       /* falls through */
7269     case LENEXT:
7270       if (state.extra) {
7271         //=== NEEDBITS(state.extra);
7272         n = state.extra;
7273         while (bits < n) {
7274           if (have === 0) { break inf_leave; }
7275           have--;
7276           hold += input[next++] << bits;
7277           bits += 8;
7278         }
7279         //===//
7280         state.length += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;
7281         //--- DROPBITS(state.extra) ---//
7282         hold >>>= state.extra;
7283         bits -= state.extra;
7284         //---//
7285         state.back += state.extra;
7286       }
7287       //Tracevv((stderr, "inflate:         length %u\n", state.length));
7288       state.was = state.length;
7289       state.mode = DIST;
7290       /* falls through */
7291     case DIST:
7292       for (;;) {
7293         here = state.distcode[hold & ((1 << state.distbits) -1)];/*BITS(state.distbits)*/
7294         here_bits = here >>> 24;
7295         here_op = (here >>> 16) & 0xff;
7296         here_val = here & 0xffff;
7298         if ((here_bits) <= bits) { break; }
7299         //--- PULLBYTE() ---//
7300         if (have === 0) { break inf_leave; }
7301         have--;
7302         hold += input[next++] << bits;
7303         bits += 8;
7304         //---//
7305       }
7306       if ((here_op & 0xf0) === 0) {
7307         last_bits = here_bits;
7308         last_op = here_op;
7309         last_val = here_val;
7310         for (;;) {
7311           here = state.distcode[last_val +
7312                   ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];
7313           here_bits = here >>> 24;
7314           here_op = (here >>> 16) & 0xff;
7315           here_val = here & 0xffff;
7317           if ((last_bits + here_bits) <= bits) { break; }
7318           //--- PULLBYTE() ---//
7319           if (have === 0) { break inf_leave; }
7320           have--;
7321           hold += input[next++] << bits;
7322           bits += 8;
7323           //---//
7324         }
7325         //--- DROPBITS(last.bits) ---//
7326         hold >>>= last_bits;
7327         bits -= last_bits;
7328         //---//
7329         state.back += last_bits;
7330       }
7331       //--- DROPBITS(here.bits) ---//
7332       hold >>>= here_bits;
7333       bits -= here_bits;
7334       //---//
7335       state.back += here_bits;
7336       if (here_op & 64) {
7337         strm.msg = 'invalid distance code';
7338         state.mode = BAD;
7339         break;
7340       }
7341       state.offset = here_val;
7342       state.extra = (here_op) & 15;
7343       state.mode = DISTEXT;
7344       /* falls through */
7345     case DISTEXT:
7346       if (state.extra) {
7347         //=== NEEDBITS(state.extra);
7348         n = state.extra;
7349         while (bits < n) {
7350           if (have === 0) { break inf_leave; }
7351           have--;
7352           hold += input[next++] << bits;
7353           bits += 8;
7354         }
7355         //===//
7356         state.offset += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;
7357         //--- DROPBITS(state.extra) ---//
7358         hold >>>= state.extra;
7359         bits -= state.extra;
7360         //---//
7361         state.back += state.extra;
7362       }
7363 //#ifdef INFLATE_STRICT
7364       if (state.offset > state.dmax) {
7365         strm.msg = 'invalid distance too far back';
7366         state.mode = BAD;
7367         break;
7368       }
7369 //#endif
7370       //Tracevv((stderr, "inflate:         distance %u\n", state.offset));
7371       state.mode = MATCH;
7372       /* falls through */
7373     case MATCH:
7374       if (left === 0) { break inf_leave; }
7375       copy = _out - left;
7376       if (state.offset > copy) {         /* copy from window */
7377         copy = state.offset - copy;
7378         if (copy > state.whave) {
7379           if (state.sane) {
7380             strm.msg = 'invalid distance too far back';
7381             state.mode = BAD;
7382             break;
7383           }
7384 // (!) This block is disabled in zlib defailts,
7385 // don't enable it for binary compatibility
7386 //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
7387 //          Trace((stderr, "inflate.c too far\n"));
7388 //          copy -= state.whave;
7389 //          if (copy > state.length) { copy = state.length; }
7390 //          if (copy > left) { copy = left; }
7391 //          left -= copy;
7392 //          state.length -= copy;
7393 //          do {
7394 //            output[put++] = 0;
7395 //          } while (--copy);
7396 //          if (state.length === 0) { state.mode = LEN; }
7397 //          break;
7398 //#endif
7399         }
7400         if (copy > state.wnext) {
7401           copy -= state.wnext;
7402           from = state.wsize - copy;
7403         }
7404         else {
7405           from = state.wnext - copy;
7406         }
7407         if (copy > state.length) { copy = state.length; }
7408         from_source = state.window;
7409       }
7410       else {                              /* copy from output */
7411         from_source = output;
7412         from = put - state.offset;
7413         copy = state.length;
7414       }
7415       if (copy > left) { copy = left; }
7416       left -= copy;
7417       state.length -= copy;
7418       do {
7419         output[put++] = from_source[from++];
7420       } while (--copy);
7421       if (state.length === 0) { state.mode = LEN; }
7422       break;
7423     case LIT:
7424       if (left === 0) { break inf_leave; }
7425       output[put++] = state.length;
7426       left--;
7427       state.mode = LEN;
7428       break;
7429     case CHECK:
7430       if (state.wrap) {
7431         //=== NEEDBITS(32);
7432         while (bits < 32) {
7433           if (have === 0) { break inf_leave; }
7434           have--;
7435           // Use '|' insdead of '+' to make sure that result is signed
7436           hold |= input[next++] << bits;
7437           bits += 8;
7438         }
7439         //===//
7440         _out -= left;
7441         strm.total_out += _out;
7442         state.total += _out;
7443         if (_out) {
7444           strm.adler = state.check =
7445               /*UPDATE(state.check, put - _out, _out);*/
7446               (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
7448         }
7449         _out = left;
7450         // NB: crc32 stored as signed 32-bit int, ZSWAP32 returns signed too
7451         if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) {
7452           strm.msg = 'incorrect data check';
7453           state.mode = BAD;
7454           break;
7455         }
7456         //=== INITBITS();
7457         hold = 0;
7458         bits = 0;
7459         //===//
7460         //Tracev((stderr, "inflate:   check matches trailer\n"));
7461       }
7462       state.mode = LENGTH;
7463       /* falls through */
7464     case LENGTH:
7465       if (state.wrap && state.flags) {
7466         //=== NEEDBITS(32);
7467         while (bits < 32) {
7468           if (have === 0) { break inf_leave; }
7469           have--;
7470           hold += input[next++] << bits;
7471           bits += 8;
7472         }
7473         //===//
7474         if (hold !== (state.total & 0xffffffff)) {
7475           strm.msg = 'incorrect length check';
7476           state.mode = BAD;
7477           break;
7478         }
7479         //=== INITBITS();
7480         hold = 0;
7481         bits = 0;
7482         //===//
7483         //Tracev((stderr, "inflate:   length matches trailer\n"));
7484       }
7485       state.mode = DONE;
7486       /* falls through */
7487     case DONE:
7488       ret = Z_STREAM_END;
7489       break inf_leave;
7490     case BAD:
7491       ret = Z_DATA_ERROR;
7492       break inf_leave;
7493     case MEM:
7494       return Z_MEM_ERROR;
7495     case SYNC:
7496       /* falls through */
7497     default:
7498       return Z_STREAM_ERROR;
7499     }
7500   }
7502   // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
7504   /*
7505      Return from inflate(), updating the total counts and the check value.
7506      If there was no progress during the inflate() call, return a buffer
7507      error.  Call updatewindow() to create and/or update the window state.
7508      Note: a memory error from inflate() is non-recoverable.
7509    */
7511   //--- RESTORE() ---
7512   strm.next_out = put;
7513   strm.avail_out = left;
7514   strm.next_in = next;
7515   strm.avail_in = have;
7516   state.hold = hold;
7517   state.bits = bits;
7518   //---
7520   if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
7521                       (state.mode < CHECK || flush !== Z_FINISH))) {
7522     if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
7523       state.mode = MEM;
7524       return Z_MEM_ERROR;
7525     }
7526   }
7527   _in -= strm.avail_in;
7528   _out -= strm.avail_out;
7529   strm.total_in += _in;
7530   strm.total_out += _out;
7531   state.total += _out;
7532   if (state.wrap && _out) {
7533     strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
7534       (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
7535   }
7536   strm.data_type = state.bits + (state.last ? 64 : 0) +
7537                     (state.mode === TYPE ? 128 : 0) +
7538                     (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
7539   if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
7540     ret = Z_BUF_ERROR;
7541   }
7542   return ret;
7545 function inflateEnd(strm) {
7547   if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
7548     return Z_STREAM_ERROR;
7549   }
7551   var state = strm.state;
7552   if (state.window) {
7553     state.window = null;
7554   }
7555   strm.state = null;
7556   return Z_OK;
7559 function inflateGetHeader(strm, head) {
7560   var state;
7562   /* check state */
7563   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
7564   state = strm.state;
7565   if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
7567   /* save header structure */
7568   state.head = head;
7569   head.done = false;
7570   return Z_OK;
7574 exports.inflateReset = inflateReset;
7575 exports.inflateReset2 = inflateReset2;
7576 exports.inflateResetKeep = inflateResetKeep;
7577 exports.inflateInit = inflateInit;
7578 exports.inflateInit2 = inflateInit2;
7579 exports.inflate = inflate;
7580 exports.inflateEnd = inflateEnd;
7581 exports.inflateGetHeader = inflateGetHeader;
7582 exports.inflateInfo = 'pako inflate (from Nodeca project)';
7584 /* Not implemented
7585 exports.inflateCopy = inflateCopy;
7586 exports.inflateGetDictionary = inflateGetDictionary;
7587 exports.inflateMark = inflateMark;
7588 exports.inflatePrime = inflatePrime;
7589 exports.inflateSetDictionary = inflateSetDictionary;
7590 exports.inflateSync = inflateSync;
7591 exports.inflateSyncPoint = inflateSyncPoint;
7592 exports.inflateUndermine = inflateUndermine;
7594 },{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(_dereq_,module,exports){
7595 'use strict';
7598 var utils = _dereq_('../utils/common');
7600 var MAXBITS = 15;
7601 var ENOUGH_LENS = 852;
7602 var ENOUGH_DISTS = 592;
7603 //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
7605 var CODES = 0;
7606 var LENS = 1;
7607 var DISTS = 2;
7609 var lbase = [ /* Length codes 257..285 base */
7610   3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
7611   35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
7614 var lext = [ /* Length codes 257..285 extra */
7615   16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
7616   19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
7619 var dbase = [ /* Distance codes 0..29 base */
7620   1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
7621   257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
7622   8193, 12289, 16385, 24577, 0, 0
7625 var dext = [ /* Distance codes 0..29 extra */
7626   16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
7627   23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
7628   28, 28, 29, 29, 64, 64
7631 module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
7633   var bits = opts.bits;
7634       //here = opts.here; /* table entry for duplication */
7636   var len = 0;               /* a code's length in bits */
7637   var sym = 0;               /* index of code symbols */
7638   var min = 0, max = 0;          /* minimum and maximum code lengths */
7639   var root = 0;              /* number of index bits for root table */
7640   var curr = 0;              /* number of index bits for current table */
7641   var drop = 0;              /* code bits to drop for sub-table */
7642   var left = 0;                   /* number of prefix codes available */
7643   var used = 0;              /* code entries in table used */
7644   var huff = 0;              /* Huffman code */
7645   var incr;              /* for incrementing code, index */
7646   var fill;              /* index for replicating entries */
7647   var low;               /* low bits for current root entry */
7648   var mask;              /* mask for low root bits */
7649   var next;             /* next available space in table */
7650   var base = null;     /* base value table to use */
7651   var base_index = 0;
7652 //  var shoextra;    /* extra bits table to use */
7653   var end;                    /* use base and extra for symbol > end */
7654   var count = new utils.Buf16(MAXBITS+1); //[MAXBITS+1];    /* number of codes of each length */
7655   var offs = new utils.Buf16(MAXBITS+1); //[MAXBITS+1];     /* offsets in table for each length */
7656   var extra = null;
7657   var extra_index = 0;
7659   var here_bits, here_op, here_val;
7661   /*
7662    Process a set of code lengths to create a canonical Huffman code.  The
7663    code lengths are lens[0..codes-1].  Each length corresponds to the
7664    symbols 0..codes-1.  The Huffman code is generated by first sorting the
7665    symbols by length from short to long, and retaining the symbol order
7666    for codes with equal lengths.  Then the code starts with all zero bits
7667    for the first code of the shortest length, and the codes are integer
7668    increments for the same length, and zeros are appended as the length
7669    increases.  For the deflate format, these bits are stored backwards
7670    from their more natural integer increment ordering, and so when the
7671    decoding tables are built in the large loop below, the integer codes
7672    are incremented backwards.
7674    This routine assumes, but does not check, that all of the entries in
7675    lens[] are in the range 0..MAXBITS.  The caller must assure this.
7676    1..MAXBITS is interpreted as that code length.  zero means that that
7677    symbol does not occur in this code.
7679    The codes are sorted by computing a count of codes for each length,
7680    creating from that a table of starting indices for each length in the
7681    sorted table, and then entering the symbols in order in the sorted
7682    table.  The sorted table is work[], with that space being provided by
7683    the caller.
7685    The length counts are used for other purposes as well, i.e. finding
7686    the minimum and maximum length codes, determining if there are any
7687    codes at all, checking for a valid set of lengths, and looking ahead
7688    at length counts to determine sub-table sizes when building the
7689    decoding tables.
7690    */
7692   /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
7693   for (len = 0; len <= MAXBITS; len++) {
7694     count[len] = 0;
7695   }
7696   for (sym = 0; sym < codes; sym++) {
7697     count[lens[lens_index + sym]]++;
7698   }
7700   /* bound code lengths, force root to be within code lengths */
7701   root = bits;
7702   for (max = MAXBITS; max >= 1; max--) {
7703     if (count[max] !== 0) { break; }
7704   }
7705   if (root > max) {
7706     root = max;
7707   }
7708   if (max === 0) {                     /* no symbols to code at all */
7709     //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */
7710     //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;
7711     //table.val[opts.table_index++] = 0;   //here.val = (var short)0;
7712     table[table_index++] = (1 << 24) | (64 << 16) | 0;
7715     //table.op[opts.table_index] = 64;
7716     //table.bits[opts.table_index] = 1;
7717     //table.val[opts.table_index++] = 0;
7718     table[table_index++] = (1 << 24) | (64 << 16) | 0;
7720     opts.bits = 1;
7721     return 0;     /* no symbols, but wait for decoding to report error */
7722   }
7723   for (min = 1; min < max; min++) {
7724     if (count[min] !== 0) { break; }
7725   }
7726   if (root < min) {
7727     root = min;
7728   }
7730   /* check for an over-subscribed or incomplete set of lengths */
7731   left = 1;
7732   for (len = 1; len <= MAXBITS; len++) {
7733     left <<= 1;
7734     left -= count[len];
7735     if (left < 0) {
7736       return -1;
7737     }        /* over-subscribed */
7738   }
7739   if (left > 0 && (type === CODES || max !== 1)) {
7740     return -1;                      /* incomplete set */
7741   }
7743   /* generate offsets into symbol table for each length for sorting */
7744   offs[1] = 0;
7745   for (len = 1; len < MAXBITS; len++) {
7746     offs[len + 1] = offs[len] + count[len];
7747   }
7749   /* sort symbols by length, by symbol order within each length */
7750   for (sym = 0; sym < codes; sym++) {
7751     if (lens[lens_index + sym] !== 0) {
7752       work[offs[lens[lens_index + sym]]++] = sym;
7753     }
7754   }
7756   /*
7757    Create and fill in decoding tables.  In this loop, the table being
7758    filled is at next and has curr index bits.  The code being used is huff
7759    with length len.  That code is converted to an index by dropping drop
7760    bits off of the bottom.  For codes where len is less than drop + curr,
7761    those top drop + curr - len bits are incremented through all values to
7762    fill the table with replicated entries.
7764    root is the number of index bits for the root table.  When len exceeds
7765    root, sub-tables are created pointed to by the root entry with an index
7766    of the low root bits of huff.  This is saved in low to check for when a
7767    new sub-table should be started.  drop is zero when the root table is
7768    being filled, and drop is root when sub-tables are being filled.
7770    When a new sub-table is needed, it is necessary to look ahead in the
7771    code lengths to determine what size sub-table is needed.  The length
7772    counts are used for this, and so count[] is decremented as codes are
7773    entered in the tables.
7775    used keeps track of how many table entries have been allocated from the
7776    provided *table space.  It is checked for LENS and DIST tables against
7777    the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
7778    the initial root table size constants.  See the comments in inftrees.h
7779    for more information.
7781    sym increments through all symbols, and the loop terminates when
7782    all codes of length max, i.e. all codes, have been processed.  This
7783    routine permits incomplete codes, so another loop after this one fills
7784    in the rest of the decoding tables with invalid code markers.
7785    */
7787   /* set up for code type */
7788   // poor man optimization - use if-else instead of switch,
7789   // to avoid deopts in old v8
7790   if (type === CODES) {
7791       base = extra = work;    /* dummy value--not used */
7792       end = 19;
7793   } else if (type === LENS) {
7794       base = lbase;
7795       base_index -= 257;
7796       extra = lext;
7797       extra_index -= 257;
7798       end = 256;
7799   } else {                    /* DISTS */
7800       base = dbase;
7801       extra = dext;
7802       end = -1;
7803   }
7805   /* initialize opts for loop */
7806   huff = 0;                   /* starting code */
7807   sym = 0;                    /* starting code symbol */
7808   len = min;                  /* starting code length */
7809   next = table_index;              /* current table to fill in */
7810   curr = root;                /* current table index bits */
7811   drop = 0;                   /* current bits to drop from code for index */
7812   low = -1;                   /* trigger new sub-table when len > root */
7813   used = 1 << root;          /* use root table entries */
7814   mask = used - 1;            /* mask for comparing low */
7816   /* check available table space */
7817   if ((type === LENS && used > ENOUGH_LENS) ||
7818     (type === DISTS && used > ENOUGH_DISTS)) {
7819     return 1;
7820   }
7822   var i=0;
7823   /* process all codes and make table entries */
7824   for (;;) {
7825     i++;
7826     /* create table entry */
7827     here_bits = len - drop;
7828     if (work[sym] < end) {
7829       here_op = 0;
7830       here_val = work[sym];
7831     }
7832     else if (work[sym] > end) {
7833       here_op = extra[extra_index + work[sym]];
7834       here_val = base[base_index + work[sym]];
7835     }
7836     else {
7837       here_op = 32 + 64;         /* end of block */
7838       here_val = 0;
7839     }
7841     /* replicate for those indices with low len bits equal to huff */
7842     incr = 1 << (len - drop);
7843     fill = 1 << curr;
7844     min = fill;                 /* save offset to next table */
7845     do {
7846       fill -= incr;
7847       table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
7848     } while (fill !== 0);
7850     /* backwards increment the len-bit code huff */
7851     incr = 1 << (len - 1);
7852     while (huff & incr) {
7853       incr >>= 1;
7854     }
7855     if (incr !== 0) {
7856       huff &= incr - 1;
7857       huff += incr;
7858     } else {
7859       huff = 0;
7860     }
7862     /* go to next symbol, update count, len */
7863     sym++;
7864     if (--count[len] === 0) {
7865       if (len === max) { break; }
7866       len = lens[lens_index + work[sym]];
7867     }
7869     /* create new sub-table if needed */
7870     if (len > root && (huff & mask) !== low) {
7871       /* if first time, transition to sub-tables */
7872       if (drop === 0) {
7873         drop = root;
7874       }
7876       /* increment past last table */
7877       next += min;            /* here min is 1 << curr */
7879       /* determine length of next table */
7880       curr = len - drop;
7881       left = 1 << curr;
7882       while (curr + drop < max) {
7883         left -= count[curr + drop];
7884         if (left <= 0) { break; }
7885         curr++;
7886         left <<= 1;
7887       }
7889       /* check for enough space */
7890       used += 1 << curr;
7891       if ((type === LENS && used > ENOUGH_LENS) ||
7892         (type === DISTS && used > ENOUGH_DISTS)) {
7893         return 1;
7894       }
7896       /* point entry in root table to sub-table */
7897       low = huff & mask;
7898       /*table.op[low] = curr;
7899       table.bits[low] = root;
7900       table.val[low] = next - opts.table_index;*/
7901       table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
7902     }
7903   }
7905   /* fill in remaining table entry if code is incomplete (guaranteed to have
7906    at most one remaining entry, since if the code is incomplete, the
7907    maximum code length that was allowed to get this far is one bit) */
7908   if (huff !== 0) {
7909     //table.op[next + huff] = 64;            /* invalid code marker */
7910     //table.bits[next + huff] = len - drop;
7911     //table.val[next + huff] = 0;
7912     table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
7913   }
7915   /* set return parameters */
7916   //opts.table_index += used;
7917   opts.bits = root;
7918   return 0;
7921 },{"../utils/common":27}],37:[function(_dereq_,module,exports){
7922 'use strict';
7924 module.exports = {
7925   '2':    'need dictionary',     /* Z_NEED_DICT       2  */
7926   '1':    'stream end',          /* Z_STREAM_END      1  */
7927   '0':    '',                    /* Z_OK              0  */
7928   '-1':   'file error',          /* Z_ERRNO         (-1) */
7929   '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */
7930   '-3':   'data error',          /* Z_DATA_ERROR    (-3) */
7931   '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */
7932   '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */
7933   '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */
7935 },{}],38:[function(_dereq_,module,exports){
7936 'use strict';
7939 var utils = _dereq_('../utils/common');
7941 /* Public constants ==========================================================*/
7942 /* ===========================================================================*/
7945 //var Z_FILTERED          = 1;
7946 //var Z_HUFFMAN_ONLY      = 2;
7947 //var Z_RLE               = 3;
7948 var Z_FIXED               = 4;
7949 //var Z_DEFAULT_STRATEGY  = 0;
7951 /* Possible values of the data_type field (though see inflate()) */
7952 var Z_BINARY              = 0;
7953 var Z_TEXT                = 1;
7954 //var Z_ASCII             = 1; // = Z_TEXT
7955 var Z_UNKNOWN             = 2;
7957 /*============================================================================*/
7960 function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
7962 // From zutil.h
7964 var STORED_BLOCK = 0;
7965 var STATIC_TREES = 1;
7966 var DYN_TREES    = 2;
7967 /* The three kinds of block type */
7969 var MIN_MATCH    = 3;
7970 var MAX_MATCH    = 258;
7971 /* The minimum and maximum match lengths */
7973 // From deflate.h
7974 /* ===========================================================================
7975  * Internal compression state.
7976  */
7978 var LENGTH_CODES  = 29;
7979 /* number of length codes, not counting the special END_BLOCK code */
7981 var LITERALS      = 256;
7982 /* number of literal bytes 0..255 */
7984 var L_CODES       = LITERALS + 1 + LENGTH_CODES;
7985 /* number of Literal or Length codes, including the END_BLOCK code */
7987 var D_CODES       = 30;
7988 /* number of distance codes */
7990 var BL_CODES      = 19;
7991 /* number of codes used to transfer the bit lengths */
7993 var HEAP_SIZE     = 2*L_CODES + 1;
7994 /* maximum heap size */
7996 var MAX_BITS      = 15;
7997 /* All codes must not exceed MAX_BITS bits */
7999 var Buf_size      = 16;
8000 /* size of bit buffer in bi_buf */
8003 /* ===========================================================================
8004  * Constants
8005  */
8007 var MAX_BL_BITS = 7;
8008 /* Bit length codes must not exceed MAX_BL_BITS bits */
8010 var END_BLOCK   = 256;
8011 /* end of block literal code */
8013 var REP_3_6     = 16;
8014 /* repeat previous bit length 3-6 times (2 bits of repeat count) */
8016 var REPZ_3_10   = 17;
8017 /* repeat a zero length 3-10 times  (3 bits of repeat count) */
8019 var REPZ_11_138 = 18;
8020 /* repeat a zero length 11-138 times  (7 bits of repeat count) */
8022 var extra_lbits =   /* extra bits for each length code */
8023   [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];
8025 var extra_dbits =   /* extra bits for each distance code */
8026   [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];
8028 var extra_blbits =  /* extra bits for each bit length code */
8029   [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
8031 var bl_order =
8032   [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
8033 /* The lengths of the bit length codes are sent in order of decreasing
8034  * probability, to avoid transmitting the lengths for unused bit length codes.
8035  */
8037 /* ===========================================================================
8038  * Local data. These are initialized only once.
8039  */
8041 // We pre-fill arrays with 0 to avoid uninitialized gaps
8043 var DIST_CODE_LEN = 512; /* see definition of array dist_code below */
8045 // !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1
8046 var static_ltree  = new Array((L_CODES+2) * 2);
8047 zero(static_ltree);
8048 /* The static literal tree. Since the bit lengths are imposed, there is no
8049  * need for the L_CODES extra codes used during heap construction. However
8050  * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
8051  * below).
8052  */
8054 var static_dtree  = new Array(D_CODES * 2);
8055 zero(static_dtree);
8056 /* The static distance tree. (Actually a trivial tree since all codes use
8057  * 5 bits.)
8058  */
8060 var _dist_code    = new Array(DIST_CODE_LEN);
8061 zero(_dist_code);
8062 /* Distance codes. The first 256 values correspond to the distances
8063  * 3 .. 258, the last 256 values correspond to the top 8 bits of
8064  * the 15 bit distances.
8065  */
8067 var _length_code  = new Array(MAX_MATCH-MIN_MATCH+1);
8068 zero(_length_code);
8069 /* length code for each normalized match length (0 == MIN_MATCH) */
8071 var base_length   = new Array(LENGTH_CODES);
8072 zero(base_length);
8073 /* First normalized length for each code (0 = MIN_MATCH) */
8075 var base_dist     = new Array(D_CODES);
8076 zero(base_dist);
8077 /* First normalized distance for each code (0 = distance of 1) */
8080 var StaticTreeDesc = function (static_tree, extra_bits, extra_base, elems, max_length) {
8082   this.static_tree  = static_tree;  /* static tree or NULL */
8083   this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */
8084   this.extra_base   = extra_base;   /* base index for extra_bits */
8085   this.elems        = elems;        /* max number of elements in the tree */
8086   this.max_length   = max_length;   /* max bit length for the codes */
8088   // show if `static_tree` has data or dummy - needed for monomorphic objects
8089   this.has_stree    = static_tree && static_tree.length;
8093 var static_l_desc;
8094 var static_d_desc;
8095 var static_bl_desc;
8098 var TreeDesc = function(dyn_tree, stat_desc) {
8099   this.dyn_tree = dyn_tree;     /* the dynamic tree */
8100   this.max_code = 0;            /* largest code with non zero frequency */
8101   this.stat_desc = stat_desc;   /* the corresponding static tree */
8106 function d_code(dist) {
8107   return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
8111 /* ===========================================================================
8112  * Output a short LSB first on the stream.
8113  * IN assertion: there is enough room in pendingBuf.
8114  */
8115 function put_short (s, w) {
8116 //    put_byte(s, (uch)((w) & 0xff));
8117 //    put_byte(s, (uch)((ush)(w) >> 8));
8118   s.pending_buf[s.pending++] = (w) & 0xff;
8119   s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
8123 /* ===========================================================================
8124  * Send a value on a given number of bits.
8125  * IN assertion: length <= 16 and value fits in length bits.
8126  */
8127 function send_bits(s, value, length) {
8128   if (s.bi_valid > (Buf_size - length)) {
8129     s.bi_buf |= (value << s.bi_valid) & 0xffff;
8130     put_short(s, s.bi_buf);
8131     s.bi_buf = value >> (Buf_size - s.bi_valid);
8132     s.bi_valid += length - Buf_size;
8133   } else {
8134     s.bi_buf |= (value << s.bi_valid) & 0xffff;
8135     s.bi_valid += length;
8136   }
8140 function send_code(s, c, tree) {
8141   send_bits(s, tree[c*2]/*.Code*/, tree[c*2 + 1]/*.Len*/);
8145 /* ===========================================================================
8146  * Reverse the first len bits of a code, using straightforward code (a faster
8147  * method would use a table)
8148  * IN assertion: 1 <= len <= 15
8149  */
8150 function bi_reverse(code, len) {
8151   var res = 0;
8152   do {
8153     res |= code & 1;
8154     code >>>= 1;
8155     res <<= 1;
8156   } while (--len > 0);
8157   return res >>> 1;
8161 /* ===========================================================================
8162  * Flush the bit buffer, keeping at most 7 bits in it.
8163  */
8164 function bi_flush(s) {
8165   if (s.bi_valid === 16) {
8166     put_short(s, s.bi_buf);
8167     s.bi_buf = 0;
8168     s.bi_valid = 0;
8170   } else if (s.bi_valid >= 8) {
8171     s.pending_buf[s.pending++] = s.bi_buf & 0xff;
8172     s.bi_buf >>= 8;
8173     s.bi_valid -= 8;
8174   }
8178 /* ===========================================================================
8179  * Compute the optimal bit lengths for a tree and update the total bit length
8180  * for the current block.
8181  * IN assertion: the fields freq and dad are set, heap[heap_max] and
8182  *    above are the tree nodes sorted by increasing frequency.
8183  * OUT assertions: the field len is set to the optimal bit length, the
8184  *     array bl_count contains the frequencies for each bit length.
8185  *     The length opt_len is updated; static_len is also updated if stree is
8186  *     not null.
8187  */
8188 function gen_bitlen(s, desc)
8189 //    deflate_state *s;
8190 //    tree_desc *desc;    /* the tree descriptor */
8192   var tree            = desc.dyn_tree;
8193   var max_code        = desc.max_code;
8194   var stree           = desc.stat_desc.static_tree;
8195   var has_stree       = desc.stat_desc.has_stree;
8196   var extra           = desc.stat_desc.extra_bits;
8197   var base            = desc.stat_desc.extra_base;
8198   var max_length      = desc.stat_desc.max_length;
8199   var h;              /* heap index */
8200   var n, m;           /* iterate over the tree elements */
8201   var bits;           /* bit length */
8202   var xbits;          /* extra bits */
8203   var f;              /* frequency */
8204   var overflow = 0;   /* number of elements with bit length too large */
8206   for (bits = 0; bits <= MAX_BITS; bits++) {
8207     s.bl_count[bits] = 0;
8208   }
8210   /* In a first pass, compute the optimal bit lengths (which may
8211    * overflow in the case of the bit length tree).
8212    */
8213   tree[s.heap[s.heap_max]*2 + 1]/*.Len*/ = 0; /* root of the heap */
8215   for (h = s.heap_max+1; h < HEAP_SIZE; h++) {
8216     n = s.heap[h];
8217     bits = tree[tree[n*2 +1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
8218     if (bits > max_length) {
8219       bits = max_length;
8220       overflow++;
8221     }
8222     tree[n*2 + 1]/*.Len*/ = bits;
8223     /* We overwrite tree[n].Dad which is no longer needed */
8225     if (n > max_code) { continue; } /* not a leaf node */
8227     s.bl_count[bits]++;
8228     xbits = 0;
8229     if (n >= base) {
8230       xbits = extra[n-base];
8231     }
8232     f = tree[n * 2]/*.Freq*/;
8233     s.opt_len += f * (bits + xbits);
8234     if (has_stree) {
8235       s.static_len += f * (stree[n*2 + 1]/*.Len*/ + xbits);
8236     }
8237   }
8238   if (overflow === 0) { return; }
8240   // Trace((stderr,"\nbit length overflow\n"));
8241   /* This happens for example on obj2 and pic of the Calgary corpus */
8243   /* Find the first bit length which could increase: */
8244   do {
8245     bits = max_length-1;
8246     while (s.bl_count[bits] === 0) { bits--; }
8247     s.bl_count[bits]--;      /* move one leaf down the tree */
8248     s.bl_count[bits+1] += 2; /* move one overflow item as its brother */
8249     s.bl_count[max_length]--;
8250     /* The brother of the overflow item also moves one step up,
8251      * but this does not affect bl_count[max_length]
8252      */
8253     overflow -= 2;
8254   } while (overflow > 0);
8256   /* Now recompute all bit lengths, scanning in increasing frequency.
8257    * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
8258    * lengths instead of fixing only the wrong ones. This idea is taken
8259    * from 'ar' written by Haruhiko Okumura.)
8260    */
8261   for (bits = max_length; bits !== 0; bits--) {
8262     n = s.bl_count[bits];
8263     while (n !== 0) {
8264       m = s.heap[--h];
8265       if (m > max_code) { continue; }
8266       if (tree[m*2 + 1]/*.Len*/ !== bits) {
8267         // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
8268         s.opt_len += (bits - tree[m*2 + 1]/*.Len*/)*tree[m*2]/*.Freq*/;
8269         tree[m*2 + 1]/*.Len*/ = bits;
8270       }
8271       n--;
8272     }
8273   }
8277 /* ===========================================================================
8278  * Generate the codes for a given tree and bit counts (which need not be
8279  * optimal).
8280  * IN assertion: the array bl_count contains the bit length statistics for
8281  * the given tree and the field len is set for all tree elements.
8282  * OUT assertion: the field code is set for all tree elements of non
8283  *     zero code length.
8284  */
8285 function gen_codes(tree, max_code, bl_count)
8286 //    ct_data *tree;             /* the tree to decorate */
8287 //    int max_code;              /* largest code with non zero frequency */
8288 //    ushf *bl_count;            /* number of codes at each bit length */
8290   var next_code = new Array(MAX_BITS+1); /* next code value for each bit length */
8291   var code = 0;              /* running code value */
8292   var bits;                  /* bit index */
8293   var n;                     /* code index */
8295   /* The distribution counts are first used to generate the code values
8296    * without bit reversal.
8297    */
8298   for (bits = 1; bits <= MAX_BITS; bits++) {
8299     next_code[bits] = code = (code + bl_count[bits-1]) << 1;
8300   }
8301   /* Check that the bit counts in bl_count are consistent. The last code
8302    * must be all ones.
8303    */
8304   //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
8305   //        "inconsistent bit counts");
8306   //Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
8308   for (n = 0;  n <= max_code; n++) {
8309     var len = tree[n*2 + 1]/*.Len*/;
8310     if (len === 0) { continue; }
8311     /* Now reverse the bits */
8312     tree[n*2]/*.Code*/ = bi_reverse(next_code[len]++, len);
8314     //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
8315     //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
8316   }
8320 /* ===========================================================================
8321  * Initialize the various 'constant' tables.
8322  */
8323 function tr_static_init() {
8324   var n;        /* iterates over tree elements */
8325   var bits;     /* bit counter */
8326   var length;   /* length value */
8327   var code;     /* code value */
8328   var dist;     /* distance index */
8329   var bl_count = new Array(MAX_BITS+1);
8330   /* number of codes at each bit length for an optimal tree */
8332   // do check in _tr_init()
8333   //if (static_init_done) return;
8335   /* For some embedded targets, global variables are not initialized: */
8336 /*#ifdef NO_INIT_GLOBAL_POINTERS
8337   static_l_desc.static_tree = static_ltree;
8338   static_l_desc.extra_bits = extra_lbits;
8339   static_d_desc.static_tree = static_dtree;
8340   static_d_desc.extra_bits = extra_dbits;
8341   static_bl_desc.extra_bits = extra_blbits;
8342 #endif*/
8344   /* Initialize the mapping length (0..255) -> length code (0..28) */
8345   length = 0;
8346   for (code = 0; code < LENGTH_CODES-1; code++) {
8347     base_length[code] = length;
8348     for (n = 0; n < (1<<extra_lbits[code]); n++) {
8349       _length_code[length++] = code;
8350     }
8351   }
8352   //Assert (length == 256, "tr_static_init: length != 256");
8353   /* Note that the length 255 (match length 258) can be represented
8354    * in two different ways: code 284 + 5 bits or code 285, so we
8355    * overwrite length_code[255] to use the best encoding:
8356    */
8357   _length_code[length-1] = code;
8359   /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
8360   dist = 0;
8361   for (code = 0 ; code < 16; code++) {
8362     base_dist[code] = dist;
8363     for (n = 0; n < (1<<extra_dbits[code]); n++) {
8364       _dist_code[dist++] = code;
8365     }
8366   }
8367   //Assert (dist == 256, "tr_static_init: dist != 256");
8368   dist >>= 7; /* from now on, all distances are divided by 128 */
8369   for ( ; code < D_CODES; code++) {
8370     base_dist[code] = dist << 7;
8371     for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
8372       _dist_code[256 + dist++] = code;
8373     }
8374   }
8375   //Assert (dist == 256, "tr_static_init: 256+dist != 512");
8377   /* Construct the codes of the static literal tree */
8378   for (bits = 0; bits <= MAX_BITS; bits++) {
8379     bl_count[bits] = 0;
8380   }
8382   n = 0;
8383   while (n <= 143) {
8384     static_ltree[n*2 + 1]/*.Len*/ = 8;
8385     n++;
8386     bl_count[8]++;
8387   }
8388   while (n <= 255) {
8389     static_ltree[n*2 + 1]/*.Len*/ = 9;
8390     n++;
8391     bl_count[9]++;
8392   }
8393   while (n <= 279) {
8394     static_ltree[n*2 + 1]/*.Len*/ = 7;
8395     n++;
8396     bl_count[7]++;
8397   }
8398   while (n <= 287) {
8399     static_ltree[n*2 + 1]/*.Len*/ = 8;
8400     n++;
8401     bl_count[8]++;
8402   }
8403   /* Codes 286 and 287 do not exist, but we must include them in the
8404    * tree construction to get a canonical Huffman tree (longest code
8405    * all ones)
8406    */
8407   gen_codes(static_ltree, L_CODES+1, bl_count);
8409   /* The static distance tree is trivial: */
8410   for (n = 0; n < D_CODES; n++) {
8411     static_dtree[n*2 + 1]/*.Len*/ = 5;
8412     static_dtree[n*2]/*.Code*/ = bi_reverse(n, 5);
8413   }
8415   // Now data ready and we can init static trees
8416   static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS);
8417   static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);
8418   static_bl_desc =new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);
8420   //static_init_done = true;
8424 /* ===========================================================================
8425  * Initialize a new block.
8426  */
8427 function init_block(s) {
8428   var n; /* iterates over tree elements */
8430   /* Initialize the trees. */
8431   for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n*2]/*.Freq*/ = 0; }
8432   for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n*2]/*.Freq*/ = 0; }
8433   for (n = 0; n < BL_CODES; n++) { s.bl_tree[n*2]/*.Freq*/ = 0; }
8435   s.dyn_ltree[END_BLOCK*2]/*.Freq*/ = 1;
8436   s.opt_len = s.static_len = 0;
8437   s.last_lit = s.matches = 0;
8441 /* ===========================================================================
8442  * Flush the bit buffer and align the output on a byte boundary
8443  */
8444 function bi_windup(s)
8446   if (s.bi_valid > 8) {
8447     put_short(s, s.bi_buf);
8448   } else if (s.bi_valid > 0) {
8449     //put_byte(s, (Byte)s->bi_buf);
8450     s.pending_buf[s.pending++] = s.bi_buf;
8451   }
8452   s.bi_buf = 0;
8453   s.bi_valid = 0;
8456 /* ===========================================================================
8457  * Copy a stored block, storing first the length and its
8458  * one's complement if requested.
8459  */
8460 function copy_block(s, buf, len, header)
8461 //DeflateState *s;
8462 //charf    *buf;    /* the input data */
8463 //unsigned len;     /* its length */
8464 //int      header;  /* true if block header must be written */
8466   bi_windup(s);        /* align on byte boundary */
8468   if (header) {
8469     put_short(s, len);
8470     put_short(s, ~len);
8471   }
8472 //  while (len--) {
8473 //    put_byte(s, *buf++);
8474 //  }
8475   utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
8476   s.pending += len;
8479 /* ===========================================================================
8480  * Compares to subtrees, using the tree depth as tie breaker when
8481  * the subtrees have equal frequency. This minimizes the worst case length.
8482  */
8483 function smaller(tree, n, m, depth) {
8484   var _n2 = n*2;
8485   var _m2 = m*2;
8486   return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
8487          (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
8490 /* ===========================================================================
8491  * Restore the heap property by moving down the tree starting at node k,
8492  * exchanging a node with the smallest of its two sons if necessary, stopping
8493  * when the heap property is re-established (each father smaller than its
8494  * two sons).
8495  */
8496 function pqdownheap(s, tree, k)
8497 //    deflate_state *s;
8498 //    ct_data *tree;  /* the tree to restore */
8499 //    int k;               /* node to move down */
8501   var v = s.heap[k];
8502   var j = k << 1;  /* left son of k */
8503   while (j <= s.heap_len) {
8504     /* Set j to the smallest of the two sons: */
8505     if (j < s.heap_len &&
8506       smaller(tree, s.heap[j+1], s.heap[j], s.depth)) {
8507       j++;
8508     }
8509     /* Exit if v is smaller than both sons */
8510     if (smaller(tree, v, s.heap[j], s.depth)) { break; }
8512     /* Exchange v with the smallest son */
8513     s.heap[k] = s.heap[j];
8514     k = j;
8516     /* And continue down the tree, setting j to the left son of k */
8517     j <<= 1;
8518   }
8519   s.heap[k] = v;
8523 // inlined manually
8524 // var SMALLEST = 1;
8526 /* ===========================================================================
8527  * Send the block data compressed using the given Huffman trees
8528  */
8529 function compress_block(s, ltree, dtree)
8530 //    deflate_state *s;
8531 //    const ct_data *ltree; /* literal tree */
8532 //    const ct_data *dtree; /* distance tree */
8534   var dist;           /* distance of matched string */
8535   var lc;             /* match length or unmatched char (if dist == 0) */
8536   var lx = 0;         /* running index in l_buf */
8537   var code;           /* the code to send */
8538   var extra;          /* number of extra bits to send */
8540   if (s.last_lit !== 0) {
8541     do {
8542       dist = (s.pending_buf[s.d_buf + lx*2] << 8) | (s.pending_buf[s.d_buf + lx*2 + 1]);
8543       lc = s.pending_buf[s.l_buf + lx];
8544       lx++;
8546       if (dist === 0) {
8547         send_code(s, lc, ltree); /* send a literal byte */
8548         //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
8549       } else {
8550         /* Here, lc is the match length - MIN_MATCH */
8551         code = _length_code[lc];
8552         send_code(s, code+LITERALS+1, ltree); /* send the length code */
8553         extra = extra_lbits[code];
8554         if (extra !== 0) {
8555           lc -= base_length[code];
8556           send_bits(s, lc, extra);       /* send the extra length bits */
8557         }
8558         dist--; /* dist is now the match distance - 1 */
8559         code = d_code(dist);
8560         //Assert (code < D_CODES, "bad d_code");
8562         send_code(s, code, dtree);       /* send the distance code */
8563         extra = extra_dbits[code];
8564         if (extra !== 0) {
8565           dist -= base_dist[code];
8566           send_bits(s, dist, extra);   /* send the extra distance bits */
8567         }
8568       } /* literal or match pair ? */
8570       /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
8571       //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
8572       //       "pendingBuf overflow");
8574     } while (lx < s.last_lit);
8575   }
8577   send_code(s, END_BLOCK, ltree);
8581 /* ===========================================================================
8582  * Construct one Huffman tree and assigns the code bit strings and lengths.
8583  * Update the total bit length for the current block.
8584  * IN assertion: the field freq is set for all tree elements.
8585  * OUT assertions: the fields len and code are set to the optimal bit length
8586  *     and corresponding code. The length opt_len is updated; static_len is
8587  *     also updated if stree is not null. The field max_code is set.
8588  */
8589 function build_tree(s, desc)
8590 //    deflate_state *s;
8591 //    tree_desc *desc; /* the tree descriptor */
8593   var tree     = desc.dyn_tree;
8594   var stree    = desc.stat_desc.static_tree;
8595   var has_stree = desc.stat_desc.has_stree;
8596   var elems    = desc.stat_desc.elems;
8597   var n, m;          /* iterate over heap elements */
8598   var max_code = -1; /* largest code with non zero frequency */
8599   var node;          /* new node being created */
8601   /* Construct the initial heap, with least frequent element in
8602    * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
8603    * heap[0] is not used.
8604    */
8605   s.heap_len = 0;
8606   s.heap_max = HEAP_SIZE;
8608   for (n = 0; n < elems; n++) {
8609     if (tree[n * 2]/*.Freq*/ !== 0) {
8610       s.heap[++s.heap_len] = max_code = n;
8611       s.depth[n] = 0;
8613     } else {
8614       tree[n*2 + 1]/*.Len*/ = 0;
8615     }
8616   }
8618   /* The pkzip format requires that at least one distance code exists,
8619    * and that at least one bit should be sent even if there is only one
8620    * possible code. So to avoid special checks later on we force at least
8621    * two codes of non zero frequency.
8622    */
8623   while (s.heap_len < 2) {
8624     node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
8625     tree[node * 2]/*.Freq*/ = 1;
8626     s.depth[node] = 0;
8627     s.opt_len--;
8629     if (has_stree) {
8630       s.static_len -= stree[node*2 + 1]/*.Len*/;
8631     }
8632     /* node is 0 or 1 so it does not have extra bits */
8633   }
8634   desc.max_code = max_code;
8636   /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
8637    * establish sub-heaps of increasing lengths:
8638    */
8639   for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }
8641   /* Construct the Huffman tree by repeatedly combining the least two
8642    * frequent nodes.
8643    */
8644   node = elems;              /* next internal node of the tree */
8645   do {
8646     //pqremove(s, tree, n);  /* n = node of least frequency */
8647     /*** pqremove ***/
8648     n = s.heap[1/*SMALLEST*/];
8649     s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
8650     pqdownheap(s, tree, 1/*SMALLEST*/);
8651     /***/
8653     m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
8655     s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
8656     s.heap[--s.heap_max] = m;
8658     /* Create a new node father of n and m */
8659     tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
8660     s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
8661     tree[n*2 + 1]/*.Dad*/ = tree[m*2 + 1]/*.Dad*/ = node;
8663     /* and insert the new node in the heap */
8664     s.heap[1/*SMALLEST*/] = node++;
8665     pqdownheap(s, tree, 1/*SMALLEST*/);
8667   } while (s.heap_len >= 2);
8669   s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
8671   /* At this point, the fields freq and dad are set. We can now
8672    * generate the bit lengths.
8673    */
8674   gen_bitlen(s, desc);
8676   /* The field len is now set, we can generate the bit codes */
8677   gen_codes(tree, max_code, s.bl_count);
8681 /* ===========================================================================
8682  * Scan a literal or distance tree to determine the frequencies of the codes
8683  * in the bit length tree.
8684  */
8685 function scan_tree(s, tree, max_code)
8686 //    deflate_state *s;
8687 //    ct_data *tree;   /* the tree to be scanned */
8688 //    int max_code;    /* and its largest code of non zero frequency */
8690   var n;                     /* iterates over all tree elements */
8691   var prevlen = -1;          /* last emitted length */
8692   var curlen;                /* length of current code */
8694   var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */
8696   var count = 0;             /* repeat count of the current code */
8697   var max_count = 7;         /* max repeat count */
8698   var min_count = 4;         /* min repeat count */
8700   if (nextlen === 0) {
8701     max_count = 138;
8702     min_count = 3;
8703   }
8704   tree[(max_code+1)*2 + 1]/*.Len*/ = 0xffff; /* guard */
8706   for (n = 0; n <= max_code; n++) {
8707     curlen = nextlen;
8708     nextlen = tree[(n+1)*2 + 1]/*.Len*/;
8710     if (++count < max_count && curlen === nextlen) {
8711       continue;
8713     } else if (count < min_count) {
8714       s.bl_tree[curlen * 2]/*.Freq*/ += count;
8716     } else if (curlen !== 0) {
8718       if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
8719       s.bl_tree[REP_3_6*2]/*.Freq*/++;
8721     } else if (count <= 10) {
8722       s.bl_tree[REPZ_3_10*2]/*.Freq*/++;
8724     } else {
8725       s.bl_tree[REPZ_11_138*2]/*.Freq*/++;
8726     }
8728     count = 0;
8729     prevlen = curlen;
8731     if (nextlen === 0) {
8732       max_count = 138;
8733       min_count = 3;
8735     } else if (curlen === nextlen) {
8736       max_count = 6;
8737       min_count = 3;
8739     } else {
8740       max_count = 7;
8741       min_count = 4;
8742     }
8743   }
8747 /* ===========================================================================
8748  * Send a literal or distance tree in compressed form, using the codes in
8749  * bl_tree.
8750  */
8751 function send_tree(s, tree, max_code)
8752 //    deflate_state *s;
8753 //    ct_data *tree; /* the tree to be scanned */
8754 //    int max_code;       /* and its largest code of non zero frequency */
8756   var n;                     /* iterates over all tree elements */
8757   var prevlen = -1;          /* last emitted length */
8758   var curlen;                /* length of current code */
8760   var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */
8762   var count = 0;             /* repeat count of the current code */
8763   var max_count = 7;         /* max repeat count */
8764   var min_count = 4;         /* min repeat count */
8766   /* tree[max_code+1].Len = -1; */  /* guard already set */
8767   if (nextlen === 0) {
8768     max_count = 138;
8769     min_count = 3;
8770   }
8772   for (n = 0; n <= max_code; n++) {
8773     curlen = nextlen;
8774     nextlen = tree[(n+1)*2 + 1]/*.Len*/;
8776     if (++count < max_count && curlen === nextlen) {
8777       continue;
8779     } else if (count < min_count) {
8780       do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);
8782     } else if (curlen !== 0) {
8783       if (curlen !== prevlen) {
8784         send_code(s, curlen, s.bl_tree);
8785         count--;
8786       }
8787       //Assert(count >= 3 && count <= 6, " 3_6?");
8788       send_code(s, REP_3_6, s.bl_tree);
8789       send_bits(s, count-3, 2);
8791     } else if (count <= 10) {
8792       send_code(s, REPZ_3_10, s.bl_tree);
8793       send_bits(s, count-3, 3);
8795     } else {
8796       send_code(s, REPZ_11_138, s.bl_tree);
8797       send_bits(s, count-11, 7);
8798     }
8800     count = 0;
8801     prevlen = curlen;
8802     if (nextlen === 0) {
8803       max_count = 138;
8804       min_count = 3;
8806     } else if (curlen === nextlen) {
8807       max_count = 6;
8808       min_count = 3;
8810     } else {
8811       max_count = 7;
8812       min_count = 4;
8813     }
8814   }
8818 /* ===========================================================================
8819  * Construct the Huffman tree for the bit lengths and return the index in
8820  * bl_order of the last bit length code to send.
8821  */
8822 function build_bl_tree(s) {
8823   var max_blindex;  /* index of last bit length code of non zero freq */
8825   /* Determine the bit length frequencies for literal and distance trees */
8826   scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
8827   scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
8829   /* Build the bit length tree: */
8830   build_tree(s, s.bl_desc);
8831   /* opt_len now includes the length of the tree representations, except
8832    * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
8833    */
8835   /* Determine the number of bit length codes to send. The pkzip format
8836    * requires that at least 4 bit length codes be sent. (appnote.txt says
8837    * 3 but the actual value used is 4.)
8838    */
8839   for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
8840     if (s.bl_tree[bl_order[max_blindex]*2 + 1]/*.Len*/ !== 0) {
8841       break;
8842     }
8843   }
8844   /* Update opt_len to include the bit length tree and counts */
8845   s.opt_len += 3*(max_blindex+1) + 5+5+4;
8846   //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
8847   //        s->opt_len, s->static_len));
8849   return max_blindex;
8853 /* ===========================================================================
8854  * Send the header for a block using dynamic Huffman trees: the counts, the
8855  * lengths of the bit length codes, the literal tree and the distance tree.
8856  * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
8857  */
8858 function send_all_trees(s, lcodes, dcodes, blcodes)
8859 //    deflate_state *s;
8860 //    int lcodes, dcodes, blcodes; /* number of codes for each tree */
8862   var rank;                    /* index in bl_order */
8864   //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
8865   //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
8866   //        "too many codes");
8867   //Tracev((stderr, "\nbl counts: "));
8868   send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
8869   send_bits(s, dcodes-1,   5);
8870   send_bits(s, blcodes-4,  4); /* not -3 as stated in appnote.txt */
8871   for (rank = 0; rank < blcodes; rank++) {
8872     //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
8873     send_bits(s, s.bl_tree[bl_order[rank]*2 + 1]/*.Len*/, 3);
8874   }
8875   //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
8877   send_tree(s, s.dyn_ltree, lcodes-1); /* literal tree */
8878   //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
8880   send_tree(s, s.dyn_dtree, dcodes-1); /* distance tree */
8881   //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
8885 /* ===========================================================================
8886  * Check if the data type is TEXT or BINARY, using the following algorithm:
8887  * - TEXT if the two conditions below are satisfied:
8888  *    a) There are no non-portable control characters belonging to the
8889  *       "black list" (0..6, 14..25, 28..31).
8890  *    b) There is at least one printable character belonging to the
8891  *       "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
8892  * - BINARY otherwise.
8893  * - The following partially-portable control characters form a
8894  *   "gray list" that is ignored in this detection algorithm:
8895  *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
8896  * IN assertion: the fields Freq of dyn_ltree are set.
8897  */
8898 function detect_data_type(s) {
8899   /* black_mask is the bit mask of black-listed bytes
8900    * set bits 0..6, 14..25, and 28..31
8901    * 0xf3ffc07f = binary 11110011111111111100000001111111
8902    */
8903   var black_mask = 0xf3ffc07f;
8904   var n;
8906   /* Check for non-textual ("black-listed") bytes. */
8907   for (n = 0; n <= 31; n++, black_mask >>>= 1) {
8908     if ((black_mask & 1) && (s.dyn_ltree[n*2]/*.Freq*/ !== 0)) {
8909       return Z_BINARY;
8910     }
8911   }
8913   /* Check for textual ("white-listed") bytes. */
8914   if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
8915       s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
8916     return Z_TEXT;
8917   }
8918   for (n = 32; n < LITERALS; n++) {
8919     if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
8920       return Z_TEXT;
8921     }
8922   }
8924   /* There are no "black-listed" or "white-listed" bytes:
8925    * this stream either is empty or has tolerated ("gray-listed") bytes only.
8926    */
8927   return Z_BINARY;
8931 var static_init_done = false;
8933 /* ===========================================================================
8934  * Initialize the tree data structures for a new zlib stream.
8935  */
8936 function _tr_init(s)
8939   if (!static_init_done) {
8940     tr_static_init();
8941     static_init_done = true;
8942   }
8944   s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);
8945   s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);
8946   s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
8948   s.bi_buf = 0;
8949   s.bi_valid = 0;
8951   /* Initialize the first block of the first file: */
8952   init_block(s);
8956 /* ===========================================================================
8957  * Send a stored block
8958  */
8959 function _tr_stored_block(s, buf, stored_len, last)
8960 //DeflateState *s;
8961 //charf *buf;       /* input block */
8962 //ulg stored_len;   /* length of input block */
8963 //int last;         /* one if this is the last block for a file */
8965   send_bits(s, (STORED_BLOCK<<1)+(last ? 1 : 0), 3);    /* send block type */
8966   copy_block(s, buf, stored_len, true); /* with header */
8970 /* ===========================================================================
8971  * Send one empty static block to give enough lookahead for inflate.
8972  * This takes 10 bits, of which 7 may remain in the bit buffer.
8973  */
8974 function _tr_align(s) {
8975   send_bits(s, STATIC_TREES<<1, 3);
8976   send_code(s, END_BLOCK, static_ltree);
8977   bi_flush(s);
8981 /* ===========================================================================
8982  * Determine the best encoding for the current block: dynamic trees, static
8983  * trees or store, and output the encoded block to the zip file.
8984  */
8985 function _tr_flush_block(s, buf, stored_len, last)
8986 //DeflateState *s;
8987 //charf *buf;       /* input block, or NULL if too old */
8988 //ulg stored_len;   /* length of input block */
8989 //int last;         /* one if this is the last block for a file */
8991   var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */
8992   var max_blindex = 0;        /* index of last bit length code of non zero freq */
8994   /* Build the Huffman trees unless a stored block is forced */
8995   if (s.level > 0) {
8997     /* Check if the file is binary or text */
8998     if (s.strm.data_type === Z_UNKNOWN) {
8999       s.strm.data_type = detect_data_type(s);
9000     }
9002     /* Construct the literal and distance trees */
9003     build_tree(s, s.l_desc);
9004     // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
9005     //        s->static_len));
9007     build_tree(s, s.d_desc);
9008     // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
9009     //        s->static_len));
9010     /* At this point, opt_len and static_len are the total bit lengths of
9011      * the compressed block data, excluding the tree representations.
9012      */
9014     /* Build the bit length tree for the above two trees, and get the index
9015      * in bl_order of the last bit length code to send.
9016      */
9017     max_blindex = build_bl_tree(s);
9019     /* Determine the best encoding. Compute the block lengths in bytes. */
9020     opt_lenb = (s.opt_len+3+7) >>> 3;
9021     static_lenb = (s.static_len+3+7) >>> 3;
9023     // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
9024     //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
9025     //        s->last_lit));
9027     if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
9029   } else {
9030     // Assert(buf != (char*)0, "lost buf");
9031     opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
9032   }
9034   if ((stored_len+4 <= opt_lenb) && (buf !== -1)) {
9035     /* 4: two words for the lengths */
9037     /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
9038      * Otherwise we can't have processed more than WSIZE input bytes since
9039      * the last block flush, because compression would have been
9040      * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
9041      * transform a block into a stored block.
9042      */
9043     _tr_stored_block(s, buf, stored_len, last);
9045   } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
9047     send_bits(s, (STATIC_TREES<<1) + (last ? 1 : 0), 3);
9048     compress_block(s, static_ltree, static_dtree);
9050   } else {
9051     send_bits(s, (DYN_TREES<<1) + (last ? 1 : 0), 3);
9052     send_all_trees(s, s.l_desc.max_code+1, s.d_desc.max_code+1, max_blindex+1);
9053     compress_block(s, s.dyn_ltree, s.dyn_dtree);
9054   }
9055   // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
9056   /* The above check is made mod 2^32, for files larger than 512 MB
9057    * and uLong implemented on 32 bits.
9058    */
9059   init_block(s);
9061   if (last) {
9062     bi_windup(s);
9063   }
9064   // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
9065   //       s->compressed_len-7*last));
9068 /* ===========================================================================
9069  * Save the match info and tally the frequency counts. Return true if
9070  * the current block must be flushed.
9071  */
9072 function _tr_tally(s, dist, lc)
9073 //    deflate_state *s;
9074 //    unsigned dist;  /* distance of matched string */
9075 //    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
9077   //var out_length, in_length, dcode;
9079   s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;
9080   s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;
9082   s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
9083   s.last_lit++;
9085   if (dist === 0) {
9086     /* lc is the unmatched char */
9087     s.dyn_ltree[lc*2]/*.Freq*/++;
9088   } else {
9089     s.matches++;
9090     /* Here, lc is the match length - MIN_MATCH */
9091     dist--;             /* dist = match distance - 1 */
9092     //Assert((ush)dist < (ush)MAX_DIST(s) &&
9093     //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
9094     //       (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
9096     s.dyn_ltree[(_length_code[lc]+LITERALS+1) * 2]/*.Freq*/++;
9097     s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
9098   }
9100 // (!) This block is disabled in zlib defailts,
9101 // don't enable it for binary compatibility
9103 //#ifdef TRUNCATE_BLOCK
9104 //  /* Try to guess if it is profitable to stop the current block here */
9105 //  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
9106 //    /* Compute an upper bound for the compressed length */
9107 //    out_length = s.last_lit*8;
9108 //    in_length = s.strstart - s.block_start;
9110 //    for (dcode = 0; dcode < D_CODES; dcode++) {
9111 //      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
9112 //    }
9113 //    out_length >>>= 3;
9114 //    //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
9115 //    //       s->last_lit, in_length, out_length,
9116 //    //       100L - out_length*100L/in_length));
9117 //    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
9118 //      return true;
9119 //    }
9120 //  }
9121 //#endif
9123   return (s.last_lit === s.lit_bufsize-1);
9124   /* We avoid equality with lit_bufsize because of wraparound at 64K
9125    * on 16 bit machines and because stored blocks are restricted to
9126    * 64K-1 bytes.
9127    */
9130 exports._tr_init  = _tr_init;
9131 exports._tr_stored_block = _tr_stored_block;
9132 exports._tr_flush_block  = _tr_flush_block;
9133 exports._tr_tally = _tr_tally;
9134 exports._tr_align = _tr_align;
9135 },{"../utils/common":27}],39:[function(_dereq_,module,exports){
9136 'use strict';
9139 function ZStream() {
9140   /* next input byte */
9141   this.input = null; // JS specific, because we have no pointers
9142   this.next_in = 0;
9143   /* number of bytes available at input */
9144   this.avail_in = 0;
9145   /* total number of input bytes read so far */
9146   this.total_in = 0;
9147   /* next output byte should be put there */
9148   this.output = null; // JS specific, because we have no pointers
9149   this.next_out = 0;
9150   /* remaining free space at output */
9151   this.avail_out = 0;
9152   /* total number of bytes output so far */
9153   this.total_out = 0;
9154   /* last error message, NULL if no error */
9155   this.msg = ''/*Z_NULL*/;
9156   /* not visible by applications */
9157   this.state = null;
9158   /* best guess about the data type: binary or text */
9159   this.data_type = 2/*Z_UNKNOWN*/;
9160   /* adler32 value of the uncompressed data */
9161   this.adler = 0;
9164 module.exports = ZStream;
9165 },{}]},{},[9])
9169 /*! pdfmake v0.1.36, @license MIT, @link http://pdfmake.org */
9170 (function webpackUniversalModuleDefinition(root, factory) {
9171         if(typeof exports === 'object' && typeof module === 'object')
9172                 module.exports = factory();
9173         else if(typeof define === 'function' && define.amd)
9174                 define([], factory);
9175         else {
9176                 var a = factory();
9177                 for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
9178         }
9179 })(typeof self !== 'undefined' ? self : this, function() {
9180 return /******/ (function(modules) { // webpackBootstrap
9181 /******/        // The module cache
9182 /******/        var installedModules = {};
9183 /******/
9184 /******/        // The require function
9185 /******/        function __webpack_require__(moduleId) {
9186 /******/
9187 /******/                // Check if module is in cache
9188 /******/                if(installedModules[moduleId]) {
9189 /******/                        return installedModules[moduleId].exports;
9190 /******/                }
9191 /******/                // Create a new module (and put it into the cache)
9192 /******/                var module = installedModules[moduleId] = {
9193 /******/                        i: moduleId,
9194 /******/                        l: false,
9195 /******/                        exports: {}
9196 /******/                };
9197 /******/
9198 /******/                // Execute the module function
9199 /******/                modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
9200 /******/
9201 /******/                // Flag the module as loaded
9202 /******/                module.l = true;
9203 /******/
9204 /******/                // Return the exports of the module
9205 /******/                return module.exports;
9206 /******/        }
9207 /******/
9208 /******/
9209 /******/        // expose the modules object (__webpack_modules__)
9210 /******/        __webpack_require__.m = modules;
9211 /******/
9212 /******/        // expose the module cache
9213 /******/        __webpack_require__.c = installedModules;
9214 /******/
9215 /******/        // define getter function for harmony exports
9216 /******/        __webpack_require__.d = function(exports, name, getter) {
9217 /******/                if(!__webpack_require__.o(exports, name)) {
9218 /******/                        Object.defineProperty(exports, name, {
9219 /******/                                configurable: false,
9220 /******/                                enumerable: true,
9221 /******/                                get: getter
9222 /******/                        });
9223 /******/                }
9224 /******/        };
9225 /******/
9226 /******/        // getDefaultExport function for compatibility with non-harmony modules
9227 /******/        __webpack_require__.n = function(module) {
9228 /******/                var getter = module && module.__esModule ?
9229 /******/                        function getDefault() { return module['default']; } :
9230 /******/                        function getModuleExports() { return module; };
9231 /******/                __webpack_require__.d(getter, 'a', getter);
9232 /******/                return getter;
9233 /******/        };
9234 /******/
9235 /******/        // Object.prototype.hasOwnProperty.call
9236 /******/        __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
9237 /******/
9238 /******/        // __webpack_public_path__
9239 /******/        __webpack_require__.p = "";
9240 /******/
9241 /******/        // Load entry module and return exports
9242 /******/        return __webpack_require__(__webpack_require__.s = 122);
9243 /******/ })
9244 /************************************************************************/
9245 /******/ ([
9246 /* 0 */
9247 /***/ (function(module, exports, __webpack_require__) {
9249 "use strict";
9252 function isString(variable) {
9253         return typeof variable === 'string' || variable instanceof String;
9256 function isNumber(variable) {
9257         return typeof variable === 'number' || variable instanceof Number;
9260 function isBoolean(variable) {
9261         return typeof variable === 'boolean';
9264 function isArray(variable) {
9265         return Array.isArray(variable);
9268 function isFunction(variable) {
9269         return typeof variable === 'function';
9272 function isObject(variable) {
9273         return variable !== null && typeof variable === 'object';
9276 function isNull(variable) {
9277         return variable === null;
9280 function isUndefined(variable) {
9281         return variable === undefined;
9284 function pack() {
9285         var result = {};
9287         for (var i = 0, l = arguments.length; i < l; i++) {
9288                 var obj = arguments[i];
9290                 if (obj) {
9291                         for (var key in obj) {
9292                                 if (obj.hasOwnProperty(key)) {
9293                                         result[key] = obj[key];
9294                                 }
9295                         }
9296                 }
9297         }
9299         return result;
9302 function offsetVector(vector, x, y) {
9303         switch (vector.type) {
9304                 case 'ellipse':
9305                 case 'rect':
9306                         vector.x += x;
9307                         vector.y += y;
9308                         break;
9309                 case 'line':
9310                         vector.x1 += x;
9311                         vector.x2 += x;
9312                         vector.y1 += y;
9313                         vector.y2 += y;
9314                         break;
9315                 case 'polyline':
9316                         for (var i = 0, l = vector.points.length; i < l; i++) {
9317                                 vector.points[i].x += x;
9318                                 vector.points[i].y += y;
9319                         }
9320                         break;
9321         }
9324 function fontStringify(key, val) {
9325         if (key === 'font') {
9326                 return 'font';
9327         }
9328         return val;
9331 module.exports = {
9332         isString: isString,
9333         isNumber: isNumber,
9334         isBoolean: isBoolean,
9335         isArray: isArray,
9336         isFunction: isFunction,
9337         isObject: isObject,
9338         isNull: isNull,
9339         isUndefined: isUndefined,
9340         pack: pack,
9341         fontStringify: fontStringify,
9342         offsetVector: offsetVector
9346 /***/ }),
9347 /* 1 */
9348 /***/ (function(module, exports, __webpack_require__) {
9350 "use strict";
9351 /* WEBPACK VAR INJECTION */(function(global) {/*!
9352  * The buffer module from node.js, for the browser.
9354  * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
9355  * @license  MIT
9356  */
9357 /* eslint-disable no-proto */
9361 var base64 = __webpack_require__(124)
9362 var ieee754 = __webpack_require__(125)
9363 var isArray = __webpack_require__(76)
9365 exports.Buffer = Buffer
9366 exports.SlowBuffer = SlowBuffer
9367 exports.INSPECT_MAX_BYTES = 50
9370  * If `Buffer.TYPED_ARRAY_SUPPORT`:
9371  *   === true    Use Uint8Array implementation (fastest)
9372  *   === false   Use Object implementation (most compatible, even IE6)
9374  * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
9375  * Opera 11.6+, iOS 4.2+.
9377  * Due to various browser bugs, sometimes the Object implementation will be used even
9378  * when the browser supports typed arrays.
9380  * Note:
9382  *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
9383  *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
9385  *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
9387  *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
9388  *     incorrect length in some situations.
9390  * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
9391  * get the Object implementation, which is slower but behaves correctly.
9392  */
9393 Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
9394   ? global.TYPED_ARRAY_SUPPORT
9395   : typedArraySupport()
9398  * Export kMaxLength after typed array support is determined.
9399  */
9400 exports.kMaxLength = kMaxLength()
9402 function typedArraySupport () {
9403   try {
9404     var arr = new Uint8Array(1)
9405     arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
9406     return arr.foo() === 42 && // typed array instances can be augmented
9407         typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
9408         arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
9409   } catch (e) {
9410     return false
9411   }
9414 function kMaxLength () {
9415   return Buffer.TYPED_ARRAY_SUPPORT
9416     ? 0x7fffffff
9417     : 0x3fffffff
9420 function createBuffer (that, length) {
9421   if (kMaxLength() < length) {
9422     throw new RangeError('Invalid typed array length')
9423   }
9424   if (Buffer.TYPED_ARRAY_SUPPORT) {
9425     // Return an augmented `Uint8Array` instance, for best performance
9426     that = new Uint8Array(length)
9427     that.__proto__ = Buffer.prototype
9428   } else {
9429     // Fallback: Return an object instance of the Buffer class
9430     if (that === null) {
9431       that = new Buffer(length)
9432     }
9433     that.length = length
9434   }
9436   return that
9440  * The Buffer constructor returns instances of `Uint8Array` that have their
9441  * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
9442  * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
9443  * and the `Uint8Array` methods. Square bracket notation works as expected -- it
9444  * returns a single octet.
9446  * The `Uint8Array` prototype remains unmodified.
9447  */
9449 function Buffer (arg, encodingOrOffset, length) {
9450   if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
9451     return new Buffer(arg, encodingOrOffset, length)
9452   }
9454   // Common case.
9455   if (typeof arg === 'number') {
9456     if (typeof encodingOrOffset === 'string') {
9457       throw new Error(
9458         'If encoding is specified then the first argument must be a string'
9459       )
9460     }
9461     return allocUnsafe(this, arg)
9462   }
9463   return from(this, arg, encodingOrOffset, length)
9466 Buffer.poolSize = 8192 // not used by this implementation
9468 // TODO: Legacy, not needed anymore. Remove in next major version.
9469 Buffer._augment = function (arr) {
9470   arr.__proto__ = Buffer.prototype
9471   return arr
9474 function from (that, value, encodingOrOffset, length) {
9475   if (typeof value === 'number') {
9476     throw new TypeError('"value" argument must not be a number')
9477   }
9479   if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
9480     return fromArrayBuffer(that, value, encodingOrOffset, length)
9481   }
9483   if (typeof value === 'string') {
9484     return fromString(that, value, encodingOrOffset)
9485   }
9487   return fromObject(that, value)
9491  * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
9492  * if value is a number.
9493  * Buffer.from(str[, encoding])
9494  * Buffer.from(array)
9495  * Buffer.from(buffer)
9496  * Buffer.from(arrayBuffer[, byteOffset[, length]])
9497  **/
9498 Buffer.from = function (value, encodingOrOffset, length) {
9499   return from(null, value, encodingOrOffset, length)
9502 if (Buffer.TYPED_ARRAY_SUPPORT) {
9503   Buffer.prototype.__proto__ = Uint8Array.prototype
9504   Buffer.__proto__ = Uint8Array
9505   if (typeof Symbol !== 'undefined' && Symbol.species &&
9506       Buffer[Symbol.species] === Buffer) {
9507     // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
9508     Object.defineProperty(Buffer, Symbol.species, {
9509       value: null,
9510       configurable: true
9511     })
9512   }
9515 function assertSize (size) {
9516   if (typeof size !== 'number') {
9517     throw new TypeError('"size" argument must be a number')
9518   } else if (size < 0) {
9519     throw new RangeError('"size" argument must not be negative')
9520   }
9523 function alloc (that, size, fill, encoding) {
9524   assertSize(size)
9525   if (size <= 0) {
9526     return createBuffer(that, size)
9527   }
9528   if (fill !== undefined) {
9529     // Only pay attention to encoding if it's a string. This
9530     // prevents accidentally sending in a number that would
9531     // be interpretted as a start offset.
9532     return typeof encoding === 'string'
9533       ? createBuffer(that, size).fill(fill, encoding)
9534       : createBuffer(that, size).fill(fill)
9535   }
9536   return createBuffer(that, size)
9540  * Creates a new filled Buffer instance.
9541  * alloc(size[, fill[, encoding]])
9542  **/
9543 Buffer.alloc = function (size, fill, encoding) {
9544   return alloc(null, size, fill, encoding)
9547 function allocUnsafe (that, size) {
9548   assertSize(size)
9549   that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
9550   if (!Buffer.TYPED_ARRAY_SUPPORT) {
9551     for (var i = 0; i < size; ++i) {
9552       that[i] = 0
9553     }
9554   }
9555   return that
9559  * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
9560  * */
9561 Buffer.allocUnsafe = function (size) {
9562   return allocUnsafe(null, size)
9565  * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
9566  */
9567 Buffer.allocUnsafeSlow = function (size) {
9568   return allocUnsafe(null, size)
9571 function fromString (that, string, encoding) {
9572   if (typeof encoding !== 'string' || encoding === '') {
9573     encoding = 'utf8'
9574   }
9576   if (!Buffer.isEncoding(encoding)) {
9577     throw new TypeError('"encoding" must be a valid string encoding')
9578   }
9580   var length = byteLength(string, encoding) | 0
9581   that = createBuffer(that, length)
9583   var actual = that.write(string, encoding)
9585   if (actual !== length) {
9586     // Writing a hex string, for example, that contains invalid characters will
9587     // cause everything after the first invalid character to be ignored. (e.g.
9588     // 'abxxcd' will be treated as 'ab')
9589     that = that.slice(0, actual)
9590   }
9592   return that
9595 function fromArrayLike (that, array) {
9596   var length = array.length < 0 ? 0 : checked(array.length) | 0
9597   that = createBuffer(that, length)
9598   for (var i = 0; i < length; i += 1) {
9599     that[i] = array[i] & 255
9600   }
9601   return that
9604 function fromArrayBuffer (that, array, byteOffset, length) {
9605   array.byteLength // this throws if `array` is not a valid ArrayBuffer
9607   if (byteOffset < 0 || array.byteLength < byteOffset) {
9608     throw new RangeError('\'offset\' is out of bounds')
9609   }
9611   if (array.byteLength < byteOffset + (length || 0)) {
9612     throw new RangeError('\'length\' is out of bounds')
9613   }
9615   if (byteOffset === undefined && length === undefined) {
9616     array = new Uint8Array(array)
9617   } else if (length === undefined) {
9618     array = new Uint8Array(array, byteOffset)
9619   } else {
9620     array = new Uint8Array(array, byteOffset, length)
9621   }
9623   if (Buffer.TYPED_ARRAY_SUPPORT) {
9624     // Return an augmented `Uint8Array` instance, for best performance
9625     that = array
9626     that.__proto__ = Buffer.prototype
9627   } else {
9628     // Fallback: Return an object instance of the Buffer class
9629     that = fromArrayLike(that, array)
9630   }
9631   return that
9634 function fromObject (that, obj) {
9635   if (Buffer.isBuffer(obj)) {
9636     var len = checked(obj.length) | 0
9637     that = createBuffer(that, len)
9639     if (that.length === 0) {
9640       return that
9641     }
9643     obj.copy(that, 0, 0, len)
9644     return that
9645   }
9647   if (obj) {
9648     if ((typeof ArrayBuffer !== 'undefined' &&
9649         obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
9650       if (typeof obj.length !== 'number' || isnan(obj.length)) {
9651         return createBuffer(that, 0)
9652       }
9653       return fromArrayLike(that, obj)
9654     }
9656     if (obj.type === 'Buffer' && isArray(obj.data)) {
9657       return fromArrayLike(that, obj.data)
9658     }
9659   }
9661   throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
9664 function checked (length) {
9665   // Note: cannot use `length < kMaxLength()` here because that fails when
9666   // length is NaN (which is otherwise coerced to zero.)
9667   if (length >= kMaxLength()) {
9668     throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
9669                          'size: 0x' + kMaxLength().toString(16) + ' bytes')
9670   }
9671   return length | 0
9674 function SlowBuffer (length) {
9675   if (+length != length) { // eslint-disable-line eqeqeq
9676     length = 0
9677   }
9678   return Buffer.alloc(+length)
9681 Buffer.isBuffer = function isBuffer (b) {
9682   return !!(b != null && b._isBuffer)
9685 Buffer.compare = function compare (a, b) {
9686   if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
9687     throw new TypeError('Arguments must be Buffers')
9688   }
9690   if (a === b) return 0
9692   var x = a.length
9693   var y = b.length
9695   for (var i = 0, len = Math.min(x, y); i < len; ++i) {
9696     if (a[i] !== b[i]) {
9697       x = a[i]
9698       y = b[i]
9699       break
9700     }
9701   }
9703   if (x < y) return -1
9704   if (y < x) return 1
9705   return 0
9708 Buffer.isEncoding = function isEncoding (encoding) {
9709   switch (String(encoding).toLowerCase()) {
9710     case 'hex':
9711     case 'utf8':
9712     case 'utf-8':
9713     case 'ascii':
9714     case 'latin1':
9715     case 'binary':
9716     case 'base64':
9717     case 'ucs2':
9718     case 'ucs-2':
9719     case 'utf16le':
9720     case 'utf-16le':
9721       return true
9722     default:
9723       return false
9724   }
9727 Buffer.concat = function concat (list, length) {
9728   if (!isArray(list)) {
9729     throw new TypeError('"list" argument must be an Array of Buffers')
9730   }
9732   if (list.length === 0) {
9733     return Buffer.alloc(0)
9734   }
9736   var i
9737   if (length === undefined) {
9738     length = 0
9739     for (i = 0; i < list.length; ++i) {
9740       length += list[i].length
9741     }
9742   }
9744   var buffer = Buffer.allocUnsafe(length)
9745   var pos = 0
9746   for (i = 0; i < list.length; ++i) {
9747     var buf = list[i]
9748     if (!Buffer.isBuffer(buf)) {
9749       throw new TypeError('"list" argument must be an Array of Buffers')
9750     }
9751     buf.copy(buffer, pos)
9752     pos += buf.length
9753   }
9754   return buffer
9757 function byteLength (string, encoding) {
9758   if (Buffer.isBuffer(string)) {
9759     return string.length
9760   }
9761   if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
9762       (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
9763     return string.byteLength
9764   }
9765   if (typeof string !== 'string') {
9766     string = '' + string
9767   }
9769   var len = string.length
9770   if (len === 0) return 0
9772   // Use a for loop to avoid recursion
9773   var loweredCase = false
9774   for (;;) {
9775     switch (encoding) {
9776       case 'ascii':
9777       case 'latin1':
9778       case 'binary':
9779         return len
9780       case 'utf8':
9781       case 'utf-8':
9782       case undefined:
9783         return utf8ToBytes(string).length
9784       case 'ucs2':
9785       case 'ucs-2':
9786       case 'utf16le':
9787       case 'utf-16le':
9788         return len * 2
9789       case 'hex':
9790         return len >>> 1
9791       case 'base64':
9792         return base64ToBytes(string).length
9793       default:
9794         if (loweredCase) return utf8ToBytes(string).length // assume utf8
9795         encoding = ('' + encoding).toLowerCase()
9796         loweredCase = true
9797     }
9798   }
9800 Buffer.byteLength = byteLength
9802 function slowToString (encoding, start, end) {
9803   var loweredCase = false
9805   // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
9806   // property of a typed array.
9808   // This behaves neither like String nor Uint8Array in that we set start/end
9809   // to their upper/lower bounds if the value passed is out of range.
9810   // undefined is handled specially as per ECMA-262 6th Edition,
9811   // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
9812   if (start === undefined || start < 0) {
9813     start = 0
9814   }
9815   // Return early if start > this.length. Done here to prevent potential uint32
9816   // coercion fail below.
9817   if (start > this.length) {
9818     return ''
9819   }
9821   if (end === undefined || end > this.length) {
9822     end = this.length
9823   }
9825   if (end <= 0) {
9826     return ''
9827   }
9829   // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
9830   end >>>= 0
9831   start >>>= 0
9833   if (end <= start) {
9834     return ''
9835   }
9837   if (!encoding) encoding = 'utf8'
9839   while (true) {
9840     switch (encoding) {
9841       case 'hex':
9842         return hexSlice(this, start, end)
9844       case 'utf8':
9845       case 'utf-8':
9846         return utf8Slice(this, start, end)
9848       case 'ascii':
9849         return asciiSlice(this, start, end)
9851       case 'latin1':
9852       case 'binary':
9853         return latin1Slice(this, start, end)
9855       case 'base64':
9856         return base64Slice(this, start, end)
9858       case 'ucs2':
9859       case 'ucs-2':
9860       case 'utf16le':
9861       case 'utf-16le':
9862         return utf16leSlice(this, start, end)
9864       default:
9865         if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
9866         encoding = (encoding + '').toLowerCase()
9867         loweredCase = true
9868     }
9869   }
9872 // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
9873 // Buffer instances.
9874 Buffer.prototype._isBuffer = true
9876 function swap (b, n, m) {
9877   var i = b[n]
9878   b[n] = b[m]
9879   b[m] = i
9882 Buffer.prototype.swap16 = function swap16 () {
9883   var len = this.length
9884   if (len % 2 !== 0) {
9885     throw new RangeError('Buffer size must be a multiple of 16-bits')
9886   }
9887   for (var i = 0; i < len; i += 2) {
9888     swap(this, i, i + 1)
9889   }
9890   return this
9893 Buffer.prototype.swap32 = function swap32 () {
9894   var len = this.length
9895   if (len % 4 !== 0) {
9896     throw new RangeError('Buffer size must be a multiple of 32-bits')
9897   }
9898   for (var i = 0; i < len; i += 4) {
9899     swap(this, i, i + 3)
9900     swap(this, i + 1, i + 2)
9901   }
9902   return this
9905 Buffer.prototype.swap64 = function swap64 () {
9906   var len = this.length
9907   if (len % 8 !== 0) {
9908     throw new RangeError('Buffer size must be a multiple of 64-bits')
9909   }
9910   for (var i = 0; i < len; i += 8) {
9911     swap(this, i, i + 7)
9912     swap(this, i + 1, i + 6)
9913     swap(this, i + 2, i + 5)
9914     swap(this, i + 3, i + 4)
9915   }
9916   return this
9919 Buffer.prototype.toString = function toString () {
9920   var length = this.length | 0
9921   if (length === 0) return ''
9922   if (arguments.length === 0) return utf8Slice(this, 0, length)
9923   return slowToString.apply(this, arguments)
9926 Buffer.prototype.equals = function equals (b) {
9927   if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
9928   if (this === b) return true
9929   return Buffer.compare(this, b) === 0
9932 Buffer.prototype.inspect = function inspect () {
9933   var str = ''
9934   var max = exports.INSPECT_MAX_BYTES
9935   if (this.length > 0) {
9936     str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
9937     if (this.length > max) str += ' ... '
9938   }
9939   return '<Buffer ' + str + '>'
9942 Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
9943   if (!Buffer.isBuffer(target)) {
9944     throw new TypeError('Argument must be a Buffer')
9945   }
9947   if (start === undefined) {
9948     start = 0
9949   }
9950   if (end === undefined) {
9951     end = target ? target.length : 0
9952   }
9953   if (thisStart === undefined) {
9954     thisStart = 0
9955   }
9956   if (thisEnd === undefined) {
9957     thisEnd = this.length
9958   }
9960   if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
9961     throw new RangeError('out of range index')
9962   }
9964   if (thisStart >= thisEnd && start >= end) {
9965     return 0
9966   }
9967   if (thisStart >= thisEnd) {
9968     return -1
9969   }
9970   if (start >= end) {
9971     return 1
9972   }
9974   start >>>= 0
9975   end >>>= 0
9976   thisStart >>>= 0
9977   thisEnd >>>= 0
9979   if (this === target) return 0
9981   var x = thisEnd - thisStart
9982   var y = end - start
9983   var len = Math.min(x, y)
9985   var thisCopy = this.slice(thisStart, thisEnd)
9986   var targetCopy = target.slice(start, end)
9988   for (var i = 0; i < len; ++i) {
9989     if (thisCopy[i] !== targetCopy[i]) {
9990       x = thisCopy[i]
9991       y = targetCopy[i]
9992       break
9993     }
9994   }
9996   if (x < y) return -1
9997   if (y < x) return 1
9998   return 0
10001 // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
10002 // OR the last index of `val` in `buffer` at offset <= `byteOffset`.
10004 // Arguments:
10005 // - buffer - a Buffer to search
10006 // - val - a string, Buffer, or number
10007 // - byteOffset - an index into `buffer`; will be clamped to an int32
10008 // - encoding - an optional encoding, relevant is val is a string
10009 // - dir - true for indexOf, false for lastIndexOf
10010 function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
10011   // Empty buffer means no match
10012   if (buffer.length === 0) return -1
10014   // Normalize byteOffset
10015   if (typeof byteOffset === 'string') {
10016     encoding = byteOffset
10017     byteOffset = 0
10018   } else if (byteOffset > 0x7fffffff) {
10019     byteOffset = 0x7fffffff
10020   } else if (byteOffset < -0x80000000) {
10021     byteOffset = -0x80000000
10022   }
10023   byteOffset = +byteOffset  // Coerce to Number.
10024   if (isNaN(byteOffset)) {
10025     // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
10026     byteOffset = dir ? 0 : (buffer.length - 1)
10027   }
10029   // Normalize byteOffset: negative offsets start from the end of the buffer
10030   if (byteOffset < 0) byteOffset = buffer.length + byteOffset
10031   if (byteOffset >= buffer.length) {
10032     if (dir) return -1
10033     else byteOffset = buffer.length - 1
10034   } else if (byteOffset < 0) {
10035     if (dir) byteOffset = 0
10036     else return -1
10037   }
10039   // Normalize val
10040   if (typeof val === 'string') {
10041     val = Buffer.from(val, encoding)
10042   }
10044   // Finally, search either indexOf (if dir is true) or lastIndexOf
10045   if (Buffer.isBuffer(val)) {
10046     // Special case: looking for empty string/buffer always fails
10047     if (val.length === 0) {
10048       return -1
10049     }
10050     return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
10051   } else if (typeof val === 'number') {
10052     val = val & 0xFF // Search for a byte value [0-255]
10053     if (Buffer.TYPED_ARRAY_SUPPORT &&
10054         typeof Uint8Array.prototype.indexOf === 'function') {
10055       if (dir) {
10056         return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
10057       } else {
10058         return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
10059       }
10060     }
10061     return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
10062   }
10064   throw new TypeError('val must be string, number or Buffer')
10067 function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
10068   var indexSize = 1
10069   var arrLength = arr.length
10070   var valLength = val.length
10072   if (encoding !== undefined) {
10073     encoding = String(encoding).toLowerCase()
10074     if (encoding === 'ucs2' || encoding === 'ucs-2' ||
10075         encoding === 'utf16le' || encoding === 'utf-16le') {
10076       if (arr.length < 2 || val.length < 2) {
10077         return -1
10078       }
10079       indexSize = 2
10080       arrLength /= 2
10081       valLength /= 2
10082       byteOffset /= 2
10083     }
10084   }
10086   function read (buf, i) {
10087     if (indexSize === 1) {
10088       return buf[i]
10089     } else {
10090       return buf.readUInt16BE(i * indexSize)
10091     }
10092   }
10094   var i
10095   if (dir) {
10096     var foundIndex = -1
10097     for (i = byteOffset; i < arrLength; i++) {
10098       if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
10099         if (foundIndex === -1) foundIndex = i
10100         if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
10101       } else {
10102         if (foundIndex !== -1) i -= i - foundIndex
10103         foundIndex = -1
10104       }
10105     }
10106   } else {
10107     if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
10108     for (i = byteOffset; i >= 0; i--) {
10109       var found = true
10110       for (var j = 0; j < valLength; j++) {
10111         if (read(arr, i + j) !== read(val, j)) {
10112           found = false
10113           break
10114         }
10115       }
10116       if (found) return i
10117     }
10118   }
10120   return -1
10123 Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
10124   return this.indexOf(val, byteOffset, encoding) !== -1
10127 Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
10128   return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
10131 Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
10132   return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
10135 function hexWrite (buf, string, offset, length) {
10136   offset = Number(offset) || 0
10137   var remaining = buf.length - offset
10138   if (!length) {
10139     length = remaining
10140   } else {
10141     length = Number(length)
10142     if (length > remaining) {
10143       length = remaining
10144     }
10145   }
10147   // must be an even number of digits
10148   var strLen = string.length
10149   if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
10151   if (length > strLen / 2) {
10152     length = strLen / 2
10153   }
10154   for (var i = 0; i < length; ++i) {
10155     var parsed = parseInt(string.substr(i * 2, 2), 16)
10156     if (isNaN(parsed)) return i
10157     buf[offset + i] = parsed
10158   }
10159   return i
10162 function utf8Write (buf, string, offset, length) {
10163   return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
10166 function asciiWrite (buf, string, offset, length) {
10167   return blitBuffer(asciiToBytes(string), buf, offset, length)
10170 function latin1Write (buf, string, offset, length) {
10171   return asciiWrite(buf, string, offset, length)
10174 function base64Write (buf, string, offset, length) {
10175   return blitBuffer(base64ToBytes(string), buf, offset, length)
10178 function ucs2Write (buf, string, offset, length) {
10179   return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
10182 Buffer.prototype.write = function write (string, offset, length, encoding) {
10183   // Buffer#write(string)
10184   if (offset === undefined) {
10185     encoding = 'utf8'
10186     length = this.length
10187     offset = 0
10188   // Buffer#write(string, encoding)
10189   } else if (length === undefined && typeof offset === 'string') {
10190     encoding = offset
10191     length = this.length
10192     offset = 0
10193   // Buffer#write(string, offset[, length][, encoding])
10194   } else if (isFinite(offset)) {
10195     offset = offset | 0
10196     if (isFinite(length)) {
10197       length = length | 0
10198       if (encoding === undefined) encoding = 'utf8'
10199     } else {
10200       encoding = length
10201       length = undefined
10202     }
10203   // legacy write(string, encoding, offset, length) - remove in v0.13
10204   } else {
10205     throw new Error(
10206       'Buffer.write(string, encoding, offset[, length]) is no longer supported'
10207     )
10208   }
10210   var remaining = this.length - offset
10211   if (length === undefined || length > remaining) length = remaining
10213   if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
10214     throw new RangeError('Attempt to write outside buffer bounds')
10215   }
10217   if (!encoding) encoding = 'utf8'
10219   var loweredCase = false
10220   for (;;) {
10221     switch (encoding) {
10222       case 'hex':
10223         return hexWrite(this, string, offset, length)
10225       case 'utf8':
10226       case 'utf-8':
10227         return utf8Write(this, string, offset, length)
10229       case 'ascii':
10230         return asciiWrite(this, string, offset, length)
10232       case 'latin1':
10233       case 'binary':
10234         return latin1Write(this, string, offset, length)
10236       case 'base64':
10237         // Warning: maxLength not taken into account in base64Write
10238         return base64Write(this, string, offset, length)
10240       case 'ucs2':
10241       case 'ucs-2':
10242       case 'utf16le':
10243       case 'utf-16le':
10244         return ucs2Write(this, string, offset, length)
10246       default:
10247         if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
10248         encoding = ('' + encoding).toLowerCase()
10249         loweredCase = true
10250     }
10251   }
10254 Buffer.prototype.toJSON = function toJSON () {
10255   return {
10256     type: 'Buffer',
10257     data: Array.prototype.slice.call(this._arr || this, 0)
10258   }
10261 function base64Slice (buf, start, end) {
10262   if (start === 0 && end === buf.length) {
10263     return base64.fromByteArray(buf)
10264   } else {
10265     return base64.fromByteArray(buf.slice(start, end))
10266   }
10269 function utf8Slice (buf, start, end) {
10270   end = Math.min(buf.length, end)
10271   var res = []
10273   var i = start
10274   while (i < end) {
10275     var firstByte = buf[i]
10276     var codePoint = null
10277     var bytesPerSequence = (firstByte > 0xEF) ? 4
10278       : (firstByte > 0xDF) ? 3
10279       : (firstByte > 0xBF) ? 2
10280       : 1
10282     if (i + bytesPerSequence <= end) {
10283       var secondByte, thirdByte, fourthByte, tempCodePoint
10285       switch (bytesPerSequence) {
10286         case 1:
10287           if (firstByte < 0x80) {
10288             codePoint = firstByte
10289           }
10290           break
10291         case 2:
10292           secondByte = buf[i + 1]
10293           if ((secondByte & 0xC0) === 0x80) {
10294             tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
10295             if (tempCodePoint > 0x7F) {
10296               codePoint = tempCodePoint
10297             }
10298           }
10299           break
10300         case 3:
10301           secondByte = buf[i + 1]
10302           thirdByte = buf[i + 2]
10303           if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
10304             tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
10305             if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
10306               codePoint = tempCodePoint
10307             }
10308           }
10309           break
10310         case 4:
10311           secondByte = buf[i + 1]
10312           thirdByte = buf[i + 2]
10313           fourthByte = buf[i + 3]
10314           if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
10315             tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
10316             if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
10317               codePoint = tempCodePoint
10318             }
10319           }
10320       }
10321     }
10323     if (codePoint === null) {
10324       // we did not generate a valid codePoint so insert a
10325       // replacement char (U+FFFD) and advance only 1 byte
10326       codePoint = 0xFFFD
10327       bytesPerSequence = 1
10328     } else if (codePoint > 0xFFFF) {
10329       // encode to utf16 (surrogate pair dance)
10330       codePoint -= 0x10000
10331       res.push(codePoint >>> 10 & 0x3FF | 0xD800)
10332       codePoint = 0xDC00 | codePoint & 0x3FF
10333     }
10335     res.push(codePoint)
10336     i += bytesPerSequence
10337   }
10339   return decodeCodePointsArray(res)
10342 // Based on http://stackoverflow.com/a/22747272/680742, the browser with
10343 // the lowest limit is Chrome, with 0x10000 args.
10344 // We go 1 magnitude less, for safety
10345 var MAX_ARGUMENTS_LENGTH = 0x1000
10347 function decodeCodePointsArray (codePoints) {
10348   var len = codePoints.length
10349   if (len <= MAX_ARGUMENTS_LENGTH) {
10350     return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
10351   }
10353   // Decode in chunks to avoid "call stack size exceeded".
10354   var res = ''
10355   var i = 0
10356   while (i < len) {
10357     res += String.fromCharCode.apply(
10358       String,
10359       codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
10360     )
10361   }
10362   return res
10365 function asciiSlice (buf, start, end) {
10366   var ret = ''
10367   end = Math.min(buf.length, end)
10369   for (var i = start; i < end; ++i) {
10370     ret += String.fromCharCode(buf[i] & 0x7F)
10371   }
10372   return ret
10375 function latin1Slice (buf, start, end) {
10376   var ret = ''
10377   end = Math.min(buf.length, end)
10379   for (var i = start; i < end; ++i) {
10380     ret += String.fromCharCode(buf[i])
10381   }
10382   return ret
10385 function hexSlice (buf, start, end) {
10386   var len = buf.length
10388   if (!start || start < 0) start = 0
10389   if (!end || end < 0 || end > len) end = len
10391   var out = ''
10392   for (var i = start; i < end; ++i) {
10393     out += toHex(buf[i])
10394   }
10395   return out
10398 function utf16leSlice (buf, start, end) {
10399   var bytes = buf.slice(start, end)
10400   var res = ''
10401   for (var i = 0; i < bytes.length; i += 2) {
10402     res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
10403   }
10404   return res
10407 Buffer.prototype.slice = function slice (start, end) {
10408   var len = this.length
10409   start = ~~start
10410   end = end === undefined ? len : ~~end
10412   if (start < 0) {
10413     start += len
10414     if (start < 0) start = 0
10415   } else if (start > len) {
10416     start = len
10417   }
10419   if (end < 0) {
10420     end += len
10421     if (end < 0) end = 0
10422   } else if (end > len) {
10423     end = len
10424   }
10426   if (end < start) end = start
10428   var newBuf
10429   if (Buffer.TYPED_ARRAY_SUPPORT) {
10430     newBuf = this.subarray(start, end)
10431     newBuf.__proto__ = Buffer.prototype
10432   } else {
10433     var sliceLen = end - start
10434     newBuf = new Buffer(sliceLen, undefined)
10435     for (var i = 0; i < sliceLen; ++i) {
10436       newBuf[i] = this[i + start]
10437     }
10438   }
10440   return newBuf
10444  * Need to make sure that buffer isn't trying to write out of bounds.
10445  */
10446 function checkOffset (offset, ext, length) {
10447   if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
10448   if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
10451 Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
10452   offset = offset | 0
10453   byteLength = byteLength | 0
10454   if (!noAssert) checkOffset(offset, byteLength, this.length)
10456   var val = this[offset]
10457   var mul = 1
10458   var i = 0
10459   while (++i < byteLength && (mul *= 0x100)) {
10460     val += this[offset + i] * mul
10461   }
10463   return val
10466 Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
10467   offset = offset | 0
10468   byteLength = byteLength | 0
10469   if (!noAssert) {
10470     checkOffset(offset, byteLength, this.length)
10471   }
10473   var val = this[offset + --byteLength]
10474   var mul = 1
10475   while (byteLength > 0 && (mul *= 0x100)) {
10476     val += this[offset + --byteLength] * mul
10477   }
10479   return val
10482 Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
10483   if (!noAssert) checkOffset(offset, 1, this.length)
10484   return this[offset]
10487 Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
10488   if (!noAssert) checkOffset(offset, 2, this.length)
10489   return this[offset] | (this[offset + 1] << 8)
10492 Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
10493   if (!noAssert) checkOffset(offset, 2, this.length)
10494   return (this[offset] << 8) | this[offset + 1]
10497 Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
10498   if (!noAssert) checkOffset(offset, 4, this.length)
10500   return ((this[offset]) |
10501       (this[offset + 1] << 8) |
10502       (this[offset + 2] << 16)) +
10503       (this[offset + 3] * 0x1000000)
10506 Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
10507   if (!noAssert) checkOffset(offset, 4, this.length)
10509   return (this[offset] * 0x1000000) +
10510     ((this[offset + 1] << 16) |
10511     (this[offset + 2] << 8) |
10512     this[offset + 3])
10515 Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
10516   offset = offset | 0
10517   byteLength = byteLength | 0
10518   if (!noAssert) checkOffset(offset, byteLength, this.length)
10520   var val = this[offset]
10521   var mul = 1
10522   var i = 0
10523   while (++i < byteLength && (mul *= 0x100)) {
10524     val += this[offset + i] * mul
10525   }
10526   mul *= 0x80
10528   if (val >= mul) val -= Math.pow(2, 8 * byteLength)
10530   return val
10533 Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
10534   offset = offset | 0
10535   byteLength = byteLength | 0
10536   if (!noAssert) checkOffset(offset, byteLength, this.length)
10538   var i = byteLength
10539   var mul = 1
10540   var val = this[offset + --i]
10541   while (i > 0 && (mul *= 0x100)) {
10542     val += this[offset + --i] * mul
10543   }
10544   mul *= 0x80
10546   if (val >= mul) val -= Math.pow(2, 8 * byteLength)
10548   return val
10551 Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
10552   if (!noAssert) checkOffset(offset, 1, this.length)
10553   if (!(this[offset] & 0x80)) return (this[offset])
10554   return ((0xff - this[offset] + 1) * -1)
10557 Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
10558   if (!noAssert) checkOffset(offset, 2, this.length)
10559   var val = this[offset] | (this[offset + 1] << 8)
10560   return (val & 0x8000) ? val | 0xFFFF0000 : val
10563 Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
10564   if (!noAssert) checkOffset(offset, 2, this.length)
10565   var val = this[offset + 1] | (this[offset] << 8)
10566   return (val & 0x8000) ? val | 0xFFFF0000 : val
10569 Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
10570   if (!noAssert) checkOffset(offset, 4, this.length)
10572   return (this[offset]) |
10573     (this[offset + 1] << 8) |
10574     (this[offset + 2] << 16) |
10575     (this[offset + 3] << 24)
10578 Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
10579   if (!noAssert) checkOffset(offset, 4, this.length)
10581   return (this[offset] << 24) |
10582     (this[offset + 1] << 16) |
10583     (this[offset + 2] << 8) |
10584     (this[offset + 3])
10587 Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
10588   if (!noAssert) checkOffset(offset, 4, this.length)
10589   return ieee754.read(this, offset, true, 23, 4)
10592 Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
10593   if (!noAssert) checkOffset(offset, 4, this.length)
10594   return ieee754.read(this, offset, false, 23, 4)
10597 Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
10598   if (!noAssert) checkOffset(offset, 8, this.length)
10599   return ieee754.read(this, offset, true, 52, 8)
10602 Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
10603   if (!noAssert) checkOffset(offset, 8, this.length)
10604   return ieee754.read(this, offset, false, 52, 8)
10607 function checkInt (buf, value, offset, ext, max, min) {
10608   if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
10609   if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
10610   if (offset + ext > buf.length) throw new RangeError('Index out of range')
10613 Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
10614   value = +value
10615   offset = offset | 0
10616   byteLength = byteLength | 0
10617   if (!noAssert) {
10618     var maxBytes = Math.pow(2, 8 * byteLength) - 1
10619     checkInt(this, value, offset, byteLength, maxBytes, 0)
10620   }
10622   var mul = 1
10623   var i = 0
10624   this[offset] = value & 0xFF
10625   while (++i < byteLength && (mul *= 0x100)) {
10626     this[offset + i] = (value / mul) & 0xFF
10627   }
10629   return offset + byteLength
10632 Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
10633   value = +value
10634   offset = offset | 0
10635   byteLength = byteLength | 0
10636   if (!noAssert) {
10637     var maxBytes = Math.pow(2, 8 * byteLength) - 1
10638     checkInt(this, value, offset, byteLength, maxBytes, 0)
10639   }
10641   var i = byteLength - 1
10642   var mul = 1
10643   this[offset + i] = value & 0xFF
10644   while (--i >= 0 && (mul *= 0x100)) {
10645     this[offset + i] = (value / mul) & 0xFF
10646   }
10648   return offset + byteLength
10651 Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
10652   value = +value
10653   offset = offset | 0
10654   if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
10655   if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
10656   this[offset] = (value & 0xff)
10657   return offset + 1
10660 function objectWriteUInt16 (buf, value, offset, littleEndian) {
10661   if (value < 0) value = 0xffff + value + 1
10662   for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
10663     buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
10664       (littleEndian ? i : 1 - i) * 8
10665   }
10668 Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
10669   value = +value
10670   offset = offset | 0
10671   if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
10672   if (Buffer.TYPED_ARRAY_SUPPORT) {
10673     this[offset] = (value & 0xff)
10674     this[offset + 1] = (value >>> 8)
10675   } else {
10676     objectWriteUInt16(this, value, offset, true)
10677   }
10678   return offset + 2
10681 Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
10682   value = +value
10683   offset = offset | 0
10684   if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
10685   if (Buffer.TYPED_ARRAY_SUPPORT) {
10686     this[offset] = (value >>> 8)
10687     this[offset + 1] = (value & 0xff)
10688   } else {
10689     objectWriteUInt16(this, value, offset, false)
10690   }
10691   return offset + 2
10694 function objectWriteUInt32 (buf, value, offset, littleEndian) {
10695   if (value < 0) value = 0xffffffff + value + 1
10696   for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
10697     buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
10698   }
10701 Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
10702   value = +value
10703   offset = offset | 0
10704   if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
10705   if (Buffer.TYPED_ARRAY_SUPPORT) {
10706     this[offset + 3] = (value >>> 24)
10707     this[offset + 2] = (value >>> 16)
10708     this[offset + 1] = (value >>> 8)
10709     this[offset] = (value & 0xff)
10710   } else {
10711     objectWriteUInt32(this, value, offset, true)
10712   }
10713   return offset + 4
10716 Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
10717   value = +value
10718   offset = offset | 0
10719   if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
10720   if (Buffer.TYPED_ARRAY_SUPPORT) {
10721     this[offset] = (value >>> 24)
10722     this[offset + 1] = (value >>> 16)
10723     this[offset + 2] = (value >>> 8)
10724     this[offset + 3] = (value & 0xff)
10725   } else {
10726     objectWriteUInt32(this, value, offset, false)
10727   }
10728   return offset + 4
10731 Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
10732   value = +value
10733   offset = offset | 0
10734   if (!noAssert) {
10735     var limit = Math.pow(2, 8 * byteLength - 1)
10737     checkInt(this, value, offset, byteLength, limit - 1, -limit)
10738   }
10740   var i = 0
10741   var mul = 1
10742   var sub = 0
10743   this[offset] = value & 0xFF
10744   while (++i < byteLength && (mul *= 0x100)) {
10745     if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
10746       sub = 1
10747     }
10748     this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
10749   }
10751   return offset + byteLength
10754 Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
10755   value = +value
10756   offset = offset | 0
10757   if (!noAssert) {
10758     var limit = Math.pow(2, 8 * byteLength - 1)
10760     checkInt(this, value, offset, byteLength, limit - 1, -limit)
10761   }
10763   var i = byteLength - 1
10764   var mul = 1
10765   var sub = 0
10766   this[offset + i] = value & 0xFF
10767   while (--i >= 0 && (mul *= 0x100)) {
10768     if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
10769       sub = 1
10770     }
10771     this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
10772   }
10774   return offset + byteLength
10777 Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
10778   value = +value
10779   offset = offset | 0
10780   if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
10781   if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
10782   if (value < 0) value = 0xff + value + 1
10783   this[offset] = (value & 0xff)
10784   return offset + 1
10787 Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
10788   value = +value
10789   offset = offset | 0
10790   if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
10791   if (Buffer.TYPED_ARRAY_SUPPORT) {
10792     this[offset] = (value & 0xff)
10793     this[offset + 1] = (value >>> 8)
10794   } else {
10795     objectWriteUInt16(this, value, offset, true)
10796   }
10797   return offset + 2
10800 Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
10801   value = +value
10802   offset = offset | 0
10803   if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
10804   if (Buffer.TYPED_ARRAY_SUPPORT) {
10805     this[offset] = (value >>> 8)
10806     this[offset + 1] = (value & 0xff)
10807   } else {
10808     objectWriteUInt16(this, value, offset, false)
10809   }
10810   return offset + 2
10813 Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
10814   value = +value
10815   offset = offset | 0
10816   if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
10817   if (Buffer.TYPED_ARRAY_SUPPORT) {
10818     this[offset] = (value & 0xff)
10819     this[offset + 1] = (value >>> 8)
10820     this[offset + 2] = (value >>> 16)
10821     this[offset + 3] = (value >>> 24)
10822   } else {
10823     objectWriteUInt32(this, value, offset, true)
10824   }
10825   return offset + 4
10828 Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
10829   value = +value
10830   offset = offset | 0
10831   if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
10832   if (value < 0) value = 0xffffffff + value + 1
10833   if (Buffer.TYPED_ARRAY_SUPPORT) {
10834     this[offset] = (value >>> 24)
10835     this[offset + 1] = (value >>> 16)
10836     this[offset + 2] = (value >>> 8)
10837     this[offset + 3] = (value & 0xff)
10838   } else {
10839     objectWriteUInt32(this, value, offset, false)
10840   }
10841   return offset + 4
10844 function checkIEEE754 (buf, value, offset, ext, max, min) {
10845   if (offset + ext > buf.length) throw new RangeError('Index out of range')
10846   if (offset < 0) throw new RangeError('Index out of range')
10849 function writeFloat (buf, value, offset, littleEndian, noAssert) {
10850   if (!noAssert) {
10851     checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
10852   }
10853   ieee754.write(buf, value, offset, littleEndian, 23, 4)
10854   return offset + 4
10857 Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
10858   return writeFloat(this, value, offset, true, noAssert)
10861 Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
10862   return writeFloat(this, value, offset, false, noAssert)
10865 function writeDouble (buf, value, offset, littleEndian, noAssert) {
10866   if (!noAssert) {
10867     checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
10868   }
10869   ieee754.write(buf, value, offset, littleEndian, 52, 8)
10870   return offset + 8
10873 Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
10874   return writeDouble(this, value, offset, true, noAssert)
10877 Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
10878   return writeDouble(this, value, offset, false, noAssert)
10881 // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
10882 Buffer.prototype.copy = function copy (target, targetStart, start, end) {
10883   if (!start) start = 0
10884   if (!end && end !== 0) end = this.length
10885   if (targetStart >= target.length) targetStart = target.length
10886   if (!targetStart) targetStart = 0
10887   if (end > 0 && end < start) end = start
10889   // Copy 0 bytes; we're done
10890   if (end === start) return 0
10891   if (target.length === 0 || this.length === 0) return 0
10893   // Fatal error conditions
10894   if (targetStart < 0) {
10895     throw new RangeError('targetStart out of bounds')
10896   }
10897   if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
10898   if (end < 0) throw new RangeError('sourceEnd out of bounds')
10900   // Are we oob?
10901   if (end > this.length) end = this.length
10902   if (target.length - targetStart < end - start) {
10903     end = target.length - targetStart + start
10904   }
10906   var len = end - start
10907   var i
10909   if (this === target && start < targetStart && targetStart < end) {
10910     // descending copy from end
10911     for (i = len - 1; i >= 0; --i) {
10912       target[i + targetStart] = this[i + start]
10913     }
10914   } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
10915     // ascending copy from start
10916     for (i = 0; i < len; ++i) {
10917       target[i + targetStart] = this[i + start]
10918     }
10919   } else {
10920     Uint8Array.prototype.set.call(
10921       target,
10922       this.subarray(start, start + len),
10923       targetStart
10924     )
10925   }
10927   return len
10930 // Usage:
10931 //    buffer.fill(number[, offset[, end]])
10932 //    buffer.fill(buffer[, offset[, end]])
10933 //    buffer.fill(string[, offset[, end]][, encoding])
10934 Buffer.prototype.fill = function fill (val, start, end, encoding) {
10935   // Handle string cases:
10936   if (typeof val === 'string') {
10937     if (typeof start === 'string') {
10938       encoding = start
10939       start = 0
10940       end = this.length
10941     } else if (typeof end === 'string') {
10942       encoding = end
10943       end = this.length
10944     }
10945     if (val.length === 1) {
10946       var code = val.charCodeAt(0)
10947       if (code < 256) {
10948         val = code
10949       }
10950     }
10951     if (encoding !== undefined && typeof encoding !== 'string') {
10952       throw new TypeError('encoding must be a string')
10953     }
10954     if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
10955       throw new TypeError('Unknown encoding: ' + encoding)
10956     }
10957   } else if (typeof val === 'number') {
10958     val = val & 255
10959   }
10961   // Invalid ranges are not set to a default, so can range check early.
10962   if (start < 0 || this.length < start || this.length < end) {
10963     throw new RangeError('Out of range index')
10964   }
10966   if (end <= start) {
10967     return this
10968   }
10970   start = start >>> 0
10971   end = end === undefined ? this.length : end >>> 0
10973   if (!val) val = 0
10975   var i
10976   if (typeof val === 'number') {
10977     for (i = start; i < end; ++i) {
10978       this[i] = val
10979     }
10980   } else {
10981     var bytes = Buffer.isBuffer(val)
10982       ? val
10983       : utf8ToBytes(new Buffer(val, encoding).toString())
10984     var len = bytes.length
10985     for (i = 0; i < end - start; ++i) {
10986       this[i + start] = bytes[i % len]
10987     }
10988   }
10990   return this
10993 // HELPER FUNCTIONS
10994 // ================
10996 var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
10998 function base64clean (str) {
10999   // Node strips out invalid characters like \n and \t from the string, base64-js does not
11000   str = stringtrim(str).replace(INVALID_BASE64_RE, '')
11001   // Node converts strings with length < 2 to ''
11002   if (str.length < 2) return ''
11003   // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
11004   while (str.length % 4 !== 0) {
11005     str = str + '='
11006   }
11007   return str
11010 function stringtrim (str) {
11011   if (str.trim) return str.trim()
11012   return str.replace(/^\s+|\s+$/g, '')
11015 function toHex (n) {
11016   if (n < 16) return '0' + n.toString(16)
11017   return n.toString(16)
11020 function utf8ToBytes (string, units) {
11021   units = units || Infinity
11022   var codePoint
11023   var length = string.length
11024   var leadSurrogate = null
11025   var bytes = []
11027   for (var i = 0; i < length; ++i) {
11028     codePoint = string.charCodeAt(i)
11030     // is surrogate component
11031     if (codePoint > 0xD7FF && codePoint < 0xE000) {
11032       // last char was a lead
11033       if (!leadSurrogate) {
11034         // no lead yet
11035         if (codePoint > 0xDBFF) {
11036           // unexpected trail
11037           if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
11038           continue
11039         } else if (i + 1 === length) {
11040           // unpaired lead
11041           if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
11042           continue
11043         }
11045         // valid lead
11046         leadSurrogate = codePoint
11048         continue
11049       }
11051       // 2 leads in a row
11052       if (codePoint < 0xDC00) {
11053         if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
11054         leadSurrogate = codePoint
11055         continue
11056       }
11058       // valid surrogate pair
11059       codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
11060     } else if (leadSurrogate) {
11061       // valid bmp char, but last char was a lead
11062       if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
11063     }
11065     leadSurrogate = null
11067     // encode utf8
11068     if (codePoint < 0x80) {
11069       if ((units -= 1) < 0) break
11070       bytes.push(codePoint)
11071     } else if (codePoint < 0x800) {
11072       if ((units -= 2) < 0) break
11073       bytes.push(
11074         codePoint >> 0x6 | 0xC0,
11075         codePoint & 0x3F | 0x80
11076       )
11077     } else if (codePoint < 0x10000) {
11078       if ((units -= 3) < 0) break
11079       bytes.push(
11080         codePoint >> 0xC | 0xE0,
11081         codePoint >> 0x6 & 0x3F | 0x80,
11082         codePoint & 0x3F | 0x80
11083       )
11084     } else if (codePoint < 0x110000) {
11085       if ((units -= 4) < 0) break
11086       bytes.push(
11087         codePoint >> 0x12 | 0xF0,
11088         codePoint >> 0xC & 0x3F | 0x80,
11089         codePoint >> 0x6 & 0x3F | 0x80,
11090         codePoint & 0x3F | 0x80
11091       )
11092     } else {
11093       throw new Error('Invalid code point')
11094     }
11095   }
11097   return bytes
11100 function asciiToBytes (str) {
11101   var byteArray = []
11102   for (var i = 0; i < str.length; ++i) {
11103     // Node's code seems to be doing this and not & 0x7F..
11104     byteArray.push(str.charCodeAt(i) & 0xFF)
11105   }
11106   return byteArray
11109 function utf16leToBytes (str, units) {
11110   var c, hi, lo
11111   var byteArray = []
11112   for (var i = 0; i < str.length; ++i) {
11113     if ((units -= 2) < 0) break
11115     c = str.charCodeAt(i)
11116     hi = c >> 8
11117     lo = c % 256
11118     byteArray.push(lo)
11119     byteArray.push(hi)
11120   }
11122   return byteArray
11125 function base64ToBytes (str) {
11126   return base64.toByteArray(base64clean(str))
11129 function blitBuffer (src, dst, offset, length) {
11130   for (var i = 0; i < length; ++i) {
11131     if ((i + offset >= dst.length) || (i >= src.length)) break
11132     dst[i + offset] = src[i]
11133   }
11134   return i
11137 function isnan (val) {
11138   return val !== val // eslint-disable-line no-self-compare
11141 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7)))
11143 /***/ }),
11144 /* 2 */
11145 /***/ (function(module, exports) {
11147 var core = module.exports = { version: '2.5.3' };
11148 if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
11151 /***/ }),
11152 /* 3 */
11153 /***/ (function(module, exports, __webpack_require__) {
11155 var global = __webpack_require__(10);
11156 var core = __webpack_require__(2);
11157 var ctx = __webpack_require__(20);
11158 var hide = __webpack_require__(13);
11159 var PROTOTYPE = 'prototype';
11161 var $export = function (type, name, source) {
11162   var IS_FORCED = type & $export.F;
11163   var IS_GLOBAL = type & $export.G;
11164   var IS_STATIC = type & $export.S;
11165   var IS_PROTO = type & $export.P;
11166   var IS_BIND = type & $export.B;
11167   var IS_WRAP = type & $export.W;
11168   var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
11169   var expProto = exports[PROTOTYPE];
11170   var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
11171   var key, own, out;
11172   if (IS_GLOBAL) source = name;
11173   for (key in source) {
11174     // contains in native
11175     own = !IS_FORCED && target && target[key] !== undefined;
11176     if (own && key in exports) continue;
11177     // export native or passed
11178     out = own ? target[key] : source[key];
11179     // prevent global pollution for namespaces
11180     exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
11181     // bind timers to global for call from export context
11182     : IS_BIND && own ? ctx(out, global)
11183     // wrap global constructors for prevent change them in library
11184     : IS_WRAP && target[key] == out ? (function (C) {
11185       var F = function (a, b, c) {
11186         if (this instanceof C) {
11187           switch (arguments.length) {
11188             case 0: return new C();
11189             case 1: return new C(a);
11190             case 2: return new C(a, b);
11191           } return new C(a, b, c);
11192         } return C.apply(this, arguments);
11193       };
11194       F[PROTOTYPE] = C[PROTOTYPE];
11195       return F;
11196     // make static versions for prototype methods
11197     })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
11198     // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
11199     if (IS_PROTO) {
11200       (exports.virtual || (exports.virtual = {}))[key] = out;
11201       // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
11202       if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
11203     }
11204   }
11206 // type bitmap
11207 $export.F = 1;   // forced
11208 $export.G = 2;   // global
11209 $export.S = 4;   // static
11210 $export.P = 8;   // proto
11211 $export.B = 16;  // bind
11212 $export.W = 32;  // wrap
11213 $export.U = 64;  // safe
11214 $export.R = 128; // real proto method for `library`
11215 module.exports = $export;
11218 /***/ }),
11219 /* 4 */
11220 /***/ (function(module, exports, __webpack_require__) {
11222 var store = __webpack_require__(65)('wks');
11223 var uid = __webpack_require__(38);
11224 var Symbol = __webpack_require__(10).Symbol;
11225 var USE_SYMBOL = typeof Symbol == 'function';
11227 var $exports = module.exports = function (name) {
11228   return store[name] || (store[name] =
11229     USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
11232 $exports.store = store;
11235 /***/ }),
11236 /* 5 */
11237 /***/ (function(module, exports, __webpack_require__) {
11239 // Thank's IE8 for his funny defineProperty
11240 module.exports = !__webpack_require__(19)(function () {
11241   return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
11245 /***/ }),
11246 /* 6 */
11247 /***/ (function(module, exports, __webpack_require__) {
11249 var anObject = __webpack_require__(14);
11250 var IE8_DOM_DEFINE = __webpack_require__(95);
11251 var toPrimitive = __webpack_require__(58);
11252 var dP = Object.defineProperty;
11254 exports.f = __webpack_require__(5) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
11255   anObject(O);
11256   P = toPrimitive(P, true);
11257   anObject(Attributes);
11258   if (IE8_DOM_DEFINE) try {
11259     return dP(O, P, Attributes);
11260   } catch (e) { /* empty */ }
11261   if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
11262   if ('value' in Attributes) O[P] = Attributes.value;
11263   return O;
11267 /***/ }),
11268 /* 7 */
11269 /***/ (function(module, exports) {
11271 var g;
11273 // This works in non-strict mode
11274 g = (function() {
11275         return this;
11276 })();
11278 try {
11279         // This works if eval is allowed (see CSP)
11280         g = g || Function("return this")() || (1,eval)("this");
11281 } catch(e) {
11282         // This works if the window reference is available
11283         if(typeof window === "object")
11284                 g = window;
11287 // g can still be undefined, but nothing to do about it...
11288 // We return undefined, instead of nothing here, so it's
11289 // easier to handle this case. if(!global) { ...}
11291 module.exports = g;
11294 /***/ }),
11295 /* 8 */
11296 /***/ (function(module, exports, __webpack_require__) {
11298 "use strict";
11299 /* WEBPACK VAR INJECTION */(function(Buffer, __dirname) {
11301 function VirtualFileSystem() {
11302         this.fileSystem = {};
11303         this.baseSystem = {};
11306 VirtualFileSystem.prototype.readFileSync = function (filename) {
11307         filename = fixFilename(filename);
11309         var base64content = this.baseSystem[filename];
11310         if (base64content) {
11311                 return new Buffer(base64content, 'base64');
11312         }
11314         var content = this.fileSystem[filename];
11315         if (content) {
11316                 return content;
11317         }
11319         throw 'File \'' + filename + '\' not found in virtual file system';
11322 VirtualFileSystem.prototype.writeFileSync = function (filename, content) {
11323         this.fileSystem[fixFilename(filename)] = content;
11326 VirtualFileSystem.prototype.bindFS = function (data) {
11327         this.baseSystem = data || {};
11331 function fixFilename(filename) {
11332         if (filename.indexOf(__dirname) === 0) {
11333                 filename = filename.substring(__dirname.length);
11334         }
11336         if (filename.indexOf('/') === 0) {
11337                 filename = filename.substring(1);
11338         }
11340         return filename;
11343 module.exports = new VirtualFileSystem();
11345 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer, "/"))
11347 /***/ }),
11348 /* 9 */
11349 /***/ (function(module, exports) {
11351 module.exports = function (it) {
11352   return typeof it === 'object' ? it !== null : typeof it === 'function';
11356 /***/ }),
11357 /* 10 */
11358 /***/ (function(module, exports) {
11360 // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
11361 var global = module.exports = typeof window != 'undefined' && window.Math == Math
11362   ? window : typeof self != 'undefined' && self.Math == Math ? self
11363   // eslint-disable-next-line no-new-func
11364   : Function('return this')();
11365 if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
11368 /***/ }),
11369 /* 11 */
11370 /***/ (function(module, exports) {
11372 // shim for using process in browser
11373 var process = module.exports = {};
11375 // cached from whatever global is present so that test runners that stub it
11376 // don't break things.  But we need to wrap it in a try catch in case it is
11377 // wrapped in strict mode code which doesn't define any globals.  It's inside a
11378 // function because try/catches deoptimize in certain engines.
11380 var cachedSetTimeout;
11381 var cachedClearTimeout;
11383 function defaultSetTimout() {
11384     throw new Error('setTimeout has not been defined');
11386 function defaultClearTimeout () {
11387     throw new Error('clearTimeout has not been defined');
11389 (function () {
11390     try {
11391         if (typeof setTimeout === 'function') {
11392             cachedSetTimeout = setTimeout;
11393         } else {
11394             cachedSetTimeout = defaultSetTimout;
11395         }
11396     } catch (e) {
11397         cachedSetTimeout = defaultSetTimout;
11398     }
11399     try {
11400         if (typeof clearTimeout === 'function') {
11401             cachedClearTimeout = clearTimeout;
11402         } else {
11403             cachedClearTimeout = defaultClearTimeout;
11404         }
11405     } catch (e) {
11406         cachedClearTimeout = defaultClearTimeout;
11407     }
11408 } ())
11409 function runTimeout(fun) {
11410     if (cachedSetTimeout === setTimeout) {
11411         //normal enviroments in sane situations
11412         return setTimeout(fun, 0);
11413     }
11414     // if setTimeout wasn't available but was latter defined
11415     if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
11416         cachedSetTimeout = setTimeout;
11417         return setTimeout(fun, 0);
11418     }
11419     try {
11420         // when when somebody has screwed with setTimeout but no I.E. maddness
11421         return cachedSetTimeout(fun, 0);
11422     } catch(e){
11423         try {
11424             // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
11425             return cachedSetTimeout.call(null, fun, 0);
11426         } catch(e){
11427             // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
11428             return cachedSetTimeout.call(this, fun, 0);
11429         }
11430     }
11434 function runClearTimeout(marker) {
11435     if (cachedClearTimeout === clearTimeout) {
11436         //normal enviroments in sane situations
11437         return clearTimeout(marker);
11438     }
11439     // if clearTimeout wasn't available but was latter defined
11440     if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
11441         cachedClearTimeout = clearTimeout;
11442         return clearTimeout(marker);
11443     }
11444     try {
11445         // when when somebody has screwed with setTimeout but no I.E. maddness
11446         return cachedClearTimeout(marker);
11447     } catch (e){
11448         try {
11449             // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
11450             return cachedClearTimeout.call(null, marker);
11451         } catch (e){
11452             // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
11453             // Some versions of I.E. have different rules for clearTimeout vs setTimeout
11454             return cachedClearTimeout.call(this, marker);
11455         }
11456     }
11461 var queue = [];
11462 var draining = false;
11463 var currentQueue;
11464 var queueIndex = -1;
11466 function cleanUpNextTick() {
11467     if (!draining || !currentQueue) {
11468         return;
11469     }
11470     draining = false;
11471     if (currentQueue.length) {
11472         queue = currentQueue.concat(queue);
11473     } else {
11474         queueIndex = -1;
11475     }
11476     if (queue.length) {
11477         drainQueue();
11478     }
11481 function drainQueue() {
11482     if (draining) {
11483         return;
11484     }
11485     var timeout = runTimeout(cleanUpNextTick);
11486     draining = true;
11488     var len = queue.length;
11489     while(len) {
11490         currentQueue = queue;
11491         queue = [];
11492         while (++queueIndex < len) {
11493             if (currentQueue) {
11494                 currentQueue[queueIndex].run();
11495             }
11496         }
11497         queueIndex = -1;
11498         len = queue.length;
11499     }
11500     currentQueue = null;
11501     draining = false;
11502     runClearTimeout(timeout);
11505 process.nextTick = function (fun) {
11506     var args = new Array(arguments.length - 1);
11507     if (arguments.length > 1) {
11508         for (var i = 1; i < arguments.length; i++) {
11509             args[i - 1] = arguments[i];
11510         }
11511     }
11512     queue.push(new Item(fun, args));
11513     if (queue.length === 1 && !draining) {
11514         runTimeout(drainQueue);
11515     }
11518 // v8 likes predictible objects
11519 function Item(fun, array) {
11520     this.fun = fun;
11521     this.array = array;
11523 Item.prototype.run = function () {
11524     this.fun.apply(null, this.array);
11526 process.title = 'browser';
11527 process.browser = true;
11528 process.env = {};
11529 process.argv = [];
11530 process.version = ''; // empty string to avoid regexp issues
11531 process.versions = {};
11533 function noop() {}
11535 process.on = noop;
11536 process.addListener = noop;
11537 process.once = noop;
11538 process.off = noop;
11539 process.removeListener = noop;
11540 process.removeAllListeners = noop;
11541 process.emit = noop;
11542 process.prependListener = noop;
11543 process.prependOnceListener = noop;
11545 process.listeners = function (name) { return [] }
11547 process.binding = function (name) {
11548     throw new Error('process.binding is not supported');
11551 process.cwd = function () { return '/' };
11552 process.chdir = function (dir) {
11553     throw new Error('process.chdir is not supported');
11555 process.umask = function() { return 0; };
11558 /***/ }),
11559 /* 12 */
11560 /***/ (function(module, exports, __webpack_require__) {
11562 // Generated by CoffeeScript 1.7.1
11563 (function() {
11564   var NumberT, PropertyDescriptor;
11566   NumberT = __webpack_require__(22).Number;
11568   exports.resolveLength = function(length, stream, parent) {
11569     var res;
11570     if (typeof length === 'number') {
11571       res = length;
11572     } else if (typeof length === 'function') {
11573       res = length.call(parent, parent);
11574     } else if (parent && typeof length === 'string') {
11575       res = parent[length];
11576     } else if (stream && length instanceof NumberT) {
11577       res = length.decode(stream);
11578     }
11579     if (isNaN(res)) {
11580       throw new Error('Not a fixed size');
11581     }
11582     return res;
11583   };
11585   PropertyDescriptor = (function() {
11586     function PropertyDescriptor(opts) {
11587       var key, val;
11588       if (opts == null) {
11589         opts = {};
11590       }
11591       this.enumerable = true;
11592       this.configurable = true;
11593       for (key in opts) {
11594         val = opts[key];
11595         this[key] = val;
11596       }
11597     }
11599     return PropertyDescriptor;
11601   })();
11603   exports.PropertyDescriptor = PropertyDescriptor;
11605 }).call(this);
11608 /***/ }),
11609 /* 13 */
11610 /***/ (function(module, exports, __webpack_require__) {
11612 var dP = __webpack_require__(6);
11613 var createDesc = __webpack_require__(27);
11614 module.exports = __webpack_require__(5) ? function (object, key, value) {
11615   return dP.f(object, key, createDesc(1, value));
11616 } : function (object, key, value) {
11617   object[key] = value;
11618   return object;
11622 /***/ }),
11623 /* 14 */
11624 /***/ (function(module, exports, __webpack_require__) {
11626 var isObject = __webpack_require__(9);
11627 module.exports = function (it) {
11628   if (!isObject(it)) throw TypeError(it + ' is not an object!');
11629   return it;
11633 /***/ }),
11634 /* 15 */
11635 /***/ (function(module, exports, __webpack_require__) {
11637 // Copyright Joyent, Inc. and other Node contributors.
11639 // Permission is hereby granted, free of charge, to any person obtaining a
11640 // copy of this software and associated documentation files (the
11641 // "Software"), to deal in the Software without restriction, including
11642 // without limitation the rights to use, copy, modify, merge, publish,
11643 // distribute, sublicense, and/or sell copies of the Software, and to permit
11644 // persons to whom the Software is furnished to do so, subject to the
11645 // following conditions:
11647 // The above copyright notice and this permission notice shall be included
11648 // in all copies or substantial portions of the Software.
11650 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
11651 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
11652 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
11653 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
11654 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
11655 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
11656 // USE OR OTHER DEALINGS IN THE SOFTWARE.
11658 module.exports = Stream;
11660 var EE = __webpack_require__(31).EventEmitter;
11661 var inherits = __webpack_require__(21);
11663 inherits(Stream, EE);
11664 Stream.Readable = __webpack_require__(45);
11665 Stream.Writable = __webpack_require__(146);
11666 Stream.Duplex = __webpack_require__(147);
11667 Stream.Transform = __webpack_require__(148);
11668 Stream.PassThrough = __webpack_require__(149);
11670 // Backwards-compat with node 0.4.x
11671 Stream.Stream = Stream;
11675 // old-style streams.  Note that the pipe method (the only relevant
11676 // part of this class) is overridden in the Readable class.
11678 function Stream() {
11679   EE.call(this);
11682 Stream.prototype.pipe = function(dest, options) {
11683   var source = this;
11685   function ondata(chunk) {
11686     if (dest.writable) {
11687       if (false === dest.write(chunk) && source.pause) {
11688         source.pause();
11689       }
11690     }
11691   }
11693   source.on('data', ondata);
11695   function ondrain() {
11696     if (source.readable && source.resume) {
11697       source.resume();
11698     }
11699   }
11701   dest.on('drain', ondrain);
11703   // If the 'end' option is not supplied, dest.end() will be called when
11704   // source gets the 'end' or 'close' events.  Only dest.end() once.
11705   if (!dest._isStdio && (!options || options.end !== false)) {
11706     source.on('end', onend);
11707     source.on('close', onclose);
11708   }
11710   var didOnEnd = false;
11711   function onend() {
11712     if (didOnEnd) return;
11713     didOnEnd = true;
11715     dest.end();
11716   }
11719   function onclose() {
11720     if (didOnEnd) return;
11721     didOnEnd = true;
11723     if (typeof dest.destroy === 'function') dest.destroy();
11724   }
11726   // don't leave dangling pipes when there are errors.
11727   function onerror(er) {
11728     cleanup();
11729     if (EE.listenerCount(this, 'error') === 0) {
11730       throw er; // Unhandled stream error in pipe.
11731     }
11732   }
11734   source.on('error', onerror);
11735   dest.on('error', onerror);
11737   // remove all the event listeners that were added.
11738   function cleanup() {
11739     source.removeListener('data', ondata);
11740     dest.removeListener('drain', ondrain);
11742     source.removeListener('end', onend);
11743     source.removeListener('close', onclose);
11745     source.removeListener('error', onerror);
11746     dest.removeListener('error', onerror);
11748     source.removeListener('end', cleanup);
11749     source.removeListener('close', cleanup);
11751     dest.removeListener('close', cleanup);
11752   }
11754   source.on('end', cleanup);
11755   source.on('close', cleanup);
11757   dest.on('close', cleanup);
11759   dest.emit('pipe', source);
11761   // Allow for unix-like usage: A.pipe(B).pipe(C)
11762   return dest;
11766 /***/ }),
11767 /* 16 */
11768 /***/ (function(module, exports, __webpack_require__) {
11770 "use strict";
11771 // Copyright Joyent, Inc. and other Node contributors.
11773 // Permission is hereby granted, free of charge, to any person obtaining a
11774 // copy of this software and associated documentation files (the
11775 // "Software"), to deal in the Software without restriction, including
11776 // without limitation the rights to use, copy, modify, merge, publish,
11777 // distribute, sublicense, and/or sell copies of the Software, and to permit
11778 // persons to whom the Software is furnished to do so, subject to the
11779 // following conditions:
11781 // The above copyright notice and this permission notice shall be included
11782 // in all copies or substantial portions of the Software.
11784 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
11785 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
11786 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
11787 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
11788 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
11789 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
11790 // USE OR OTHER DEALINGS IN THE SOFTWARE.
11792 // a duplex stream is just a stream that is both readable and writable.
11793 // Since JS doesn't have multiple prototypal inheritance, this class
11794 // prototypally inherits from Readable, and then parasitically from
11795 // Writable.
11799 /*<replacement>*/
11801 var processNextTick = __webpack_require__(32).nextTick;
11802 /*</replacement>*/
11804 /*<replacement>*/
11805 var objectKeys = Object.keys || function (obj) {
11806   var keys = [];
11807   for (var key in obj) {
11808     keys.push(key);
11809   }return keys;
11811 /*</replacement>*/
11813 module.exports = Duplex;
11815 /*<replacement>*/
11816 var util = __webpack_require__(25);
11817 util.inherits = __webpack_require__(21);
11818 /*</replacement>*/
11820 var Readable = __webpack_require__(83);
11821 var Writable = __webpack_require__(46);
11823 util.inherits(Duplex, Readable);
11825 var keys = objectKeys(Writable.prototype);
11826 for (var v = 0; v < keys.length; v++) {
11827   var method = keys[v];
11828   if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
11831 function Duplex(options) {
11832   if (!(this instanceof Duplex)) return new Duplex(options);
11834   Readable.call(this, options);
11835   Writable.call(this, options);
11837   if (options && options.readable === false) this.readable = false;
11839   if (options && options.writable === false) this.writable = false;
11841   this.allowHalfOpen = true;
11842   if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
11844   this.once('end', onend);
11847 // the no-half-open enforcer
11848 function onend() {
11849   // if we allow half-open state, or if the writable side ended,
11850   // then we're ok.
11851   if (this.allowHalfOpen || this._writableState.ended) return;
11853   // no more data can be written.
11854   // But allow more writes to happen in this tick.
11855   processNextTick(onEndNT, this);
11858 function onEndNT(self) {
11859   self.end();
11862 Object.defineProperty(Duplex.prototype, 'destroyed', {
11863   get: function () {
11864     if (this._readableState === undefined || this._writableState === undefined) {
11865       return false;
11866     }
11867     return this._readableState.destroyed && this._writableState.destroyed;
11868   },
11869   set: function (value) {
11870     // we ignore the value if the stream
11871     // has not been initialized yet
11872     if (this._readableState === undefined || this._writableState === undefined) {
11873       return;
11874     }
11876     // backward compatibility, the user is explicitly
11877     // managing destroyed
11878     this._readableState.destroyed = value;
11879     this._writableState.destroyed = value;
11880   }
11883 Duplex.prototype._destroy = function (err, cb) {
11884   this.push(null);
11885   this.end();
11887   processNextTick(cb, err);
11890 function forEach(xs, f) {
11891   for (var i = 0, l = xs.length; i < l; i++) {
11892     f(xs[i], i);
11893   }
11896 /***/ }),
11897 /* 17 */
11898 /***/ (function(module, exports, __webpack_require__) {
11900 // to indexed object, toObject with fallback for non-array-like ES3 strings
11901 var IObject = __webpack_require__(54);
11902 var defined = __webpack_require__(56);
11903 module.exports = function (it) {
11904   return IObject(defined(it));
11908 /***/ }),
11909 /* 18 */
11910 /***/ (function(module, exports) {
11912 var hasOwnProperty = {}.hasOwnProperty;
11913 module.exports = function (it, key) {
11914   return hasOwnProperty.call(it, key);
11918 /***/ }),
11919 /* 19 */
11920 /***/ (function(module, exports) {
11922 module.exports = function (exec) {
11923   try {
11924     return !!exec();
11925   } catch (e) {
11926     return true;
11927   }
11931 /***/ }),
11932 /* 20 */
11933 /***/ (function(module, exports, __webpack_require__) {
11935 // optional / simple context binding
11936 var aFunction = __webpack_require__(97);
11937 module.exports = function (fn, that, length) {
11938   aFunction(fn);
11939   if (that === undefined) return fn;
11940   switch (length) {
11941     case 1: return function (a) {
11942       return fn.call(that, a);
11943     };
11944     case 2: return function (a, b) {
11945       return fn.call(that, a, b);
11946     };
11947     case 3: return function (a, b, c) {
11948       return fn.call(that, a, b, c);
11949     };
11950   }
11951   return function (/* ...args */) {
11952     return fn.apply(that, arguments);
11953   };
11957 /***/ }),
11958 /* 21 */
11959 /***/ (function(module, exports) {
11961 if (typeof Object.create === 'function') {
11962   // implementation from standard node.js 'util' module
11963   module.exports = function inherits(ctor, superCtor) {
11964     ctor.super_ = superCtor
11965     ctor.prototype = Object.create(superCtor.prototype, {
11966       constructor: {
11967         value: ctor,
11968         enumerable: false,
11969         writable: true,
11970         configurable: true
11971       }
11972     });
11973   };
11974 } else {
11975   // old school shim for old browsers
11976   module.exports = function inherits(ctor, superCtor) {
11977     ctor.super_ = superCtor
11978     var TempCtor = function () {}
11979     TempCtor.prototype = superCtor.prototype
11980     ctor.prototype = new TempCtor()
11981     ctor.prototype.constructor = ctor
11982   }
11986 /***/ }),
11987 /* 22 */
11988 /***/ (function(module, exports, __webpack_require__) {
11990 // Generated by CoffeeScript 1.7.1
11991 (function() {
11992   var DecodeStream, Fixed, NumberT,
11993     __hasProp = {}.hasOwnProperty,
11994     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
11996   DecodeStream = __webpack_require__(51);
11998   NumberT = (function() {
11999     function NumberT(type, endian) {
12000       this.type = type;
12001       this.endian = endian != null ? endian : 'BE';
12002       this.fn = this.type;
12003       if (this.type[this.type.length - 1] !== '8') {
12004         this.fn += this.endian;
12005       }
12006     }
12008     NumberT.prototype.size = function() {
12009       return DecodeStream.TYPES[this.type];
12010     };
12012     NumberT.prototype.decode = function(stream) {
12013       return stream['read' + this.fn]();
12014     };
12016     NumberT.prototype.encode = function(stream, val) {
12017       return stream['write' + this.fn](val);
12018     };
12020     return NumberT;
12022   })();
12024   exports.Number = NumberT;
12026   exports.uint8 = new NumberT('UInt8');
12028   exports.uint16be = exports.uint16 = new NumberT('UInt16', 'BE');
12030   exports.uint16le = new NumberT('UInt16', 'LE');
12032   exports.uint24be = exports.uint24 = new NumberT('UInt24', 'BE');
12034   exports.uint24le = new NumberT('UInt24', 'LE');
12036   exports.uint32be = exports.uint32 = new NumberT('UInt32', 'BE');
12038   exports.uint32le = new NumberT('UInt32', 'LE');
12040   exports.int8 = new NumberT('Int8');
12042   exports.int16be = exports.int16 = new NumberT('Int16', 'BE');
12044   exports.int16le = new NumberT('Int16', 'LE');
12046   exports.int24be = exports.int24 = new NumberT('Int24', 'BE');
12048   exports.int24le = new NumberT('Int24', 'LE');
12050   exports.int32be = exports.int32 = new NumberT('Int32', 'BE');
12052   exports.int32le = new NumberT('Int32', 'LE');
12054   exports.floatbe = exports.float = new NumberT('Float', 'BE');
12056   exports.floatle = new NumberT('Float', 'LE');
12058   exports.doublebe = exports.double = new NumberT('Double', 'BE');
12060   exports.doublele = new NumberT('Double', 'LE');
12062   Fixed = (function(_super) {
12063     __extends(Fixed, _super);
12065     function Fixed(size, endian, fracBits) {
12066       if (fracBits == null) {
12067         fracBits = size >> 1;
12068       }
12069       Fixed.__super__.constructor.call(this, "Int" + size, endian);
12070       this._point = 1 << fracBits;
12071     }
12073     Fixed.prototype.decode = function(stream) {
12074       return Fixed.__super__.decode.call(this, stream) / this._point;
12075     };
12077     Fixed.prototype.encode = function(stream, val) {
12078       return Fixed.__super__.encode.call(this, stream, val * this._point | 0);
12079     };
12081     return Fixed;
12083   })(NumberT);
12085   exports.Fixed = Fixed;
12087   exports.fixed16be = exports.fixed16 = new Fixed(16, 'BE');
12089   exports.fixed16le = new Fixed(16, 'LE');
12091   exports.fixed32be = exports.fixed32 = new Fixed(32, 'BE');
12093   exports.fixed32le = new Fixed(32, 'LE');
12095 }).call(this);
12098 /***/ }),
12099 /* 23 */
12100 /***/ (function(module, exports) {
12102 module.exports = {};
12105 /***/ }),
12106 /* 24 */
12107 /***/ (function(module, exports, __webpack_require__) {
12109 "use strict";
12111 var $at = __webpack_require__(207)(true);
12113 // 21.1.3.27 String.prototype[@@iterator]()
12114 __webpack_require__(61)(String, 'String', function (iterated) {
12115   this._t = String(iterated); // target
12116   this._i = 0;                // next index
12117 // 21.1.5.2.1 %StringIteratorPrototype%.next()
12118 }, function () {
12119   var O = this._t;
12120   var index = this._i;
12121   var point;
12122   if (index >= O.length) return { value: undefined, done: true };
12123   point = $at(O, index);
12124   this._i += point.length;
12125   return { value: point, done: false };
12129 /***/ }),
12130 /* 25 */
12131 /***/ (function(module, exports, __webpack_require__) {
12133 /* WEBPACK VAR INJECTION */(function(Buffer) {// Copyright Joyent, Inc. and other Node contributors.
12135 // Permission is hereby granted, free of charge, to any person obtaining a
12136 // copy of this software and associated documentation files (the
12137 // "Software"), to deal in the Software without restriction, including
12138 // without limitation the rights to use, copy, modify, merge, publish,
12139 // distribute, sublicense, and/or sell copies of the Software, and to permit
12140 // persons to whom the Software is furnished to do so, subject to the
12141 // following conditions:
12143 // The above copyright notice and this permission notice shall be included
12144 // in all copies or substantial portions of the Software.
12146 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12147 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
12148 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
12149 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
12150 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
12151 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
12152 // USE OR OTHER DEALINGS IN THE SOFTWARE.
12154 // NOTE: These type checking functions intentionally don't use `instanceof`
12155 // because it is fragile and can be easily faked with `Object.create()`.
12157 function isArray(arg) {
12158   if (Array.isArray) {
12159     return Array.isArray(arg);
12160   }
12161   return objectToString(arg) === '[object Array]';
12163 exports.isArray = isArray;
12165 function isBoolean(arg) {
12166   return typeof arg === 'boolean';
12168 exports.isBoolean = isBoolean;
12170 function isNull(arg) {
12171   return arg === null;
12173 exports.isNull = isNull;
12175 function isNullOrUndefined(arg) {
12176   return arg == null;
12178 exports.isNullOrUndefined = isNullOrUndefined;
12180 function isNumber(arg) {
12181   return typeof arg === 'number';
12183 exports.isNumber = isNumber;
12185 function isString(arg) {
12186   return typeof arg === 'string';
12188 exports.isString = isString;
12190 function isSymbol(arg) {
12191   return typeof arg === 'symbol';
12193 exports.isSymbol = isSymbol;
12195 function isUndefined(arg) {
12196   return arg === void 0;
12198 exports.isUndefined = isUndefined;
12200 function isRegExp(re) {
12201   return objectToString(re) === '[object RegExp]';
12203 exports.isRegExp = isRegExp;
12205 function isObject(arg) {
12206   return typeof arg === 'object' && arg !== null;
12208 exports.isObject = isObject;
12210 function isDate(d) {
12211   return objectToString(d) === '[object Date]';
12213 exports.isDate = isDate;
12215 function isError(e) {
12216   return (objectToString(e) === '[object Error]' || e instanceof Error);
12218 exports.isError = isError;
12220 function isFunction(arg) {
12221   return typeof arg === 'function';
12223 exports.isFunction = isFunction;
12225 function isPrimitive(arg) {
12226   return arg === null ||
12227          typeof arg === 'boolean' ||
12228          typeof arg === 'number' ||
12229          typeof arg === 'string' ||
12230          typeof arg === 'symbol' ||  // ES6 symbol
12231          typeof arg === 'undefined';
12233 exports.isPrimitive = isPrimitive;
12235 exports.isBuffer = Buffer.isBuffer;
12237 function objectToString(o) {
12238   return Object.prototype.toString.call(o);
12241 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
12243 /***/ }),
12244 /* 26 */
12245 /***/ (function(module, exports, __webpack_require__) {
12247 /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.12.6
12250 PDFObject - converts JavaScript types into their corrisponding PDF types.
12251 By Devon Govett
12252  */
12254 (function() {
12255   var PDFObject, PDFReference;
12257   PDFObject = (function() {
12258     var escapable, escapableRe, pad, swapBytes;
12260     function PDFObject() {}
12262     pad = function(str, length) {
12263       return (Array(length + 1).join('0') + str).slice(-length);
12264     };
12266     escapableRe = /[\n\r\t\b\f\(\)\\]/g;
12268     escapable = {
12269       '\n': '\\n',
12270       '\r': '\\r',
12271       '\t': '\\t',
12272       '\b': '\\b',
12273       '\f': '\\f',
12274       '\\': '\\\\',
12275       '(': '\\(',
12276       ')': '\\)'
12277     };
12279     swapBytes = function(buff) {
12280       var a, i, j, l, ref;
12281       l = buff.length;
12282       if (l & 0x01) {
12283         throw new Error("Buffer length must be even");
12284       } else {
12285         for (i = j = 0, ref = l - 1; j < ref; i = j += 2) {
12286           a = buff[i];
12287           buff[i] = buff[i + 1];
12288           buff[i + 1] = a;
12289         }
12290       }
12291       return buff;
12292     };
12294     PDFObject.convert = function(object) {
12295       var e, i, isUnicode, items, j, key, out, ref, string, val;
12296       if (typeof object === 'string') {
12297         return '/' + object;
12298       } else if (object instanceof String) {
12299         string = object;
12300         isUnicode = false;
12301         for (i = j = 0, ref = string.length; j < ref; i = j += 1) {
12302           if (string.charCodeAt(i) > 0x7f) {
12303             isUnicode = true;
12304             break;
12305           }
12306         }
12307         if (isUnicode) {
12308           string = swapBytes(new Buffer('\ufeff' + string, 'utf16le')).toString('binary');
12309         }
12310         string = string.replace(escapableRe, function(c) {
12311           return escapable[c];
12312         });
12313         return '(' + string + ')';
12314       } else if (Buffer.isBuffer(object)) {
12315         return '<' + object.toString('hex') + '>';
12316       } else if (object instanceof PDFReference) {
12317         return object.toString();
12318       } else if (object instanceof Date) {
12319         return '(D:' + pad(object.getUTCFullYear(), 4) + pad(object.getUTCMonth() + 1, 2) + pad(object.getUTCDate(), 2) + pad(object.getUTCHours(), 2) + pad(object.getUTCMinutes(), 2) + pad(object.getUTCSeconds(), 2) + 'Z)';
12320       } else if (Array.isArray(object)) {
12321         items = ((function() {
12322           var k, len, results;
12323           results = [];
12324           for (k = 0, len = object.length; k < len; k++) {
12325             e = object[k];
12326             results.push(PDFObject.convert(e));
12327           }
12328           return results;
12329         })()).join(' ');
12330         return '[' + items + ']';
12331       } else if ({}.toString.call(object) === '[object Object]') {
12332         out = ['<<'];
12333         for (key in object) {
12334           val = object[key];
12335           out.push('/' + key + ' ' + PDFObject.convert(val));
12336         }
12337         out.push('>>');
12338         return out.join('\n');
12339       } else if (typeof object === 'number') {
12340         return PDFObject.number(object);
12341       } else {
12342         return '' + object;
12343       }
12344     };
12346     PDFObject.number = function(n) {
12347       if (n > -1e21 && n < 1e21) {
12348         return Math.round(n * 1e6) / 1e6;
12349       }
12350       throw new Error("unsupported number: " + n);
12351     };
12353     return PDFObject;
12355   })();
12357   module.exports = PDFObject;
12359   PDFReference = __webpack_require__(87);
12361 }).call(this);
12363 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
12365 /***/ }),
12366 /* 27 */
12367 /***/ (function(module, exports) {
12369 module.exports = function (bitmap, value) {
12370   return {
12371     enumerable: !(bitmap & 1),
12372     configurable: !(bitmap & 2),
12373     writable: !(bitmap & 4),
12374     value: value
12375   };
12379 /***/ }),
12380 /* 28 */
12381 /***/ (function(module, exports, __webpack_require__) {
12383 __webpack_require__(201);
12384 var global = __webpack_require__(10);
12385 var hide = __webpack_require__(13);
12386 var Iterators = __webpack_require__(23);
12387 var TO_STRING_TAG = __webpack_require__(4)('toStringTag');
12389 var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
12390   'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
12391   'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
12392   'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
12393   'TextTrackList,TouchList').split(',');
12395 for (var i = 0; i < DOMIterables.length; i++) {
12396   var NAME = DOMIterables[i];
12397   var Collection = global[NAME];
12398   var proto = Collection && Collection.prototype;
12399   if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
12400   Iterators[NAME] = Iterators.Array;
12404 /***/ }),
12405 /* 29 */
12406 /***/ (function(module, exports, __webpack_require__) {
12408 // 19.1.2.14 / 15.2.3.14 Object.keys(O)
12409 var $keys = __webpack_require__(101);
12410 var enumBugKeys = __webpack_require__(66);
12412 module.exports = Object.keys || function keys(O) {
12413   return $keys(O, enumBugKeys);
12417 /***/ }),
12418 /* 30 */
12419 /***/ (function(module, exports, __webpack_require__) {
12421 // 7.1.13 ToObject(argument)
12422 var defined = __webpack_require__(56);
12423 module.exports = function (it) {
12424   return Object(defined(it));
12428 /***/ }),
12429 /* 31 */
12430 /***/ (function(module, exports) {
12432 // Copyright Joyent, Inc. and other Node contributors.
12434 // Permission is hereby granted, free of charge, to any person obtaining a
12435 // copy of this software and associated documentation files (the
12436 // "Software"), to deal in the Software without restriction, including
12437 // without limitation the rights to use, copy, modify, merge, publish,
12438 // distribute, sublicense, and/or sell copies of the Software, and to permit
12439 // persons to whom the Software is furnished to do so, subject to the
12440 // following conditions:
12442 // The above copyright notice and this permission notice shall be included
12443 // in all copies or substantial portions of the Software.
12445 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12446 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
12447 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
12448 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
12449 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
12450 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
12451 // USE OR OTHER DEALINGS IN THE SOFTWARE.
12453 function EventEmitter() {
12454   this._events = this._events || {};
12455   this._maxListeners = this._maxListeners || undefined;
12457 module.exports = EventEmitter;
12459 // Backwards-compat with node 0.10.x
12460 EventEmitter.EventEmitter = EventEmitter;
12462 EventEmitter.prototype._events = undefined;
12463 EventEmitter.prototype._maxListeners = undefined;
12465 // By default EventEmitters will print a warning if more than 10 listeners are
12466 // added to it. This is a useful default which helps finding memory leaks.
12467 EventEmitter.defaultMaxListeners = 10;
12469 // Obviously not all Emitters should be limited to 10. This function allows
12470 // that to be increased. Set to zero for unlimited.
12471 EventEmitter.prototype.setMaxListeners = function(n) {
12472   if (!isNumber(n) || n < 0 || isNaN(n))
12473     throw TypeError('n must be a positive number');
12474   this._maxListeners = n;
12475   return this;
12478 EventEmitter.prototype.emit = function(type) {
12479   var er, handler, len, args, i, listeners;
12481   if (!this._events)
12482     this._events = {};
12484   // If there is no 'error' event listener then throw.
12485   if (type === 'error') {
12486     if (!this._events.error ||
12487         (isObject(this._events.error) && !this._events.error.length)) {
12488       er = arguments[1];
12489       if (er instanceof Error) {
12490         throw er; // Unhandled 'error' event
12491       } else {
12492         // At least give some kind of context to the user
12493         var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
12494         err.context = er;
12495         throw err;
12496       }
12497     }
12498   }
12500   handler = this._events[type];
12502   if (isUndefined(handler))
12503     return false;
12505   if (isFunction(handler)) {
12506     switch (arguments.length) {
12507       // fast cases
12508       case 1:
12509         handler.call(this);
12510         break;
12511       case 2:
12512         handler.call(this, arguments[1]);
12513         break;
12514       case 3:
12515         handler.call(this, arguments[1], arguments[2]);
12516         break;
12517       // slower
12518       default:
12519         args = Array.prototype.slice.call(arguments, 1);
12520         handler.apply(this, args);
12521     }
12522   } else if (isObject(handler)) {
12523     args = Array.prototype.slice.call(arguments, 1);
12524     listeners = handler.slice();
12525     len = listeners.length;
12526     for (i = 0; i < len; i++)
12527       listeners[i].apply(this, args);
12528   }
12530   return true;
12533 EventEmitter.prototype.addListener = function(type, listener) {
12534   var m;
12536   if (!isFunction(listener))
12537     throw TypeError('listener must be a function');
12539   if (!this._events)
12540     this._events = {};
12542   // To avoid recursion in the case that type === "newListener"! Before
12543   // adding it to the listeners, first emit "newListener".
12544   if (this._events.newListener)
12545     this.emit('newListener', type,
12546               isFunction(listener.listener) ?
12547               listener.listener : listener);
12549   if (!this._events[type])
12550     // Optimize the case of one listener. Don't need the extra array object.
12551     this._events[type] = listener;
12552   else if (isObject(this._events[type]))
12553     // If we've already got an array, just append.
12554     this._events[type].push(listener);
12555   else
12556     // Adding the second element, need to change to array.
12557     this._events[type] = [this._events[type], listener];
12559   // Check for listener leak
12560   if (isObject(this._events[type]) && !this._events[type].warned) {
12561     if (!isUndefined(this._maxListeners)) {
12562       m = this._maxListeners;
12563     } else {
12564       m = EventEmitter.defaultMaxListeners;
12565     }
12567     if (m && m > 0 && this._events[type].length > m) {
12568       this._events[type].warned = true;
12569       console.error('(node) warning: possible EventEmitter memory ' +
12570                     'leak detected. %d listeners added. ' +
12571                     'Use emitter.setMaxListeners() to increase limit.',
12572                     this._events[type].length);
12573       if (typeof console.trace === 'function') {
12574         // not supported in IE 10
12575         console.trace();
12576       }
12577     }
12578   }
12580   return this;
12583 EventEmitter.prototype.on = EventEmitter.prototype.addListener;
12585 EventEmitter.prototype.once = function(type, listener) {
12586   if (!isFunction(listener))
12587     throw TypeError('listener must be a function');
12589   var fired = false;
12591   function g() {
12592     this.removeListener(type, g);
12594     if (!fired) {
12595       fired = true;
12596       listener.apply(this, arguments);
12597     }
12598   }
12600   g.listener = listener;
12601   this.on(type, g);
12603   return this;
12606 // emits a 'removeListener' event iff the listener was removed
12607 EventEmitter.prototype.removeListener = function(type, listener) {
12608   var list, position, length, i;
12610   if (!isFunction(listener))
12611     throw TypeError('listener must be a function');
12613   if (!this._events || !this._events[type])
12614     return this;
12616   list = this._events[type];
12617   length = list.length;
12618   position = -1;
12620   if (list === listener ||
12621       (isFunction(list.listener) && list.listener === listener)) {
12622     delete this._events[type];
12623     if (this._events.removeListener)
12624       this.emit('removeListener', type, listener);
12626   } else if (isObject(list)) {
12627     for (i = length; i-- > 0;) {
12628       if (list[i] === listener ||
12629           (list[i].listener && list[i].listener === listener)) {
12630         position = i;
12631         break;
12632       }
12633     }
12635     if (position < 0)
12636       return this;
12638     if (list.length === 1) {
12639       list.length = 0;
12640       delete this._events[type];
12641     } else {
12642       list.splice(position, 1);
12643     }
12645     if (this._events.removeListener)
12646       this.emit('removeListener', type, listener);
12647   }
12649   return this;
12652 EventEmitter.prototype.removeAllListeners = function(type) {
12653   var key, listeners;
12655   if (!this._events)
12656     return this;
12658   // not listening for removeListener, no need to emit
12659   if (!this._events.removeListener) {
12660     if (arguments.length === 0)
12661       this._events = {};
12662     else if (this._events[type])
12663       delete this._events[type];
12664     return this;
12665   }
12667   // emit removeListener for all listeners on all events
12668   if (arguments.length === 0) {
12669     for (key in this._events) {
12670       if (key === 'removeListener') continue;
12671       this.removeAllListeners(key);
12672     }
12673     this.removeAllListeners('removeListener');
12674     this._events = {};
12675     return this;
12676   }
12678   listeners = this._events[type];
12680   if (isFunction(listeners)) {
12681     this.removeListener(type, listeners);
12682   } else if (listeners) {
12683     // LIFO order
12684     while (listeners.length)
12685       this.removeListener(type, listeners[listeners.length - 1]);
12686   }
12687   delete this._events[type];
12689   return this;
12692 EventEmitter.prototype.listeners = function(type) {
12693   var ret;
12694   if (!this._events || !this._events[type])
12695     ret = [];
12696   else if (isFunction(this._events[type]))
12697     ret = [this._events[type]];
12698   else
12699     ret = this._events[type].slice();
12700   return ret;
12703 EventEmitter.prototype.listenerCount = function(type) {
12704   if (this._events) {
12705     var evlistener = this._events[type];
12707     if (isFunction(evlistener))
12708       return 1;
12709     else if (evlistener)
12710       return evlistener.length;
12711   }
12712   return 0;
12715 EventEmitter.listenerCount = function(emitter, type) {
12716   return emitter.listenerCount(type);
12719 function isFunction(arg) {
12720   return typeof arg === 'function';
12723 function isNumber(arg) {
12724   return typeof arg === 'number';
12727 function isObject(arg) {
12728   return typeof arg === 'object' && arg !== null;
12731 function isUndefined(arg) {
12732   return arg === void 0;
12736 /***/ }),
12737 /* 32 */
12738 /***/ (function(module, exports, __webpack_require__) {
12740 "use strict";
12741 /* WEBPACK VAR INJECTION */(function(process) {
12743 if (!process.version ||
12744     process.version.indexOf('v0.') === 0 ||
12745     process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
12746   module.exports = { nextTick: nextTick };
12747 } else {
12748   module.exports = process
12751 function nextTick(fn, arg1, arg2, arg3) {
12752   if (typeof fn !== 'function') {
12753     throw new TypeError('"callback" argument must be a function');
12754   }
12755   var len = arguments.length;
12756   var args, i;
12757   switch (len) {
12758   case 0:
12759   case 1:
12760     return process.nextTick(fn);
12761   case 2:
12762     return process.nextTick(function afterTickOne() {
12763       fn.call(null, arg1);
12764     });
12765   case 3:
12766     return process.nextTick(function afterTickTwo() {
12767       fn.call(null, arg1, arg2);
12768     });
12769   case 4:
12770     return process.nextTick(function afterTickThree() {
12771       fn.call(null, arg1, arg2, arg3);
12772     });
12773   default:
12774     args = new Array(len - 1);
12775     i = 0;
12776     while (i < args.length) {
12777       args[i++] = arguments[i];
12778     }
12779     return process.nextTick(function afterTick() {
12780       fn.apply(null, args);
12781     });
12782   }
12786 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11)))
12788 /***/ }),
12789 /* 33 */
12790 /***/ (function(module, exports, __webpack_require__) {
12792 /* eslint-disable node/no-deprecated-api */
12793 var buffer = __webpack_require__(1)
12794 var Buffer = buffer.Buffer
12796 // alternative to using Object.keys for old browsers
12797 function copyProps (src, dst) {
12798   for (var key in src) {
12799     dst[key] = src[key]
12800   }
12802 if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
12803   module.exports = buffer
12804 } else {
12805   // Copy properties from require('buffer')
12806   copyProps(buffer, exports)
12807   exports.Buffer = SafeBuffer
12810 function SafeBuffer (arg, encodingOrOffset, length) {
12811   return Buffer(arg, encodingOrOffset, length)
12814 // Copy static methods from Buffer
12815 copyProps(Buffer, SafeBuffer)
12817 SafeBuffer.from = function (arg, encodingOrOffset, length) {
12818   if (typeof arg === 'number') {
12819     throw new TypeError('Argument must not be a number')
12820   }
12821   return Buffer(arg, encodingOrOffset, length)
12824 SafeBuffer.alloc = function (size, fill, encoding) {
12825   if (typeof size !== 'number') {
12826     throw new TypeError('Argument must be a number')
12827   }
12828   var buf = Buffer(size)
12829   if (fill !== undefined) {
12830     if (typeof encoding === 'string') {
12831       buf.fill(fill, encoding)
12832     } else {
12833       buf.fill(fill)
12834     }
12835   } else {
12836     buf.fill(0)
12837   }
12838   return buf
12841 SafeBuffer.allocUnsafe = function (size) {
12842   if (typeof size !== 'number') {
12843     throw new TypeError('Argument must be a number')
12844   }
12845   return Buffer(size)
12848 SafeBuffer.allocUnsafeSlow = function (size) {
12849   if (typeof size !== 'number') {
12850     throw new TypeError('Argument must be a number')
12851   }
12852   return buffer.SlowBuffer(size)
12856 /***/ }),
12857 /* 34 */
12858 /***/ (function(module, exports, __webpack_require__) {
12860 "use strict";
12864 var TYPED_OK =  (typeof Uint8Array !== 'undefined') &&
12865                 (typeof Uint16Array !== 'undefined') &&
12866                 (typeof Int32Array !== 'undefined');
12868 function _has(obj, key) {
12869   return Object.prototype.hasOwnProperty.call(obj, key);
12872 exports.assign = function (obj /*from1, from2, from3, ...*/) {
12873   var sources = Array.prototype.slice.call(arguments, 1);
12874   while (sources.length) {
12875     var source = sources.shift();
12876     if (!source) { continue; }
12878     if (typeof source !== 'object') {
12879       throw new TypeError(source + 'must be non-object');
12880     }
12882     for (var p in source) {
12883       if (_has(source, p)) {
12884         obj[p] = source[p];
12885       }
12886     }
12887   }
12889   return obj;
12893 // reduce buffer size, avoiding mem copy
12894 exports.shrinkBuf = function (buf, size) {
12895   if (buf.length === size) { return buf; }
12896   if (buf.subarray) { return buf.subarray(0, size); }
12897   buf.length = size;
12898   return buf;
12902 var fnTyped = {
12903   arraySet: function (dest, src, src_offs, len, dest_offs) {
12904     if (src.subarray && dest.subarray) {
12905       dest.set(src.subarray(src_offs, src_offs + len), dest_offs);
12906       return;
12907     }
12908     // Fallback to ordinary array
12909     for (var i = 0; i < len; i++) {
12910       dest[dest_offs + i] = src[src_offs + i];
12911     }
12912   },
12913   // Join array of chunks to single array.
12914   flattenChunks: function (chunks) {
12915     var i, l, len, pos, chunk, result;
12917     // calculate data length
12918     len = 0;
12919     for (i = 0, l = chunks.length; i < l; i++) {
12920       len += chunks[i].length;
12921     }
12923     // join chunks
12924     result = new Uint8Array(len);
12925     pos = 0;
12926     for (i = 0, l = chunks.length; i < l; i++) {
12927       chunk = chunks[i];
12928       result.set(chunk, pos);
12929       pos += chunk.length;
12930     }
12932     return result;
12933   }
12936 var fnUntyped = {
12937   arraySet: function (dest, src, src_offs, len, dest_offs) {
12938     for (var i = 0; i < len; i++) {
12939       dest[dest_offs + i] = src[src_offs + i];
12940     }
12941   },
12942   // Join array of chunks to single array.
12943   flattenChunks: function (chunks) {
12944     return [].concat.apply([], chunks);
12945   }
12949 // Enable/Disable typed arrays use, for testing
12951 exports.setTyped = function (on) {
12952   if (on) {
12953     exports.Buf8  = Uint8Array;
12954     exports.Buf16 = Uint16Array;
12955     exports.Buf32 = Int32Array;
12956     exports.assign(exports, fnTyped);
12957   } else {
12958     exports.Buf8  = Array;
12959     exports.Buf16 = Array;
12960     exports.Buf32 = Array;
12961     exports.assign(exports, fnUntyped);
12962   }
12965 exports.setTyped(TYPED_OK);
12968 /***/ }),
12969 /* 35 */
12970 /***/ (function(module, exports) {
12972 exports.f = {}.propertyIsEnumerable;
12975 /***/ }),
12976 /* 36 */
12977 /***/ (function(module, exports, __webpack_require__) {
12979 // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
12980 var anObject = __webpack_require__(14);
12981 var dPs = __webpack_require__(100);
12982 var enumBugKeys = __webpack_require__(66);
12983 var IE_PROTO = __webpack_require__(64)('IE_PROTO');
12984 var Empty = function () { /* empty */ };
12985 var PROTOTYPE = 'prototype';
12987 // Create object with fake `null` prototype: use iframe Object with cleared prototype
12988 var createDict = function () {
12989   // Thrash, waste and sodomy: IE GC bug
12990   var iframe = __webpack_require__(96)('iframe');
12991   var i = enumBugKeys.length;
12992   var lt = '<';
12993   var gt = '>';
12994   var iframeDocument;
12995   iframe.style.display = 'none';
12996   __webpack_require__(205).appendChild(iframe);
12997   iframe.src = 'javascript:'; // eslint-disable-line no-script-url
12998   // createDict = iframe.contentWindow.Object;
12999   // html.removeChild(iframe);
13000   iframeDocument = iframe.contentWindow.document;
13001   iframeDocument.open();
13002   iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
13003   iframeDocument.close();
13004   createDict = iframeDocument.F;
13005   while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
13006   return createDict();
13009 module.exports = Object.create || function create(O, Properties) {
13010   var result;
13011   if (O !== null) {
13012     Empty[PROTOTYPE] = anObject(O);
13013     result = new Empty();
13014     Empty[PROTOTYPE] = null;
13015     // add "__proto__" for Object.getPrototypeOf polyfill
13016     result[IE_PROTO] = O;
13017   } else result = createDict();
13018   return Properties === undefined ? result : dPs(result, Properties);
13022 /***/ }),
13023 /* 37 */
13024 /***/ (function(module, exports, __webpack_require__) {
13026 // 7.1.15 ToLength
13027 var toInteger = __webpack_require__(63);
13028 var min = Math.min;
13029 module.exports = function (it) {
13030   return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
13034 /***/ }),
13035 /* 38 */
13036 /***/ (function(module, exports) {
13038 var id = 0;
13039 var px = Math.random();
13040 module.exports = function (key) {
13041   return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
13045 /***/ }),
13046 /* 39 */
13047 /***/ (function(module, exports, __webpack_require__) {
13049 var def = __webpack_require__(6).f;
13050 var has = __webpack_require__(18);
13051 var TAG = __webpack_require__(4)('toStringTag');
13053 module.exports = function (it, tag, stat) {
13054   if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
13058 /***/ }),
13059 /* 40 */
13060 /***/ (function(module, exports, __webpack_require__) {
13062 var META = __webpack_require__(38)('meta');
13063 var isObject = __webpack_require__(9);
13064 var has = __webpack_require__(18);
13065 var setDesc = __webpack_require__(6).f;
13066 var id = 0;
13067 var isExtensible = Object.isExtensible || function () {
13068   return true;
13070 var FREEZE = !__webpack_require__(19)(function () {
13071   return isExtensible(Object.preventExtensions({}));
13073 var setMeta = function (it) {
13074   setDesc(it, META, { value: {
13075     i: 'O' + ++id, // object ID
13076     w: {}          // weak collections IDs
13077   } });
13079 var fastKey = function (it, create) {
13080   // return primitive with prefix
13081   if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
13082   if (!has(it, META)) {
13083     // can't set metadata to uncaught frozen object
13084     if (!isExtensible(it)) return 'F';
13085     // not necessary to add metadata
13086     if (!create) return 'E';
13087     // add missing metadata
13088     setMeta(it);
13089   // return object ID
13090   } return it[META].i;
13092 var getWeak = function (it, create) {
13093   if (!has(it, META)) {
13094     // can't set metadata to uncaught frozen object
13095     if (!isExtensible(it)) return true;
13096     // not necessary to add metadata
13097     if (!create) return false;
13098     // add missing metadata
13099     setMeta(it);
13100   // return hash weak collections IDs
13101   } return it[META].w;
13103 // add metadata on freeze-family methods calling
13104 var onFreeze = function (it) {
13105   if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
13106   return it;
13108 var meta = module.exports = {
13109   KEY: META,
13110   NEED: false,
13111   fastKey: fastKey,
13112   getWeak: getWeak,
13113   onFreeze: onFreeze
13117 /***/ }),
13118 /* 41 */
13119 /***/ (function(module, exports, __webpack_require__) {
13121 var ctx = __webpack_require__(20);
13122 var call = __webpack_require__(111);
13123 var isArrayIter = __webpack_require__(112);
13124 var anObject = __webpack_require__(14);
13125 var toLength = __webpack_require__(37);
13126 var getIterFn = __webpack_require__(67);
13127 var BREAK = {};
13128 var RETURN = {};
13129 var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
13130   var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);
13131   var f = ctx(fn, that, entries ? 2 : 1);
13132   var index = 0;
13133   var length, step, iterator, result;
13134   if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
13135   // fast case for arrays with default iterator
13136   if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {
13137     result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
13138     if (result === BREAK || result === RETURN) return result;
13139   } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
13140     result = call(iterator, f, step.value, entries);
13141     if (result === BREAK || result === RETURN) return result;
13142   }
13144 exports.BREAK = BREAK;
13145 exports.RETURN = RETURN;
13148 /***/ }),
13149 /* 42 */
13150 /***/ (function(module, exports, __webpack_require__) {
13152 "use strict";
13155 var isString = __webpack_require__(0).isString;
13156 var isNumber = __webpack_require__(0).isNumber;
13157 var isObject = __webpack_require__(0).isObject;
13158 var isArray = __webpack_require__(0).isArray;
13159 var LineBreaker = __webpack_require__(78);
13161 var LEADING = /^(\s)+/g;
13162 var TRAILING = /(\s)+$/g;
13165  * Creates an instance of TextTools - text measurement utility
13167  * @constructor
13168  * @param {FontProvider} fontProvider
13169  */
13170 function TextTools(fontProvider) {
13171         this.fontProvider = fontProvider;
13175  * Converts an array of strings (or inline-definition-objects) into a collection
13176  * of inlines and calculated minWidth/maxWidth.
13177  * and their min/max widths
13178  * @param  {Object} textArray - an array of inline-definition-objects (or strings)
13179  * @param  {Object} styleContextStack current style stack
13180  * @return {Object}                   collection of inlines, minWidth, maxWidth
13181  */
13182 TextTools.prototype.buildInlines = function (textArray, styleContextStack) {
13183         var measured = measure(this.fontProvider, textArray, styleContextStack);
13185         var minWidth = 0,
13186                 maxWidth = 0,
13187                 currentLineWidth;
13189         measured.forEach(function (inline) {
13190                 minWidth = Math.max(minWidth, inline.width - inline.leadingCut - inline.trailingCut);
13192                 if (!currentLineWidth) {
13193                         currentLineWidth = {width: 0, leadingCut: inline.leadingCut, trailingCut: 0};
13194                 }
13196                 currentLineWidth.width += inline.width;
13197                 currentLineWidth.trailingCut = inline.trailingCut;
13199                 maxWidth = Math.max(maxWidth, getTrimmedWidth(currentLineWidth));
13201                 if (inline.lineEnd) {
13202                         currentLineWidth = null;
13203                 }
13204         });
13206         if (getStyleProperty({}, styleContextStack, 'noWrap', false)) {
13207                 minWidth = maxWidth;
13208         }
13210         return {
13211                 items: measured,
13212                 minWidth: minWidth,
13213                 maxWidth: maxWidth
13214         };
13216         function getTrimmedWidth(item) {
13217                 return Math.max(0, item.width - item.leadingCut - item.trailingCut);
13218         }
13222  * Returns size of the specified string (without breaking it) using the current style
13223  * @param  {String} text              text to be measured
13224  * @param  {Object} styleContextStack current style stack
13225  * @return {Object}                   size of the specified string
13226  */
13227 TextTools.prototype.sizeOfString = function (text, styleContextStack) {
13228         text = text ? text.toString().replace(/\t/g, '    ') : '';
13230         //TODO: refactor - extract from measure
13231         var fontName = getStyleProperty({}, styleContextStack, 'font', 'Roboto');
13232         var fontSize = getStyleProperty({}, styleContextStack, 'fontSize', 12);
13233         var fontFeatures = getStyleProperty({}, styleContextStack, 'fontFeatures', null);
13234         var bold = getStyleProperty({}, styleContextStack, 'bold', false);
13235         var italics = getStyleProperty({}, styleContextStack, 'italics', false);
13236         var lineHeight = getStyleProperty({}, styleContextStack, 'lineHeight', 1);
13237         var characterSpacing = getStyleProperty({}, styleContextStack, 'characterSpacing', 0);
13239         var font = this.fontProvider.provideFont(fontName, bold, italics);
13241         return {
13242                 width: widthOfString(text, font, fontSize, characterSpacing, fontFeatures),
13243                 height: font.lineHeight(fontSize) * lineHeight,
13244                 fontSize: fontSize,
13245                 lineHeight: lineHeight,
13246                 ascender: font.ascender / 1000 * fontSize,
13247                 descender: font.descender / 1000 * fontSize
13248         };
13251 TextTools.prototype.widthOfString = function (text, font, fontSize, characterSpacing, fontFeatures) {
13252         return widthOfString(text, font, fontSize, characterSpacing, fontFeatures);
13255 function splitWords(text, noWrap) {
13256         var results = [];
13257         text = text.replace(/\t/g, '    ');
13259         if (noWrap) {
13260                 results.push({text: text});
13261                 return results;
13262         }
13264         var breaker = new LineBreaker(text);
13265         var last = 0;
13266         var bk;
13268         while (bk = breaker.nextBreak()) {
13269                 var word = text.slice(last, bk.position);
13271                 if (bk.required || word.match(/\r?\n$|\r$/)) { // new line
13272                         word = word.replace(/\r?\n$|\r$/, '');
13273                         results.push({text: word, lineEnd: true});
13274                 } else {
13275                         results.push({text: word});
13276                 }
13278                 last = bk.position;
13279         }
13281         return results;
13284 function copyStyle(source, destination) {
13285         destination = destination || {};
13286         source = source || {}; //TODO: default style
13288         for (var key in source) {
13289                 if (key != 'text' && source.hasOwnProperty(key)) {
13290                         destination[key] = source[key];
13291                 }
13292         }
13294         return destination;
13297 function normalizeTextArray(array, styleContextStack) {
13298         function flatten(array) {
13299                 return array.reduce(function (prev, cur) {
13300                         var current = isArray(cur.text) ? flatten(cur.text) : cur;
13301                         var more = [].concat(current).some(Array.isArray);
13302                         return prev.concat(more ? flatten(current) : current);
13303                 }, []);
13304         }
13306         var results = [];
13308         if (!isArray(array)) {
13309                 array = [array];
13310         }
13312         array = flatten(array);
13314         for (var i = 0, l = array.length; i < l; i++) {
13315                 var item = array[i];
13316                 var style = null;
13317                 var words;
13319                 var noWrap = getStyleProperty(item || {}, styleContextStack, 'noWrap', false);
13320                 if (isObject(item)) {
13321                         words = splitWords(normalizeString(item.text), noWrap);
13322                         style = copyStyle(item);
13323                 } else {
13324                         words = splitWords(normalizeString(item), noWrap);
13325                 }
13327                 for (var i2 = 0, l2 = words.length; i2 < l2; i2++) {
13328                         var result = {
13329                                 text: words[i2].text
13330                         };
13332                         if (words[i2].lineEnd) {
13333                                 result.lineEnd = true;
13334                         }
13336                         copyStyle(style, result);
13338                         results.push(result);
13339                 }
13340         }
13342         return results;
13345 function normalizeString(value) {
13346         if (value === undefined || value === null) {
13347                 return '';
13348         } else if (isNumber(value)) {
13349                 return value.toString();
13350         } else if (isString(value)) {
13351                 return value;
13352         } else {
13353                 return value.toString();
13354         }
13357 function getStyleProperty(item, styleContextStack, property, defaultValue) {
13358         var value;
13360         if (item[property] !== undefined && item[property] !== null) {
13361                 // item defines this property
13362                 return item[property];
13363         }
13365         if (!styleContextStack) {
13366                 return defaultValue;
13367         }
13369         styleContextStack.auto(item, function () {
13370                 value = styleContextStack.getProperty(property);
13371         });
13373         if (value !== null && value !== undefined) {
13374                 return value;
13375         } else {
13376                 return defaultValue;
13377         }
13380 function measure(fontProvider, textArray, styleContextStack) {
13381         var normalized = normalizeTextArray(textArray, styleContextStack);
13383         if (normalized.length) {
13384                 var leadingIndent = getStyleProperty(normalized[0], styleContextStack, 'leadingIndent', 0);
13386                 if (leadingIndent) {
13387                         normalized[0].leadingCut = -leadingIndent;
13388                         normalized[0].leadingIndent = leadingIndent;
13389                 }
13390         }
13392         normalized.forEach(function (item) {
13393                 var fontName = getStyleProperty(item, styleContextStack, 'font', 'Roboto');
13394                 var fontSize = getStyleProperty(item, styleContextStack, 'fontSize', 12);
13395                 var fontFeatures = getStyleProperty(item, styleContextStack, 'fontFeatures', null);
13396                 var bold = getStyleProperty(item, styleContextStack, 'bold', false);
13397                 var italics = getStyleProperty(item, styleContextStack, 'italics', false);
13398                 var color = getStyleProperty(item, styleContextStack, 'color', 'black');
13399                 var decoration = getStyleProperty(item, styleContextStack, 'decoration', null);
13400                 var decorationColor = getStyleProperty(item, styleContextStack, 'decorationColor', null);
13401                 var decorationStyle = getStyleProperty(item, styleContextStack, 'decorationStyle', null);
13402                 var background = getStyleProperty(item, styleContextStack, 'background', null);
13403                 var lineHeight = getStyleProperty(item, styleContextStack, 'lineHeight', 1);
13404                 var characterSpacing = getStyleProperty(item, styleContextStack, 'characterSpacing', 0);
13405                 var link = getStyleProperty(item, styleContextStack, 'link', null);
13406                 var linkToPage = getStyleProperty(item, styleContextStack, 'linkToPage', null);
13407                 var noWrap = getStyleProperty(item, styleContextStack, 'noWrap', null);
13408                 var preserveLeadingSpaces = getStyleProperty(item, styleContextStack, 'preserveLeadingSpaces', false);
13410                 var font = fontProvider.provideFont(fontName, bold, italics);
13412                 item.width = widthOfString(item.text, font, fontSize, characterSpacing, fontFeatures);
13413                 item.height = font.lineHeight(fontSize) * lineHeight;
13415                 var leadingSpaces = item.text.match(LEADING);
13417                 if (!item.leadingCut) {
13418                         item.leadingCut = 0;
13419                 }
13421                 if (leadingSpaces && !preserveLeadingSpaces) {
13422                         item.leadingCut += widthOfString(leadingSpaces[0], font, fontSize, characterSpacing, fontFeatures);
13423                 }
13425                 var trailingSpaces = item.text.match(TRAILING);
13426                 if (trailingSpaces) {
13427                         item.trailingCut = widthOfString(trailingSpaces[0], font, fontSize, characterSpacing, fontFeatures);
13428                 } else {
13429                         item.trailingCut = 0;
13430                 }
13432                 item.alignment = getStyleProperty(item, styleContextStack, 'alignment', 'left');
13433                 item.font = font;
13434                 item.fontSize = fontSize;
13435                 item.fontFeatures = fontFeatures;
13436                 item.characterSpacing = characterSpacing;
13437                 item.color = color;
13438                 item.decoration = decoration;
13439                 item.decorationColor = decorationColor;
13440                 item.decorationStyle = decorationStyle;
13441                 item.background = background;
13442                 item.link = link;
13443                 item.linkToPage = linkToPage;
13444                 item.noWrap = noWrap;
13445         });
13447         return normalized;
13450 function widthOfString(text, font, fontSize, characterSpacing, fontFeatures) {
13451         return font.widthOfString(text, fontSize, fontFeatures) + ((characterSpacing || 0) * (text.length - 1));
13454 module.exports = TextTools;
13457 /***/ }),
13458 /* 43 */
13459 /***/ (function(module, exports, __webpack_require__) {
13461 // Generated by CoffeeScript 1.7.1
13462 var UnicodeTrie, inflate;
13464 inflate = __webpack_require__(79);
13466 UnicodeTrie = (function() {
13467   var DATA_BLOCK_LENGTH, DATA_GRANULARITY, DATA_MASK, INDEX_1_OFFSET, INDEX_2_BLOCK_LENGTH, INDEX_2_BMP_LENGTH, INDEX_2_MASK, INDEX_SHIFT, LSCP_INDEX_2_LENGTH, LSCP_INDEX_2_OFFSET, OMITTED_BMP_INDEX_1_LENGTH, SHIFT_1, SHIFT_1_2, SHIFT_2, UTF8_2B_INDEX_2_LENGTH, UTF8_2B_INDEX_2_OFFSET;
13469   SHIFT_1 = 6 + 5;
13471   SHIFT_2 = 5;
13473   SHIFT_1_2 = SHIFT_1 - SHIFT_2;
13475   OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> SHIFT_1;
13477   INDEX_2_BLOCK_LENGTH = 1 << SHIFT_1_2;
13479   INDEX_2_MASK = INDEX_2_BLOCK_LENGTH - 1;
13481   INDEX_SHIFT = 2;
13483   DATA_BLOCK_LENGTH = 1 << SHIFT_2;
13485   DATA_MASK = DATA_BLOCK_LENGTH - 1;
13487   LSCP_INDEX_2_OFFSET = 0x10000 >> SHIFT_2;
13489   LSCP_INDEX_2_LENGTH = 0x400 >> SHIFT_2;
13491   INDEX_2_BMP_LENGTH = LSCP_INDEX_2_OFFSET + LSCP_INDEX_2_LENGTH;
13493   UTF8_2B_INDEX_2_OFFSET = INDEX_2_BMP_LENGTH;
13495   UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6;
13497   INDEX_1_OFFSET = UTF8_2B_INDEX_2_OFFSET + UTF8_2B_INDEX_2_LENGTH;
13499   DATA_GRANULARITY = 1 << INDEX_SHIFT;
13501   function UnicodeTrie(data) {
13502     var isBuffer, uncompressedLength, view;
13503     isBuffer = typeof data.readUInt32BE === 'function' && typeof data.slice === 'function';
13504     if (isBuffer || data instanceof Uint8Array) {
13505       if (isBuffer) {
13506         this.highStart = data.readUInt32BE(0);
13507         this.errorValue = data.readUInt32BE(4);
13508         uncompressedLength = data.readUInt32BE(8);
13509         data = data.slice(12);
13510       } else {
13511         view = new DataView(data.buffer);
13512         this.highStart = view.getUint32(0);
13513         this.errorValue = view.getUint32(4);
13514         uncompressedLength = view.getUint32(8);
13515         data = data.subarray(12);
13516       }
13517       data = inflate(data, new Uint8Array(uncompressedLength));
13518       data = inflate(data, new Uint8Array(uncompressedLength));
13519       this.data = new Uint32Array(data.buffer);
13520     } else {
13521       this.data = data.data, this.highStart = data.highStart, this.errorValue = data.errorValue;
13522     }
13523   }
13525   UnicodeTrie.prototype.get = function(codePoint) {
13526     var index;
13527     if (codePoint < 0 || codePoint > 0x10ffff) {
13528       return this.errorValue;
13529     }
13530     if (codePoint < 0xd800 || (codePoint > 0xdbff && codePoint <= 0xffff)) {
13531       index = (this.data[codePoint >> SHIFT_2] << INDEX_SHIFT) + (codePoint & DATA_MASK);
13532       return this.data[index];
13533     }
13534     if (codePoint <= 0xffff) {
13535       index = (this.data[LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> SHIFT_2)] << INDEX_SHIFT) + (codePoint & DATA_MASK);
13536       return this.data[index];
13537     }
13538     if (codePoint < this.highStart) {
13539       index = this.data[(INDEX_1_OFFSET - OMITTED_BMP_INDEX_1_LENGTH) + (codePoint >> SHIFT_1)];
13540       index = this.data[index + ((codePoint >> SHIFT_2) & INDEX_2_MASK)];
13541       index = (index << INDEX_SHIFT) + (codePoint & DATA_MASK);
13542       return this.data[index];
13543     }
13544     return this.data[this.data.length - DATA_GRANULARITY];
13545   };
13547   return UnicodeTrie;
13549 })();
13551 module.exports = UnicodeTrie;
13554 /***/ }),
13555 /* 44 */
13556 /***/ (function(module, exports, __webpack_require__) {
13558 "use strict";
13561 var isString = __webpack_require__(0).isString;
13563 function buildColumnWidths(columns, availableWidth) {
13564         var autoColumns = [],
13565                 autoMin = 0, autoMax = 0,
13566                 starColumns = [],
13567                 starMaxMin = 0,
13568                 starMaxMax = 0,
13569                 fixedColumns = [],
13570                 initial_availableWidth = availableWidth;
13572         columns.forEach(function (column) {
13573                 if (isAutoColumn(column)) {
13574                         autoColumns.push(column);
13575                         autoMin += column._minWidth;
13576                         autoMax += column._maxWidth;
13577                 } else if (isStarColumn(column)) {
13578                         starColumns.push(column);
13579                         starMaxMin = Math.max(starMaxMin, column._minWidth);
13580                         starMaxMax = Math.max(starMaxMax, column._maxWidth);
13581                 } else {
13582                         fixedColumns.push(column);
13583                 }
13584         });
13586         fixedColumns.forEach(function (col) {
13587                 // width specified as %
13588                 if (isString(col.width) && /\d+%/.test(col.width)) {
13589                         col.width = parseFloat(col.width) * initial_availableWidth / 100;
13590                 }
13591                 if (col.width < (col._minWidth) && col.elasticWidth) {
13592                         col._calcWidth = col._minWidth;
13593                 } else {
13594                         col._calcWidth = col.width;
13595                 }
13597                 availableWidth -= col._calcWidth;
13598         });
13600         // http://www.freesoft.org/CIE/RFC/1942/18.htm
13601         // http://www.w3.org/TR/CSS2/tables.html#width-layout
13602         // http://dev.w3.org/csswg/css3-tables-algorithms/Overview.src.htm
13603         var minW = autoMin + starMaxMin * starColumns.length;
13604         var maxW = autoMax + starMaxMax * starColumns.length;
13605         if (minW >= availableWidth) {
13606                 // case 1 - there's no way to fit all columns within available width
13607                 // that's actually pretty bad situation with PDF as we have no horizontal scroll
13608                 // no easy workaround (unless we decide, in the future, to split single words)
13609                 // currently we simply use minWidths for all columns
13610                 autoColumns.forEach(function (col) {
13611                         col._calcWidth = col._minWidth;
13612                 });
13614                 starColumns.forEach(function (col) {
13615                         col._calcWidth = starMaxMin; // starMaxMin already contains padding
13616                 });
13617         } else {
13618                 if (maxW < availableWidth) {
13619                         // case 2 - we can fit rest of the table within available space
13620                         autoColumns.forEach(function (col) {
13621                                 col._calcWidth = col._maxWidth;
13622                                 availableWidth -= col._calcWidth;
13623                         });
13624                 } else {
13625                         // maxW is too large, but minW fits within available width
13626                         var W = availableWidth - minW;
13627                         var D = maxW - minW;
13629                         autoColumns.forEach(function (col) {
13630                                 var d = col._maxWidth - col._minWidth;
13631                                 col._calcWidth = col._minWidth + d * W / D;
13632                                 availableWidth -= col._calcWidth;
13633                         });
13634                 }
13636                 if (starColumns.length > 0) {
13637                         var starSize = availableWidth / starColumns.length;
13639                         starColumns.forEach(function (col) {
13640                                 col._calcWidth = starSize;
13641                         });
13642                 }
13643         }
13646 function isAutoColumn(column) {
13647         return column.width === 'auto';
13650 function isStarColumn(column) {
13651         return column.width === null || column.width === undefined || column.width === '*' || column.width === 'star';
13654 //TODO: refactor and reuse in measureTable
13655 function measureMinMax(columns) {
13656         var result = {min: 0, max: 0};
13658         var maxStar = {min: 0, max: 0};
13659         var starCount = 0;
13661         for (var i = 0, l = columns.length; i < l; i++) {
13662                 var c = columns[i];
13664                 if (isStarColumn(c)) {
13665                         maxStar.min = Math.max(maxStar.min, c._minWidth);
13666                         maxStar.max = Math.max(maxStar.max, c._maxWidth);
13667                         starCount++;
13668                 } else if (isAutoColumn(c)) {
13669                         result.min += c._minWidth;
13670                         result.max += c._maxWidth;
13671                 } else {
13672                         result.min += ((c.width !== undefined && c.width) || c._minWidth);
13673                         result.max += ((c.width !== undefined && c.width) || c._maxWidth);
13674                 }
13675         }
13677         if (starCount) {
13678                 result.min += starCount * maxStar.min;
13679                 result.max += starCount * maxStar.max;
13680         }
13682         return result;
13686  * Calculates column widths
13687  * @private
13688  */
13689 module.exports = {
13690         buildColumnWidths: buildColumnWidths,
13691         measureMinMax: measureMinMax,
13692         isAutoColumn: isAutoColumn,
13693         isStarColumn: isStarColumn
13697 /***/ }),
13698 /* 45 */
13699 /***/ (function(module, exports, __webpack_require__) {
13701 exports = module.exports = __webpack_require__(83);
13702 exports.Stream = exports;
13703 exports.Readable = exports;
13704 exports.Writable = __webpack_require__(46);
13705 exports.Duplex = __webpack_require__(16);
13706 exports.Transform = __webpack_require__(86);
13707 exports.PassThrough = __webpack_require__(145);
13710 /***/ }),
13711 /* 46 */
13712 /***/ (function(module, exports, __webpack_require__) {
13714 "use strict";
13715 /* WEBPACK VAR INJECTION */(function(process, setImmediate, global) {// Copyright Joyent, Inc. and other Node contributors.
13717 // Permission is hereby granted, free of charge, to any person obtaining a
13718 // copy of this software and associated documentation files (the
13719 // "Software"), to deal in the Software without restriction, including
13720 // without limitation the rights to use, copy, modify, merge, publish,
13721 // distribute, sublicense, and/or sell copies of the Software, and to permit
13722 // persons to whom the Software is furnished to do so, subject to the
13723 // following conditions:
13725 // The above copyright notice and this permission notice shall be included
13726 // in all copies or substantial portions of the Software.
13728 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
13729 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
13730 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
13731 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
13732 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
13733 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
13734 // USE OR OTHER DEALINGS IN THE SOFTWARE.
13736 // A bit simpler than readable streams.
13737 // Implement an async ._write(chunk, encoding, cb), and it'll handle all
13738 // the drain event emission and buffering.
13742 /*<replacement>*/
13744 var processNextTick = __webpack_require__(32).nextTick;
13745 /*</replacement>*/
13747 module.exports = Writable;
13749 /* <replacement> */
13750 function WriteReq(chunk, encoding, cb) {
13751   this.chunk = chunk;
13752   this.encoding = encoding;
13753   this.callback = cb;
13754   this.next = null;
13757 // It seems a linked list but it is not
13758 // there will be only 2 of these for each stream
13759 function CorkedRequest(state) {
13760   var _this = this;
13762   this.next = null;
13763   this.entry = null;
13764   this.finish = function () {
13765     onCorkedFinish(_this, state);
13766   };
13768 /* </replacement> */
13770 /*<replacement>*/
13771 var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick;
13772 /*</replacement>*/
13774 /*<replacement>*/
13775 var Duplex;
13776 /*</replacement>*/
13778 Writable.WritableState = WritableState;
13780 /*<replacement>*/
13781 var util = __webpack_require__(25);
13782 util.inherits = __webpack_require__(21);
13783 /*</replacement>*/
13785 /*<replacement>*/
13786 var internalUtil = {
13787   deprecate: __webpack_require__(144)
13789 /*</replacement>*/
13791 /*<replacement>*/
13792 var Stream = __webpack_require__(84);
13793 /*</replacement>*/
13795 /*<replacement>*/
13797 var Buffer = __webpack_require__(33).Buffer;
13798 var OurUint8Array = global.Uint8Array || function () {};
13799 function _uint8ArrayToBuffer(chunk) {
13800   return Buffer.from(chunk);
13802 function _isUint8Array(obj) {
13803   return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
13806 /*</replacement>*/
13808 var destroyImpl = __webpack_require__(85);
13810 util.inherits(Writable, Stream);
13812 function nop() {}
13814 function WritableState(options, stream) {
13815   Duplex = Duplex || __webpack_require__(16);
13817   options = options || {};
13819   // Duplex streams are both readable and writable, but share
13820   // the same options object.
13821   // However, some cases require setting options to different
13822   // values for the readable and the writable sides of the duplex stream.
13823   // These options can be provided separately as readableXXX and writableXXX.
13824   var isDuplex = stream instanceof Duplex;
13826   // object stream flag to indicate whether or not this stream
13827   // contains buffers or objects.
13828   this.objectMode = !!options.objectMode;
13830   if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
13832   // the point at which write() starts returning false
13833   // Note: 0 is a valid value, means that we always return false if
13834   // the entire buffer is not flushed immediately on write()
13835   var hwm = options.highWaterMark;
13836   var writableHwm = options.writableHighWaterMark;
13837   var defaultHwm = this.objectMode ? 16 : 16 * 1024;
13839   if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;
13841   // cast to ints.
13842   this.highWaterMark = Math.floor(this.highWaterMark);
13844   // if _final has been called
13845   this.finalCalled = false;
13847   // drain event flag.
13848   this.needDrain = false;
13849   // at the start of calling end()
13850   this.ending = false;
13851   // when end() has been called, and returned
13852   this.ended = false;
13853   // when 'finish' is emitted
13854   this.finished = false;
13856   // has it been destroyed
13857   this.destroyed = false;
13859   // should we decode strings into buffers before passing to _write?
13860   // this is here so that some node-core streams can optimize string
13861   // handling at a lower level.
13862   var noDecode = options.decodeStrings === false;
13863   this.decodeStrings = !noDecode;
13865   // Crypto is kind of old and crusty.  Historically, its default string
13866   // encoding is 'binary' so we have to make this configurable.
13867   // Everything else in the universe uses 'utf8', though.
13868   this.defaultEncoding = options.defaultEncoding || 'utf8';
13870   // not an actual buffer we keep track of, but a measurement
13871   // of how much we're waiting to get pushed to some underlying
13872   // socket or file.
13873   this.length = 0;
13875   // a flag to see when we're in the middle of a write.
13876   this.writing = false;
13878   // when true all writes will be buffered until .uncork() call
13879   this.corked = 0;
13881   // a flag to be able to tell if the onwrite cb is called immediately,
13882   // or on a later tick.  We set this to true at first, because any
13883   // actions that shouldn't happen until "later" should generally also
13884   // not happen before the first write call.
13885   this.sync = true;
13887   // a flag to know if we're processing previously buffered items, which
13888   // may call the _write() callback in the same tick, so that we don't
13889   // end up in an overlapped onwrite situation.
13890   this.bufferProcessing = false;
13892   // the callback that's passed to _write(chunk,cb)
13893   this.onwrite = function (er) {
13894     onwrite(stream, er);
13895   };
13897   // the callback that the user supplies to write(chunk,encoding,cb)
13898   this.writecb = null;
13900   // the amount that is being written when _write is called.
13901   this.writelen = 0;
13903   this.bufferedRequest = null;
13904   this.lastBufferedRequest = null;
13906   // number of pending user-supplied write callbacks
13907   // this must be 0 before 'finish' can be emitted
13908   this.pendingcb = 0;
13910   // emit prefinish if the only thing we're waiting for is _write cbs
13911   // This is relevant for synchronous Transform streams
13912   this.prefinished = false;
13914   // True if the error was already emitted and should not be thrown again
13915   this.errorEmitted = false;
13917   // count buffered requests
13918   this.bufferedRequestCount = 0;
13920   // allocate the first CorkedRequest, there is always
13921   // one allocated and free to use, and we maintain at most two
13922   this.corkedRequestsFree = new CorkedRequest(this);
13925 WritableState.prototype.getBuffer = function getBuffer() {
13926   var current = this.bufferedRequest;
13927   var out = [];
13928   while (current) {
13929     out.push(current);
13930     current = current.next;
13931   }
13932   return out;
13935 (function () {
13936   try {
13937     Object.defineProperty(WritableState.prototype, 'buffer', {
13938       get: internalUtil.deprecate(function () {
13939         return this.getBuffer();
13940       }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
13941     });
13942   } catch (_) {}
13943 })();
13945 // Test _writableState for inheritance to account for Duplex streams,
13946 // whose prototype chain only points to Readable.
13947 var realHasInstance;
13948 if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
13949   realHasInstance = Function.prototype[Symbol.hasInstance];
13950   Object.defineProperty(Writable, Symbol.hasInstance, {
13951     value: function (object) {
13952       if (realHasInstance.call(this, object)) return true;
13953       if (this !== Writable) return false;
13955       return object && object._writableState instanceof WritableState;
13956     }
13957   });
13958 } else {
13959   realHasInstance = function (object) {
13960     return object instanceof this;
13961   };
13964 function Writable(options) {
13965   Duplex = Duplex || __webpack_require__(16);
13967   // Writable ctor is applied to Duplexes, too.
13968   // `realHasInstance` is necessary because using plain `instanceof`
13969   // would return false, as no `_writableState` property is attached.
13971   // Trying to use the custom `instanceof` for Writable here will also break the
13972   // Node.js LazyTransform implementation, which has a non-trivial getter for
13973   // `_writableState` that would lead to infinite recursion.
13974   if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
13975     return new Writable(options);
13976   }
13978   this._writableState = new WritableState(options, this);
13980   // legacy.
13981   this.writable = true;
13983   if (options) {
13984     if (typeof options.write === 'function') this._write = options.write;
13986     if (typeof options.writev === 'function') this._writev = options.writev;
13988     if (typeof options.destroy === 'function') this._destroy = options.destroy;
13990     if (typeof options.final === 'function') this._final = options.final;
13991   }
13993   Stream.call(this);
13996 // Otherwise people can pipe Writable streams, which is just wrong.
13997 Writable.prototype.pipe = function () {
13998   this.emit('error', new Error('Cannot pipe, not readable'));
14001 function writeAfterEnd(stream, cb) {
14002   var er = new Error('write after end');
14003   // TODO: defer error events consistently everywhere, not just the cb
14004   stream.emit('error', er);
14005   processNextTick(cb, er);
14008 // Checks that a user-supplied chunk is valid, especially for the particular
14009 // mode the stream is in. Currently this means that `null` is never accepted
14010 // and undefined/non-string values are only allowed in object mode.
14011 function validChunk(stream, state, chunk, cb) {
14012   var valid = true;
14013   var er = false;
14015   if (chunk === null) {
14016     er = new TypeError('May not write null values to stream');
14017   } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
14018     er = new TypeError('Invalid non-string/buffer chunk');
14019   }
14020   if (er) {
14021     stream.emit('error', er);
14022     processNextTick(cb, er);
14023     valid = false;
14024   }
14025   return valid;
14028 Writable.prototype.write = function (chunk, encoding, cb) {
14029   var state = this._writableState;
14030   var ret = false;
14031   var isBuf = !state.objectMode && _isUint8Array(chunk);
14033   if (isBuf && !Buffer.isBuffer(chunk)) {
14034     chunk = _uint8ArrayToBuffer(chunk);
14035   }
14037   if (typeof encoding === 'function') {
14038     cb = encoding;
14039     encoding = null;
14040   }
14042   if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
14044   if (typeof cb !== 'function') cb = nop;
14046   if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
14047     state.pendingcb++;
14048     ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
14049   }
14051   return ret;
14054 Writable.prototype.cork = function () {
14055   var state = this._writableState;
14057   state.corked++;
14060 Writable.prototype.uncork = function () {
14061   var state = this._writableState;
14063   if (state.corked) {
14064     state.corked--;
14066     if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
14067   }
14070 Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
14071   // node::ParseEncoding() requires lower case.
14072   if (typeof encoding === 'string') encoding = encoding.toLowerCase();
14073   if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
14074   this._writableState.defaultEncoding = encoding;
14075   return this;
14078 function decodeChunk(state, chunk, encoding) {
14079   if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
14080     chunk = Buffer.from(chunk, encoding);
14081   }
14082   return chunk;
14085 // if we're already writing something, then just put this
14086 // in the queue, and wait our turn.  Otherwise, call _write
14087 // If we return false, then we need a drain event, so set that flag.
14088 function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
14089   if (!isBuf) {
14090     var newChunk = decodeChunk(state, chunk, encoding);
14091     if (chunk !== newChunk) {
14092       isBuf = true;
14093       encoding = 'buffer';
14094       chunk = newChunk;
14095     }
14096   }
14097   var len = state.objectMode ? 1 : chunk.length;
14099   state.length += len;
14101   var ret = state.length < state.highWaterMark;
14102   // we must ensure that previous needDrain will not be reset to false.
14103   if (!ret) state.needDrain = true;
14105   if (state.writing || state.corked) {
14106     var last = state.lastBufferedRequest;
14107     state.lastBufferedRequest = {
14108       chunk: chunk,
14109       encoding: encoding,
14110       isBuf: isBuf,
14111       callback: cb,
14112       next: null
14113     };
14114     if (last) {
14115       last.next = state.lastBufferedRequest;
14116     } else {
14117       state.bufferedRequest = state.lastBufferedRequest;
14118     }
14119     state.bufferedRequestCount += 1;
14120   } else {
14121     doWrite(stream, state, false, len, chunk, encoding, cb);
14122   }
14124   return ret;
14127 function doWrite(stream, state, writev, len, chunk, encoding, cb) {
14128   state.writelen = len;
14129   state.writecb = cb;
14130   state.writing = true;
14131   state.sync = true;
14132   if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
14133   state.sync = false;
14136 function onwriteError(stream, state, sync, er, cb) {
14137   --state.pendingcb;
14139   if (sync) {
14140     // defer the callback if we are being called synchronously
14141     // to avoid piling up things on the stack
14142     processNextTick(cb, er);
14143     // this can emit finish, and it will always happen
14144     // after error
14145     processNextTick(finishMaybe, stream, state);
14146     stream._writableState.errorEmitted = true;
14147     stream.emit('error', er);
14148   } else {
14149     // the caller expect this to happen before if
14150     // it is async
14151     cb(er);
14152     stream._writableState.errorEmitted = true;
14153     stream.emit('error', er);
14154     // this can emit finish, but finish must
14155     // always follow error
14156     finishMaybe(stream, state);
14157   }
14160 function onwriteStateUpdate(state) {
14161   state.writing = false;
14162   state.writecb = null;
14163   state.length -= state.writelen;
14164   state.writelen = 0;
14167 function onwrite(stream, er) {
14168   var state = stream._writableState;
14169   var sync = state.sync;
14170   var cb = state.writecb;
14172   onwriteStateUpdate(state);
14174   if (er) onwriteError(stream, state, sync, er, cb);else {
14175     // Check if we're actually ready to finish, but don't emit yet
14176     var finished = needFinish(state);
14178     if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
14179       clearBuffer(stream, state);
14180     }
14182     if (sync) {
14183       /*<replacement>*/
14184       asyncWrite(afterWrite, stream, state, finished, cb);
14185       /*</replacement>*/
14186     } else {
14187       afterWrite(stream, state, finished, cb);
14188     }
14189   }
14192 function afterWrite(stream, state, finished, cb) {
14193   if (!finished) onwriteDrain(stream, state);
14194   state.pendingcb--;
14195   cb();
14196   finishMaybe(stream, state);
14199 // Must force callback to be called on nextTick, so that we don't
14200 // emit 'drain' before the write() consumer gets the 'false' return
14201 // value, and has a chance to attach a 'drain' listener.
14202 function onwriteDrain(stream, state) {
14203   if (state.length === 0 && state.needDrain) {
14204     state.needDrain = false;
14205     stream.emit('drain');
14206   }
14209 // if there's something in the buffer waiting, then process it
14210 function clearBuffer(stream, state) {
14211   state.bufferProcessing = true;
14212   var entry = state.bufferedRequest;
14214   if (stream._writev && entry && entry.next) {
14215     // Fast case, write everything using _writev()
14216     var l = state.bufferedRequestCount;
14217     var buffer = new Array(l);
14218     var holder = state.corkedRequestsFree;
14219     holder.entry = entry;
14221     var count = 0;
14222     var allBuffers = true;
14223     while (entry) {
14224       buffer[count] = entry;
14225       if (!entry.isBuf) allBuffers = false;
14226       entry = entry.next;
14227       count += 1;
14228     }
14229     buffer.allBuffers = allBuffers;
14231     doWrite(stream, state, true, state.length, buffer, '', holder.finish);
14233     // doWrite is almost always async, defer these to save a bit of time
14234     // as the hot path ends with doWrite
14235     state.pendingcb++;
14236     state.lastBufferedRequest = null;
14237     if (holder.next) {
14238       state.corkedRequestsFree = holder.next;
14239       holder.next = null;
14240     } else {
14241       state.corkedRequestsFree = new CorkedRequest(state);
14242     }
14243     state.bufferedRequestCount = 0;
14244   } else {
14245     // Slow case, write chunks one-by-one
14246     while (entry) {
14247       var chunk = entry.chunk;
14248       var encoding = entry.encoding;
14249       var cb = entry.callback;
14250       var len = state.objectMode ? 1 : chunk.length;
14252       doWrite(stream, state, false, len, chunk, encoding, cb);
14253       entry = entry.next;
14254       state.bufferedRequestCount--;
14255       // if we didn't call the onwrite immediately, then
14256       // it means that we need to wait until it does.
14257       // also, that means that the chunk and cb are currently
14258       // being processed, so move the buffer counter past them.
14259       if (state.writing) {
14260         break;
14261       }
14262     }
14264     if (entry === null) state.lastBufferedRequest = null;
14265   }
14267   state.bufferedRequest = entry;
14268   state.bufferProcessing = false;
14271 Writable.prototype._write = function (chunk, encoding, cb) {
14272   cb(new Error('_write() is not implemented'));
14275 Writable.prototype._writev = null;
14277 Writable.prototype.end = function (chunk, encoding, cb) {
14278   var state = this._writableState;
14280   if (typeof chunk === 'function') {
14281     cb = chunk;
14282     chunk = null;
14283     encoding = null;
14284   } else if (typeof encoding === 'function') {
14285     cb = encoding;
14286     encoding = null;
14287   }
14289   if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
14291   // .end() fully uncorks
14292   if (state.corked) {
14293     state.corked = 1;
14294     this.uncork();
14295   }
14297   // ignore unnecessary end() calls.
14298   if (!state.ending && !state.finished) endWritable(this, state, cb);
14301 function needFinish(state) {
14302   return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
14304 function callFinal(stream, state) {
14305   stream._final(function (err) {
14306     state.pendingcb--;
14307     if (err) {
14308       stream.emit('error', err);
14309     }
14310     state.prefinished = true;
14311     stream.emit('prefinish');
14312     finishMaybe(stream, state);
14313   });
14315 function prefinish(stream, state) {
14316   if (!state.prefinished && !state.finalCalled) {
14317     if (typeof stream._final === 'function') {
14318       state.pendingcb++;
14319       state.finalCalled = true;
14320       processNextTick(callFinal, stream, state);
14321     } else {
14322       state.prefinished = true;
14323       stream.emit('prefinish');
14324     }
14325   }
14328 function finishMaybe(stream, state) {
14329   var need = needFinish(state);
14330   if (need) {
14331     prefinish(stream, state);
14332     if (state.pendingcb === 0) {
14333       state.finished = true;
14334       stream.emit('finish');
14335     }
14336   }
14337   return need;
14340 function endWritable(stream, state, cb) {
14341   state.ending = true;
14342   finishMaybe(stream, state);
14343   if (cb) {
14344     if (state.finished) processNextTick(cb);else stream.once('finish', cb);
14345   }
14346   state.ended = true;
14347   stream.writable = false;
14350 function onCorkedFinish(corkReq, state, err) {
14351   var entry = corkReq.entry;
14352   corkReq.entry = null;
14353   while (entry) {
14354     var cb = entry.callback;
14355     state.pendingcb--;
14356     cb(err);
14357     entry = entry.next;
14358   }
14359   if (state.corkedRequestsFree) {
14360     state.corkedRequestsFree.next = corkReq;
14361   } else {
14362     state.corkedRequestsFree = corkReq;
14363   }
14366 Object.defineProperty(Writable.prototype, 'destroyed', {
14367   get: function () {
14368     if (this._writableState === undefined) {
14369       return false;
14370     }
14371     return this._writableState.destroyed;
14372   },
14373   set: function (value) {
14374     // we ignore the value if the stream
14375     // has not been initialized yet
14376     if (!this._writableState) {
14377       return;
14378     }
14380     // backward compatibility, the user is explicitly
14381     // managing destroyed
14382     this._writableState.destroyed = value;
14383   }
14386 Writable.prototype.destroy = destroyImpl.destroy;
14387 Writable.prototype._undestroy = destroyImpl.undestroy;
14388 Writable.prototype._destroy = function (err, cb) {
14389   this.end();
14390   cb(err);
14392 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11), __webpack_require__(142).setImmediate, __webpack_require__(7)))
14394 /***/ }),
14395 /* 47 */
14396 /***/ (function(module, exports, __webpack_require__) {
14398 "use strict";
14401 var Buffer = __webpack_require__(33).Buffer;
14403 var isEncoding = Buffer.isEncoding || function (encoding) {
14404   encoding = '' + encoding;
14405   switch (encoding && encoding.toLowerCase()) {
14406     case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
14407       return true;
14408     default:
14409       return false;
14410   }
14413 function _normalizeEncoding(enc) {
14414   if (!enc) return 'utf8';
14415   var retried;
14416   while (true) {
14417     switch (enc) {
14418       case 'utf8':
14419       case 'utf-8':
14420         return 'utf8';
14421       case 'ucs2':
14422       case 'ucs-2':
14423       case 'utf16le':
14424       case 'utf-16le':
14425         return 'utf16le';
14426       case 'latin1':
14427       case 'binary':
14428         return 'latin1';
14429       case 'base64':
14430       case 'ascii':
14431       case 'hex':
14432         return enc;
14433       default:
14434         if (retried) return; // undefined
14435         enc = ('' + enc).toLowerCase();
14436         retried = true;
14437     }
14438   }
14441 // Do not cache `Buffer.isEncoding` when checking encoding names as some
14442 // modules monkey-patch it to support additional encodings
14443 function normalizeEncoding(enc) {
14444   var nenc = _normalizeEncoding(enc);
14445   if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
14446   return nenc || enc;
14449 // StringDecoder provides an interface for efficiently splitting a series of
14450 // buffers into a series of JS strings without breaking apart multi-byte
14451 // characters.
14452 exports.StringDecoder = StringDecoder;
14453 function StringDecoder(encoding) {
14454   this.encoding = normalizeEncoding(encoding);
14455   var nb;
14456   switch (this.encoding) {
14457     case 'utf16le':
14458       this.text = utf16Text;
14459       this.end = utf16End;
14460       nb = 4;
14461       break;
14462     case 'utf8':
14463       this.fillLast = utf8FillLast;
14464       nb = 4;
14465       break;
14466     case 'base64':
14467       this.text = base64Text;
14468       this.end = base64End;
14469       nb = 3;
14470       break;
14471     default:
14472       this.write = simpleWrite;
14473       this.end = simpleEnd;
14474       return;
14475   }
14476   this.lastNeed = 0;
14477   this.lastTotal = 0;
14478   this.lastChar = Buffer.allocUnsafe(nb);
14481 StringDecoder.prototype.write = function (buf) {
14482   if (buf.length === 0) return '';
14483   var r;
14484   var i;
14485   if (this.lastNeed) {
14486     r = this.fillLast(buf);
14487     if (r === undefined) return '';
14488     i = this.lastNeed;
14489     this.lastNeed = 0;
14490   } else {
14491     i = 0;
14492   }
14493   if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
14494   return r || '';
14497 StringDecoder.prototype.end = utf8End;
14499 // Returns only complete characters in a Buffer
14500 StringDecoder.prototype.text = utf8Text;
14502 // Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
14503 StringDecoder.prototype.fillLast = function (buf) {
14504   if (this.lastNeed <= buf.length) {
14505     buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
14506     return this.lastChar.toString(this.encoding, 0, this.lastTotal);
14507   }
14508   buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
14509   this.lastNeed -= buf.length;
14512 // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
14513 // continuation byte.
14514 function utf8CheckByte(byte) {
14515   if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
14516   return -1;
14519 // Checks at most 3 bytes at the end of a Buffer in order to detect an
14520 // incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
14521 // needed to complete the UTF-8 character (if applicable) are returned.
14522 function utf8CheckIncomplete(self, buf, i) {
14523   var j = buf.length - 1;
14524   if (j < i) return 0;
14525   var nb = utf8CheckByte(buf[j]);
14526   if (nb >= 0) {
14527     if (nb > 0) self.lastNeed = nb - 1;
14528     return nb;
14529   }
14530   if (--j < i) return 0;
14531   nb = utf8CheckByte(buf[j]);
14532   if (nb >= 0) {
14533     if (nb > 0) self.lastNeed = nb - 2;
14534     return nb;
14535   }
14536   if (--j < i) return 0;
14537   nb = utf8CheckByte(buf[j]);
14538   if (nb >= 0) {
14539     if (nb > 0) {
14540       if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
14541     }
14542     return nb;
14543   }
14544   return 0;
14547 // Validates as many continuation bytes for a multi-byte UTF-8 character as
14548 // needed or are available. If we see a non-continuation byte where we expect
14549 // one, we "replace" the validated continuation bytes we've seen so far with
14550 // UTF-8 replacement characters ('\ufffd'), to match v8's UTF-8 decoding
14551 // behavior. The continuation byte check is included three times in the case
14552 // where all of the continuation bytes for a character exist in the same buffer.
14553 // It is also done this way as a slight performance increase instead of using a
14554 // loop.
14555 function utf8CheckExtraBytes(self, buf, p) {
14556   if ((buf[0] & 0xC0) !== 0x80) {
14557     self.lastNeed = 0;
14558     return '\ufffd'.repeat(p);
14559   }
14560   if (self.lastNeed > 1 && buf.length > 1) {
14561     if ((buf[1] & 0xC0) !== 0x80) {
14562       self.lastNeed = 1;
14563       return '\ufffd'.repeat(p + 1);
14564     }
14565     if (self.lastNeed > 2 && buf.length > 2) {
14566       if ((buf[2] & 0xC0) !== 0x80) {
14567         self.lastNeed = 2;
14568         return '\ufffd'.repeat(p + 2);
14569       }
14570     }
14571   }
14574 // Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
14575 function utf8FillLast(buf) {
14576   var p = this.lastTotal - this.lastNeed;
14577   var r = utf8CheckExtraBytes(this, buf, p);
14578   if (r !== undefined) return r;
14579   if (this.lastNeed <= buf.length) {
14580     buf.copy(this.lastChar, p, 0, this.lastNeed);
14581     return this.lastChar.toString(this.encoding, 0, this.lastTotal);
14582   }
14583   buf.copy(this.lastChar, p, 0, buf.length);
14584   this.lastNeed -= buf.length;
14587 // Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
14588 // partial character, the character's bytes are buffered until the required
14589 // number of bytes are available.
14590 function utf8Text(buf, i) {
14591   var total = utf8CheckIncomplete(this, buf, i);
14592   if (!this.lastNeed) return buf.toString('utf8', i);
14593   this.lastTotal = total;
14594   var end = buf.length - (total - this.lastNeed);
14595   buf.copy(this.lastChar, 0, end);
14596   return buf.toString('utf8', i, end);
14599 // For UTF-8, a replacement character for each buffered byte of a (partial)
14600 // character needs to be added to the output.
14601 function utf8End(buf) {
14602   var r = buf && buf.length ? this.write(buf) : '';
14603   if (this.lastNeed) return r + '\ufffd'.repeat(this.lastTotal - this.lastNeed);
14604   return r;
14607 // UTF-16LE typically needs two bytes per character, but even if we have an even
14608 // number of bytes available, we need to check if we end on a leading/high
14609 // surrogate. In that case, we need to wait for the next two bytes in order to
14610 // decode the last character properly.
14611 function utf16Text(buf, i) {
14612   if ((buf.length - i) % 2 === 0) {
14613     var r = buf.toString('utf16le', i);
14614     if (r) {
14615       var c = r.charCodeAt(r.length - 1);
14616       if (c >= 0xD800 && c <= 0xDBFF) {
14617         this.lastNeed = 2;
14618         this.lastTotal = 4;
14619         this.lastChar[0] = buf[buf.length - 2];
14620         this.lastChar[1] = buf[buf.length - 1];
14621         return r.slice(0, -1);
14622       }
14623     }
14624     return r;
14625   }
14626   this.lastNeed = 1;
14627   this.lastTotal = 2;
14628   this.lastChar[0] = buf[buf.length - 1];
14629   return buf.toString('utf16le', i, buf.length - 1);
14632 // For UTF-16LE we do not explicitly append special replacement characters if we
14633 // end on a partial character, we simply let v8 handle that.
14634 function utf16End(buf) {
14635   var r = buf && buf.length ? this.write(buf) : '';
14636   if (this.lastNeed) {
14637     var end = this.lastTotal - this.lastNeed;
14638     return r + this.lastChar.toString('utf16le', 0, end);
14639   }
14640   return r;
14643 function base64Text(buf, i) {
14644   var n = (buf.length - i) % 3;
14645   if (n === 0) return buf.toString('base64', i);
14646   this.lastNeed = 3 - n;
14647   this.lastTotal = 3;
14648   if (n === 1) {
14649     this.lastChar[0] = buf[buf.length - 1];
14650   } else {
14651     this.lastChar[0] = buf[buf.length - 2];
14652     this.lastChar[1] = buf[buf.length - 1];
14653   }
14654   return buf.toString('base64', i, buf.length - n);
14657 function base64End(buf) {
14658   var r = buf && buf.length ? this.write(buf) : '';
14659   if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
14660   return r;
14663 // Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
14664 function simpleWrite(buf) {
14665   return buf.toString(this.encoding);
14668 function simpleEnd(buf) {
14669   return buf && buf.length ? this.write(buf) : '';
14672 /***/ }),
14673 /* 48 */
14674 /***/ (function(module, exports, __webpack_require__) {
14676 "use strict";
14677 /* WEBPACK VAR INJECTION */(function(process) {
14679 var Buffer = __webpack_require__(1).Buffer;
14680 var Transform = __webpack_require__(15).Transform;
14681 var binding = __webpack_require__(150);
14682 var util = __webpack_require__(49);
14683 var assert = __webpack_require__(88).ok;
14684 var kMaxLength = __webpack_require__(1).kMaxLength;
14685 var kRangeErrorMessage = 'Cannot create final Buffer. It would be larger ' + 'than 0x' + kMaxLength.toString(16) + ' bytes';
14687 // zlib doesn't provide these, so kludge them in following the same
14688 // const naming scheme zlib uses.
14689 binding.Z_MIN_WINDOWBITS = 8;
14690 binding.Z_MAX_WINDOWBITS = 15;
14691 binding.Z_DEFAULT_WINDOWBITS = 15;
14693 // fewer than 64 bytes per chunk is stupid.
14694 // technically it could work with as few as 8, but even 64 bytes
14695 // is absurdly low.  Usually a MB or more is best.
14696 binding.Z_MIN_CHUNK = 64;
14697 binding.Z_MAX_CHUNK = Infinity;
14698 binding.Z_DEFAULT_CHUNK = 16 * 1024;
14700 binding.Z_MIN_MEMLEVEL = 1;
14701 binding.Z_MAX_MEMLEVEL = 9;
14702 binding.Z_DEFAULT_MEMLEVEL = 8;
14704 binding.Z_MIN_LEVEL = -1;
14705 binding.Z_MAX_LEVEL = 9;
14706 binding.Z_DEFAULT_LEVEL = binding.Z_DEFAULT_COMPRESSION;
14708 // expose all the zlib constants
14709 var bkeys = Object.keys(binding);
14710 for (var bk = 0; bk < bkeys.length; bk++) {
14711   var bkey = bkeys[bk];
14712   if (bkey.match(/^Z/)) {
14713     Object.defineProperty(exports, bkey, {
14714       enumerable: true, value: binding[bkey], writable: false
14715     });
14716   }
14719 // translation table for return codes.
14720 var codes = {
14721   Z_OK: binding.Z_OK,
14722   Z_STREAM_END: binding.Z_STREAM_END,
14723   Z_NEED_DICT: binding.Z_NEED_DICT,
14724   Z_ERRNO: binding.Z_ERRNO,
14725   Z_STREAM_ERROR: binding.Z_STREAM_ERROR,
14726   Z_DATA_ERROR: binding.Z_DATA_ERROR,
14727   Z_MEM_ERROR: binding.Z_MEM_ERROR,
14728   Z_BUF_ERROR: binding.Z_BUF_ERROR,
14729   Z_VERSION_ERROR: binding.Z_VERSION_ERROR
14732 var ckeys = Object.keys(codes);
14733 for (var ck = 0; ck < ckeys.length; ck++) {
14734   var ckey = ckeys[ck];
14735   codes[codes[ckey]] = ckey;
14738 Object.defineProperty(exports, 'codes', {
14739   enumerable: true, value: Object.freeze(codes), writable: false
14742 exports.Deflate = Deflate;
14743 exports.Inflate = Inflate;
14744 exports.Gzip = Gzip;
14745 exports.Gunzip = Gunzip;
14746 exports.DeflateRaw = DeflateRaw;
14747 exports.InflateRaw = InflateRaw;
14748 exports.Unzip = Unzip;
14750 exports.createDeflate = function (o) {
14751   return new Deflate(o);
14754 exports.createInflate = function (o) {
14755   return new Inflate(o);
14758 exports.createDeflateRaw = function (o) {
14759   return new DeflateRaw(o);
14762 exports.createInflateRaw = function (o) {
14763   return new InflateRaw(o);
14766 exports.createGzip = function (o) {
14767   return new Gzip(o);
14770 exports.createGunzip = function (o) {
14771   return new Gunzip(o);
14774 exports.createUnzip = function (o) {
14775   return new Unzip(o);
14778 // Convenience methods.
14779 // compress/decompress a string or buffer in one step.
14780 exports.deflate = function (buffer, opts, callback) {
14781   if (typeof opts === 'function') {
14782     callback = opts;
14783     opts = {};
14784   }
14785   return zlibBuffer(new Deflate(opts), buffer, callback);
14788 exports.deflateSync = function (buffer, opts) {
14789   return zlibBufferSync(new Deflate(opts), buffer);
14792 exports.gzip = function (buffer, opts, callback) {
14793   if (typeof opts === 'function') {
14794     callback = opts;
14795     opts = {};
14796   }
14797   return zlibBuffer(new Gzip(opts), buffer, callback);
14800 exports.gzipSync = function (buffer, opts) {
14801   return zlibBufferSync(new Gzip(opts), buffer);
14804 exports.deflateRaw = function (buffer, opts, callback) {
14805   if (typeof opts === 'function') {
14806     callback = opts;
14807     opts = {};
14808   }
14809   return zlibBuffer(new DeflateRaw(opts), buffer, callback);
14812 exports.deflateRawSync = function (buffer, opts) {
14813   return zlibBufferSync(new DeflateRaw(opts), buffer);
14816 exports.unzip = function (buffer, opts, callback) {
14817   if (typeof opts === 'function') {
14818     callback = opts;
14819     opts = {};
14820   }
14821   return zlibBuffer(new Unzip(opts), buffer, callback);
14824 exports.unzipSync = function (buffer, opts) {
14825   return zlibBufferSync(new Unzip(opts), buffer);
14828 exports.inflate = function (buffer, opts, callback) {
14829   if (typeof opts === 'function') {
14830     callback = opts;
14831     opts = {};
14832   }
14833   return zlibBuffer(new Inflate(opts), buffer, callback);
14836 exports.inflateSync = function (buffer, opts) {
14837   return zlibBufferSync(new Inflate(opts), buffer);
14840 exports.gunzip = function (buffer, opts, callback) {
14841   if (typeof opts === 'function') {
14842     callback = opts;
14843     opts = {};
14844   }
14845   return zlibBuffer(new Gunzip(opts), buffer, callback);
14848 exports.gunzipSync = function (buffer, opts) {
14849   return zlibBufferSync(new Gunzip(opts), buffer);
14852 exports.inflateRaw = function (buffer, opts, callback) {
14853   if (typeof opts === 'function') {
14854     callback = opts;
14855     opts = {};
14856   }
14857   return zlibBuffer(new InflateRaw(opts), buffer, callback);
14860 exports.inflateRawSync = function (buffer, opts) {
14861   return zlibBufferSync(new InflateRaw(opts), buffer);
14864 function zlibBuffer(engine, buffer, callback) {
14865   var buffers = [];
14866   var nread = 0;
14868   engine.on('error', onError);
14869   engine.on('end', onEnd);
14871   engine.end(buffer);
14872   flow();
14874   function flow() {
14875     var chunk;
14876     while (null !== (chunk = engine.read())) {
14877       buffers.push(chunk);
14878       nread += chunk.length;
14879     }
14880     engine.once('readable', flow);
14881   }
14883   function onError(err) {
14884     engine.removeListener('end', onEnd);
14885     engine.removeListener('readable', flow);
14886     callback(err);
14887   }
14889   function onEnd() {
14890     var buf;
14891     var err = null;
14893     if (nread >= kMaxLength) {
14894       err = new RangeError(kRangeErrorMessage);
14895     } else {
14896       buf = Buffer.concat(buffers, nread);
14897     }
14899     buffers = [];
14900     engine.close();
14901     callback(err, buf);
14902   }
14905 function zlibBufferSync(engine, buffer) {
14906   if (typeof buffer === 'string') buffer = Buffer.from(buffer);
14908   if (!Buffer.isBuffer(buffer)) throw new TypeError('Not a string or buffer');
14910   var flushFlag = engine._finishFlushFlag;
14912   return engine._processChunk(buffer, flushFlag);
14915 // generic zlib
14916 // minimal 2-byte header
14917 function Deflate(opts) {
14918   if (!(this instanceof Deflate)) return new Deflate(opts);
14919   Zlib.call(this, opts, binding.DEFLATE);
14922 function Inflate(opts) {
14923   if (!(this instanceof Inflate)) return new Inflate(opts);
14924   Zlib.call(this, opts, binding.INFLATE);
14927 // gzip - bigger header, same deflate compression
14928 function Gzip(opts) {
14929   if (!(this instanceof Gzip)) return new Gzip(opts);
14930   Zlib.call(this, opts, binding.GZIP);
14933 function Gunzip(opts) {
14934   if (!(this instanceof Gunzip)) return new Gunzip(opts);
14935   Zlib.call(this, opts, binding.GUNZIP);
14938 // raw - no header
14939 function DeflateRaw(opts) {
14940   if (!(this instanceof DeflateRaw)) return new DeflateRaw(opts);
14941   Zlib.call(this, opts, binding.DEFLATERAW);
14944 function InflateRaw(opts) {
14945   if (!(this instanceof InflateRaw)) return new InflateRaw(opts);
14946   Zlib.call(this, opts, binding.INFLATERAW);
14949 // auto-detect header.
14950 function Unzip(opts) {
14951   if (!(this instanceof Unzip)) return new Unzip(opts);
14952   Zlib.call(this, opts, binding.UNZIP);
14955 function isValidFlushFlag(flag) {
14956   return flag === binding.Z_NO_FLUSH || flag === binding.Z_PARTIAL_FLUSH || flag === binding.Z_SYNC_FLUSH || flag === binding.Z_FULL_FLUSH || flag === binding.Z_FINISH || flag === binding.Z_BLOCK;
14959 // the Zlib class they all inherit from
14960 // This thing manages the queue of requests, and returns
14961 // true or false if there is anything in the queue when
14962 // you call the .write() method.
14964 function Zlib(opts, mode) {
14965   var _this = this;
14967   this._opts = opts = opts || {};
14968   this._chunkSize = opts.chunkSize || exports.Z_DEFAULT_CHUNK;
14970   Transform.call(this, opts);
14972   if (opts.flush && !isValidFlushFlag(opts.flush)) {
14973     throw new Error('Invalid flush flag: ' + opts.flush);
14974   }
14975   if (opts.finishFlush && !isValidFlushFlag(opts.finishFlush)) {
14976     throw new Error('Invalid flush flag: ' + opts.finishFlush);
14977   }
14979   this._flushFlag = opts.flush || binding.Z_NO_FLUSH;
14980   this._finishFlushFlag = typeof opts.finishFlush !== 'undefined' ? opts.finishFlush : binding.Z_FINISH;
14982   if (opts.chunkSize) {
14983     if (opts.chunkSize < exports.Z_MIN_CHUNK || opts.chunkSize > exports.Z_MAX_CHUNK) {
14984       throw new Error('Invalid chunk size: ' + opts.chunkSize);
14985     }
14986   }
14988   if (opts.windowBits) {
14989     if (opts.windowBits < exports.Z_MIN_WINDOWBITS || opts.windowBits > exports.Z_MAX_WINDOWBITS) {
14990       throw new Error('Invalid windowBits: ' + opts.windowBits);
14991     }
14992   }
14994   if (opts.level) {
14995     if (opts.level < exports.Z_MIN_LEVEL || opts.level > exports.Z_MAX_LEVEL) {
14996       throw new Error('Invalid compression level: ' + opts.level);
14997     }
14998   }
15000   if (opts.memLevel) {
15001     if (opts.memLevel < exports.Z_MIN_MEMLEVEL || opts.memLevel > exports.Z_MAX_MEMLEVEL) {
15002       throw new Error('Invalid memLevel: ' + opts.memLevel);
15003     }
15004   }
15006   if (opts.strategy) {
15007     if (opts.strategy != exports.Z_FILTERED && opts.strategy != exports.Z_HUFFMAN_ONLY && opts.strategy != exports.Z_RLE && opts.strategy != exports.Z_FIXED && opts.strategy != exports.Z_DEFAULT_STRATEGY) {
15008       throw new Error('Invalid strategy: ' + opts.strategy);
15009     }
15010   }
15012   if (opts.dictionary) {
15013     if (!Buffer.isBuffer(opts.dictionary)) {
15014       throw new Error('Invalid dictionary: it should be a Buffer instance');
15015     }
15016   }
15018   this._handle = new binding.Zlib(mode);
15020   var self = this;
15021   this._hadError = false;
15022   this._handle.onerror = function (message, errno) {
15023     // there is no way to cleanly recover.
15024     // continuing only obscures problems.
15025     _close(self);
15026     self._hadError = true;
15028     var error = new Error(message);
15029     error.errno = errno;
15030     error.code = exports.codes[errno];
15031     self.emit('error', error);
15032   };
15034   var level = exports.Z_DEFAULT_COMPRESSION;
15035   if (typeof opts.level === 'number') level = opts.level;
15037   var strategy = exports.Z_DEFAULT_STRATEGY;
15038   if (typeof opts.strategy === 'number') strategy = opts.strategy;
15040   this._handle.init(opts.windowBits || exports.Z_DEFAULT_WINDOWBITS, level, opts.memLevel || exports.Z_DEFAULT_MEMLEVEL, strategy, opts.dictionary);
15042   this._buffer = Buffer.allocUnsafe(this._chunkSize);
15043   this._offset = 0;
15044   this._level = level;
15045   this._strategy = strategy;
15047   this.once('end', this.close);
15049   Object.defineProperty(this, '_closed', {
15050     get: function () {
15051       return !_this._handle;
15052     },
15053     configurable: true,
15054     enumerable: true
15055   });
15058 util.inherits(Zlib, Transform);
15060 Zlib.prototype.params = function (level, strategy, callback) {
15061   if (level < exports.Z_MIN_LEVEL || level > exports.Z_MAX_LEVEL) {
15062     throw new RangeError('Invalid compression level: ' + level);
15063   }
15064   if (strategy != exports.Z_FILTERED && strategy != exports.Z_HUFFMAN_ONLY && strategy != exports.Z_RLE && strategy != exports.Z_FIXED && strategy != exports.Z_DEFAULT_STRATEGY) {
15065     throw new TypeError('Invalid strategy: ' + strategy);
15066   }
15068   if (this._level !== level || this._strategy !== strategy) {
15069     var self = this;
15070     this.flush(binding.Z_SYNC_FLUSH, function () {
15071       assert(self._handle, 'zlib binding closed');
15072       self._handle.params(level, strategy);
15073       if (!self._hadError) {
15074         self._level = level;
15075         self._strategy = strategy;
15076         if (callback) callback();
15077       }
15078     });
15079   } else {
15080     process.nextTick(callback);
15081   }
15084 Zlib.prototype.reset = function () {
15085   assert(this._handle, 'zlib binding closed');
15086   return this._handle.reset();
15089 // This is the _flush function called by the transform class,
15090 // internally, when the last chunk has been written.
15091 Zlib.prototype._flush = function (callback) {
15092   this._transform(Buffer.alloc(0), '', callback);
15095 Zlib.prototype.flush = function (kind, callback) {
15096   var _this2 = this;
15098   var ws = this._writableState;
15100   if (typeof kind === 'function' || kind === undefined && !callback) {
15101     callback = kind;
15102     kind = binding.Z_FULL_FLUSH;
15103   }
15105   if (ws.ended) {
15106     if (callback) process.nextTick(callback);
15107   } else if (ws.ending) {
15108     if (callback) this.once('end', callback);
15109   } else if (ws.needDrain) {
15110     if (callback) {
15111       this.once('drain', function () {
15112         return _this2.flush(kind, callback);
15113       });
15114     }
15115   } else {
15116     this._flushFlag = kind;
15117     this.write(Buffer.alloc(0), '', callback);
15118   }
15121 Zlib.prototype.close = function (callback) {
15122   _close(this, callback);
15123   process.nextTick(emitCloseNT, this);
15126 function _close(engine, callback) {
15127   if (callback) process.nextTick(callback);
15129   // Caller may invoke .close after a zlib error (which will null _handle).
15130   if (!engine._handle) return;
15132   engine._handle.close();
15133   engine._handle = null;
15136 function emitCloseNT(self) {
15137   self.emit('close');
15140 Zlib.prototype._transform = function (chunk, encoding, cb) {
15141   var flushFlag;
15142   var ws = this._writableState;
15143   var ending = ws.ending || ws.ended;
15144   var last = ending && (!chunk || ws.length === chunk.length);
15146   if (chunk !== null && !Buffer.isBuffer(chunk)) return cb(new Error('invalid input'));
15148   if (!this._handle) return cb(new Error('zlib binding closed'));
15150   // If it's the last chunk, or a final flush, we use the Z_FINISH flush flag
15151   // (or whatever flag was provided using opts.finishFlush).
15152   // If it's explicitly flushing at some other time, then we use
15153   // Z_FULL_FLUSH. Otherwise, use Z_NO_FLUSH for maximum compression
15154   // goodness.
15155   if (last) flushFlag = this._finishFlushFlag;else {
15156     flushFlag = this._flushFlag;
15157     // once we've flushed the last of the queue, stop flushing and
15158     // go back to the normal behavior.
15159     if (chunk.length >= ws.length) {
15160       this._flushFlag = this._opts.flush || binding.Z_NO_FLUSH;
15161     }
15162   }
15164   this._processChunk(chunk, flushFlag, cb);
15167 Zlib.prototype._processChunk = function (chunk, flushFlag, cb) {
15168   var availInBefore = chunk && chunk.length;
15169   var availOutBefore = this._chunkSize - this._offset;
15170   var inOff = 0;
15172   var self = this;
15174   var async = typeof cb === 'function';
15176   if (!async) {
15177     var buffers = [];
15178     var nread = 0;
15180     var error;
15181     this.on('error', function (er) {
15182       error = er;
15183     });
15185     assert(this._handle, 'zlib binding closed');
15186     do {
15187       var res = this._handle.writeSync(flushFlag, chunk, // in
15188       inOff, // in_off
15189       availInBefore, // in_len
15190       this._buffer, // out
15191       this._offset, //out_off
15192       availOutBefore); // out_len
15193     } while (!this._hadError && callback(res[0], res[1]));
15195     if (this._hadError) {
15196       throw error;
15197     }
15199     if (nread >= kMaxLength) {
15200       _close(this);
15201       throw new RangeError(kRangeErrorMessage);
15202     }
15204     var buf = Buffer.concat(buffers, nread);
15205     _close(this);
15207     return buf;
15208   }
15210   assert(this._handle, 'zlib binding closed');
15211   var req = this._handle.write(flushFlag, chunk, // in
15212   inOff, // in_off
15213   availInBefore, // in_len
15214   this._buffer, // out
15215   this._offset, //out_off
15216   availOutBefore); // out_len
15218   req.buffer = chunk;
15219   req.callback = callback;
15221   function callback(availInAfter, availOutAfter) {
15222     // When the callback is used in an async write, the callback's
15223     // context is the `req` object that was created. The req object
15224     // is === this._handle, and that's why it's important to null
15225     // out the values after they are done being used. `this._handle`
15226     // can stay in memory longer than the callback and buffer are needed.
15227     if (this) {
15228       this.buffer = null;
15229       this.callback = null;
15230     }
15232     if (self._hadError) return;
15234     var have = availOutBefore - availOutAfter;
15235     assert(have >= 0, 'have should not go down');
15237     if (have > 0) {
15238       var out = self._buffer.slice(self._offset, self._offset + have);
15239       self._offset += have;
15240       // serve some output to the consumer.
15241       if (async) {
15242         self.push(out);
15243       } else {
15244         buffers.push(out);
15245         nread += out.length;
15246       }
15247     }
15249     // exhausted the output buffer, or used all the input create a new one.
15250     if (availOutAfter === 0 || self._offset >= self._chunkSize) {
15251       availOutBefore = self._chunkSize;
15252       self._offset = 0;
15253       self._buffer = Buffer.allocUnsafe(self._chunkSize);
15254     }
15256     if (availOutAfter === 0) {
15257       // Not actually done.  Need to reprocess.
15258       // Also, update the availInBefore to the availInAfter value,
15259       // so that if we have to hit it a third (fourth, etc.) time,
15260       // it'll have the correct byte counts.
15261       inOff += availInBefore - availInAfter;
15262       availInBefore = availInAfter;
15264       if (!async) return true;
15266       var newReq = self._handle.write(flushFlag, chunk, inOff, availInBefore, self._buffer, self._offset, self._chunkSize);
15267       newReq.callback = callback; // this same function
15268       newReq.buffer = chunk;
15269       return;
15270     }
15272     if (!async) return false;
15274     // finished with the chunk.
15275     cb();
15276   }
15279 util.inherits(Deflate, Zlib);
15280 util.inherits(Inflate, Zlib);
15281 util.inherits(Gzip, Zlib);
15282 util.inherits(Gunzip, Zlib);
15283 util.inherits(DeflateRaw, Zlib);
15284 util.inherits(InflateRaw, Zlib);
15285 util.inherits(Unzip, Zlib);
15286 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11)))
15288 /***/ }),
15289 /* 49 */
15290 /***/ (function(module, exports, __webpack_require__) {
15292 /* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.
15294 // Permission is hereby granted, free of charge, to any person obtaining a
15295 // copy of this software and associated documentation files (the
15296 // "Software"), to deal in the Software without restriction, including
15297 // without limitation the rights to use, copy, modify, merge, publish,
15298 // distribute, sublicense, and/or sell copies of the Software, and to permit
15299 // persons to whom the Software is furnished to do so, subject to the
15300 // following conditions:
15302 // The above copyright notice and this permission notice shall be included
15303 // in all copies or substantial portions of the Software.
15305 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15306 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
15307 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
15308 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
15309 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
15310 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
15311 // USE OR OTHER DEALINGS IN THE SOFTWARE.
15313 var formatRegExp = /%[sdj%]/g;
15314 exports.format = function(f) {
15315   if (!isString(f)) {
15316     var objects = [];
15317     for (var i = 0; i < arguments.length; i++) {
15318       objects.push(inspect(arguments[i]));
15319     }
15320     return objects.join(' ');
15321   }
15323   var i = 1;
15324   var args = arguments;
15325   var len = args.length;
15326   var str = String(f).replace(formatRegExp, function(x) {
15327     if (x === '%%') return '%';
15328     if (i >= len) return x;
15329     switch (x) {
15330       case '%s': return String(args[i++]);
15331       case '%d': return Number(args[i++]);
15332       case '%j':
15333         try {
15334           return JSON.stringify(args[i++]);
15335         } catch (_) {
15336           return '[Circular]';
15337         }
15338       default:
15339         return x;
15340     }
15341   });
15342   for (var x = args[i]; i < len; x = args[++i]) {
15343     if (isNull(x) || !isObject(x)) {
15344       str += ' ' + x;
15345     } else {
15346       str += ' ' + inspect(x);
15347     }
15348   }
15349   return str;
15353 // Mark that a method should not be used.
15354 // Returns a modified function which warns once by default.
15355 // If --no-deprecation is set, then it is a no-op.
15356 exports.deprecate = function(fn, msg) {
15357   // Allow for deprecating things in the process of starting up.
15358   if (isUndefined(global.process)) {
15359     return function() {
15360       return exports.deprecate(fn, msg).apply(this, arguments);
15361     };
15362   }
15364   if (process.noDeprecation === true) {
15365     return fn;
15366   }
15368   var warned = false;
15369   function deprecated() {
15370     if (!warned) {
15371       if (process.throwDeprecation) {
15372         throw new Error(msg);
15373       } else if (process.traceDeprecation) {
15374         console.trace(msg);
15375       } else {
15376         console.error(msg);
15377       }
15378       warned = true;
15379     }
15380     return fn.apply(this, arguments);
15381   }
15383   return deprecated;
15387 var debugs = {};
15388 var debugEnviron;
15389 exports.debuglog = function(set) {
15390   if (isUndefined(debugEnviron))
15391     debugEnviron = process.env.NODE_DEBUG || '';
15392   set = set.toUpperCase();
15393   if (!debugs[set]) {
15394     if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
15395       var pid = process.pid;
15396       debugs[set] = function() {
15397         var msg = exports.format.apply(exports, arguments);
15398         console.error('%s %d: %s', set, pid, msg);
15399       };
15400     } else {
15401       debugs[set] = function() {};
15402     }
15403   }
15404   return debugs[set];
15409  * Echos the value of a value. Trys to print the value out
15410  * in the best way possible given the different types.
15412  * @param {Object} obj The object to print out.
15413  * @param {Object} opts Optional options object that alters the output.
15414  */
15415 /* legacy: obj, showHidden, depth, colors*/
15416 function inspect(obj, opts) {
15417   // default options
15418   var ctx = {
15419     seen: [],
15420     stylize: stylizeNoColor
15421   };
15422   // legacy...
15423   if (arguments.length >= 3) ctx.depth = arguments[2];
15424   if (arguments.length >= 4) ctx.colors = arguments[3];
15425   if (isBoolean(opts)) {
15426     // legacy...
15427     ctx.showHidden = opts;
15428   } else if (opts) {
15429     // got an "options" object
15430     exports._extend(ctx, opts);
15431   }
15432   // set default options
15433   if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
15434   if (isUndefined(ctx.depth)) ctx.depth = 2;
15435   if (isUndefined(ctx.colors)) ctx.colors = false;
15436   if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
15437   if (ctx.colors) ctx.stylize = stylizeWithColor;
15438   return formatValue(ctx, obj, ctx.depth);
15440 exports.inspect = inspect;
15443 // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
15444 inspect.colors = {
15445   'bold' : [1, 22],
15446   'italic' : [3, 23],
15447   'underline' : [4, 24],
15448   'inverse' : [7, 27],
15449   'white' : [37, 39],
15450   'grey' : [90, 39],
15451   'black' : [30, 39],
15452   'blue' : [34, 39],
15453   'cyan' : [36, 39],
15454   'green' : [32, 39],
15455   'magenta' : [35, 39],
15456   'red' : [31, 39],
15457   'yellow' : [33, 39]
15460 // Don't use 'blue' not visible on cmd.exe
15461 inspect.styles = {
15462   'special': 'cyan',
15463   'number': 'yellow',
15464   'boolean': 'yellow',
15465   'undefined': 'grey',
15466   'null': 'bold',
15467   'string': 'green',
15468   'date': 'magenta',
15469   // "name": intentionally not styling
15470   'regexp': 'red'
15474 function stylizeWithColor(str, styleType) {
15475   var style = inspect.styles[styleType];
15477   if (style) {
15478     return '\u001b[' + inspect.colors[style][0] + 'm' + str +
15479            '\u001b[' + inspect.colors[style][1] + 'm';
15480   } else {
15481     return str;
15482   }
15486 function stylizeNoColor(str, styleType) {
15487   return str;
15491 function arrayToHash(array) {
15492   var hash = {};
15494   array.forEach(function(val, idx) {
15495     hash[val] = true;
15496   });
15498   return hash;
15502 function formatValue(ctx, value, recurseTimes) {
15503   // Provide a hook for user-specified inspect functions.
15504   // Check that value is an object with an inspect function on it
15505   if (ctx.customInspect &&
15506       value &&
15507       isFunction(value.inspect) &&
15508       // Filter out the util module, it's inspect function is special
15509       value.inspect !== exports.inspect &&
15510       // Also filter out any prototype objects using the circular check.
15511       !(value.constructor && value.constructor.prototype === value)) {
15512     var ret = value.inspect(recurseTimes, ctx);
15513     if (!isString(ret)) {
15514       ret = formatValue(ctx, ret, recurseTimes);
15515     }
15516     return ret;
15517   }
15519   // Primitive types cannot have properties
15520   var primitive = formatPrimitive(ctx, value);
15521   if (primitive) {
15522     return primitive;
15523   }
15525   // Look up the keys of the object.
15526   var keys = Object.keys(value);
15527   var visibleKeys = arrayToHash(keys);
15529   if (ctx.showHidden) {
15530     keys = Object.getOwnPropertyNames(value);
15531   }
15533   // IE doesn't make error fields non-enumerable
15534   // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
15535   if (isError(value)
15536       && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
15537     return formatError(value);
15538   }
15540   // Some type of object without properties can be shortcutted.
15541   if (keys.length === 0) {
15542     if (isFunction(value)) {
15543       var name = value.name ? ': ' + value.name : '';
15544       return ctx.stylize('[Function' + name + ']', 'special');
15545     }
15546     if (isRegExp(value)) {
15547       return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
15548     }
15549     if (isDate(value)) {
15550       return ctx.stylize(Date.prototype.toString.call(value), 'date');
15551     }
15552     if (isError(value)) {
15553       return formatError(value);
15554     }
15555   }
15557   var base = '', array = false, braces = ['{', '}'];
15559   // Make Array say that they are Array
15560   if (isArray(value)) {
15561     array = true;
15562     braces = ['[', ']'];
15563   }
15565   // Make functions say that they are functions
15566   if (isFunction(value)) {
15567     var n = value.name ? ': ' + value.name : '';
15568     base = ' [Function' + n + ']';
15569   }
15571   // Make RegExps say that they are RegExps
15572   if (isRegExp(value)) {
15573     base = ' ' + RegExp.prototype.toString.call(value);
15574   }
15576   // Make dates with properties first say the date
15577   if (isDate(value)) {
15578     base = ' ' + Date.prototype.toUTCString.call(value);
15579   }
15581   // Make error with message first say the error
15582   if (isError(value)) {
15583     base = ' ' + formatError(value);
15584   }
15586   if (keys.length === 0 && (!array || value.length == 0)) {
15587     return braces[0] + base + braces[1];
15588   }
15590   if (recurseTimes < 0) {
15591     if (isRegExp(value)) {
15592       return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
15593     } else {
15594       return ctx.stylize('[Object]', 'special');
15595     }
15596   }
15598   ctx.seen.push(value);
15600   var output;
15601   if (array) {
15602     output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
15603   } else {
15604     output = keys.map(function(key) {
15605       return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
15606     });
15607   }
15609   ctx.seen.pop();
15611   return reduceToSingleString(output, base, braces);
15615 function formatPrimitive(ctx, value) {
15616   if (isUndefined(value))
15617     return ctx.stylize('undefined', 'undefined');
15618   if (isString(value)) {
15619     var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
15620                                              .replace(/'/g, "\\'")
15621                                              .replace(/\\"/g, '"') + '\'';
15622     return ctx.stylize(simple, 'string');
15623   }
15624   if (isNumber(value))
15625     return ctx.stylize('' + value, 'number');
15626   if (isBoolean(value))
15627     return ctx.stylize('' + value, 'boolean');
15628   // For some reason typeof null is "object", so special case here.
15629   if (isNull(value))
15630     return ctx.stylize('null', 'null');
15634 function formatError(value) {
15635   return '[' + Error.prototype.toString.call(value) + ']';
15639 function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
15640   var output = [];
15641   for (var i = 0, l = value.length; i < l; ++i) {
15642     if (hasOwnProperty(value, String(i))) {
15643       output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
15644           String(i), true));
15645     } else {
15646       output.push('');
15647     }
15648   }
15649   keys.forEach(function(key) {
15650     if (!key.match(/^\d+$/)) {
15651       output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
15652           key, true));
15653     }
15654   });
15655   return output;
15659 function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
15660   var name, str, desc;
15661   desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
15662   if (desc.get) {
15663     if (desc.set) {
15664       str = ctx.stylize('[Getter/Setter]', 'special');
15665     } else {
15666       str = ctx.stylize('[Getter]', 'special');
15667     }
15668   } else {
15669     if (desc.set) {
15670       str = ctx.stylize('[Setter]', 'special');
15671     }
15672   }
15673   if (!hasOwnProperty(visibleKeys, key)) {
15674     name = '[' + key + ']';
15675   }
15676   if (!str) {
15677     if (ctx.seen.indexOf(desc.value) < 0) {
15678       if (isNull(recurseTimes)) {
15679         str = formatValue(ctx, desc.value, null);
15680       } else {
15681         str = formatValue(ctx, desc.value, recurseTimes - 1);
15682       }
15683       if (str.indexOf('\n') > -1) {
15684         if (array) {
15685           str = str.split('\n').map(function(line) {
15686             return '  ' + line;
15687           }).join('\n').substr(2);
15688         } else {
15689           str = '\n' + str.split('\n').map(function(line) {
15690             return '   ' + line;
15691           }).join('\n');
15692         }
15693       }
15694     } else {
15695       str = ctx.stylize('[Circular]', 'special');
15696     }
15697   }
15698   if (isUndefined(name)) {
15699     if (array && key.match(/^\d+$/)) {
15700       return str;
15701     }
15702     name = JSON.stringify('' + key);
15703     if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
15704       name = name.substr(1, name.length - 2);
15705       name = ctx.stylize(name, 'name');
15706     } else {
15707       name = name.replace(/'/g, "\\'")
15708                  .replace(/\\"/g, '"')
15709                  .replace(/(^"|"$)/g, "'");
15710       name = ctx.stylize(name, 'string');
15711     }
15712   }
15714   return name + ': ' + str;
15718 function reduceToSingleString(output, base, braces) {
15719   var numLinesEst = 0;
15720   var length = output.reduce(function(prev, cur) {
15721     numLinesEst++;
15722     if (cur.indexOf('\n') >= 0) numLinesEst++;
15723     return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
15724   }, 0);
15726   if (length > 60) {
15727     return braces[0] +
15728            (base === '' ? '' : base + '\n ') +
15729            ' ' +
15730            output.join(',\n  ') +
15731            ' ' +
15732            braces[1];
15733   }
15735   return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
15739 // NOTE: These type checking functions intentionally don't use `instanceof`
15740 // because it is fragile and can be easily faked with `Object.create()`.
15741 function isArray(ar) {
15742   return Array.isArray(ar);
15744 exports.isArray = isArray;
15746 function isBoolean(arg) {
15747   return typeof arg === 'boolean';
15749 exports.isBoolean = isBoolean;
15751 function isNull(arg) {
15752   return arg === null;
15754 exports.isNull = isNull;
15756 function isNullOrUndefined(arg) {
15757   return arg == null;
15759 exports.isNullOrUndefined = isNullOrUndefined;
15761 function isNumber(arg) {
15762   return typeof arg === 'number';
15764 exports.isNumber = isNumber;
15766 function isString(arg) {
15767   return typeof arg === 'string';
15769 exports.isString = isString;
15771 function isSymbol(arg) {
15772   return typeof arg === 'symbol';
15774 exports.isSymbol = isSymbol;
15776 function isUndefined(arg) {
15777   return arg === void 0;
15779 exports.isUndefined = isUndefined;
15781 function isRegExp(re) {
15782   return isObject(re) && objectToString(re) === '[object RegExp]';
15784 exports.isRegExp = isRegExp;
15786 function isObject(arg) {
15787   return typeof arg === 'object' && arg !== null;
15789 exports.isObject = isObject;
15791 function isDate(d) {
15792   return isObject(d) && objectToString(d) === '[object Date]';
15794 exports.isDate = isDate;
15796 function isError(e) {
15797   return isObject(e) &&
15798       (objectToString(e) === '[object Error]' || e instanceof Error);
15800 exports.isError = isError;
15802 function isFunction(arg) {
15803   return typeof arg === 'function';
15805 exports.isFunction = isFunction;
15807 function isPrimitive(arg) {
15808   return arg === null ||
15809          typeof arg === 'boolean' ||
15810          typeof arg === 'number' ||
15811          typeof arg === 'string' ||
15812          typeof arg === 'symbol' ||  // ES6 symbol
15813          typeof arg === 'undefined';
15815 exports.isPrimitive = isPrimitive;
15817 exports.isBuffer = __webpack_require__(151);
15819 function objectToString(o) {
15820   return Object.prototype.toString.call(o);
15824 function pad(n) {
15825   return n < 10 ? '0' + n.toString(10) : n.toString(10);
15829 var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
15830               'Oct', 'Nov', 'Dec'];
15832 // 26 Feb 16:19:34
15833 function timestamp() {
15834   var d = new Date();
15835   var time = [pad(d.getHours()),
15836               pad(d.getMinutes()),
15837               pad(d.getSeconds())].join(':');
15838   return [d.getDate(), months[d.getMonth()], time].join(' ');
15842 // log is just a thin wrapper to console.log that prepends a timestamp
15843 exports.log = function() {
15844   console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
15849  * Inherit the prototype methods from one constructor into another.
15851  * The Function.prototype.inherits from lang.js rewritten as a standalone
15852  * function (not on Function.prototype). NOTE: If this file is to be loaded
15853  * during bootstrapping this function needs to be rewritten using some native
15854  * functions as prototype setup using normal JavaScript does not work as
15855  * expected during bootstrapping (see mirror.js in r114903).
15857  * @param {function} ctor Constructor function which needs to inherit the
15858  *     prototype.
15859  * @param {function} superCtor Constructor function to inherit prototype from.
15860  */
15861 exports.inherits = __webpack_require__(152);
15863 exports._extend = function(origin, add) {
15864   // Don't do anything if add isn't an object
15865   if (!add || !isObject(add)) return origin;
15867   var keys = Object.keys(add);
15868   var i = keys.length;
15869   while (i--) {
15870     origin[keys[i]] = add[keys[i]];
15871   }
15872   return origin;
15875 function hasOwnProperty(obj, prop) {
15876   return Object.prototype.hasOwnProperty.call(obj, prop);
15879 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7), __webpack_require__(11)))
15881 /***/ }),
15882 /* 50 */
15883 /***/ (function(module, exports, __webpack_require__) {
15885 /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.12.6
15886 (function() {
15887   var EmbeddedFont, PDFFont, StandardFont, fontkit;
15889   fontkit = __webpack_require__(167);
15891   PDFFont = (function() {
15892     PDFFont.open = function(document, src, family, id) {
15893       var font;
15894       if (typeof src === 'string') {
15895         if (StandardFont.isStandardFont(src)) {
15896           return new StandardFont(document, src, id);
15897         }
15898         font = fontkit.openSync(src, family);
15899       } else if (Buffer.isBuffer(src)) {
15900         font = fontkit.create(src, family);
15901       } else if (src instanceof Uint8Array) {
15902         font = fontkit.create(new Buffer(src), family);
15903       } else if (src instanceof ArrayBuffer) {
15904         font = fontkit.create(new Buffer(new Uint8Array(src)), family);
15905       }
15906       if (font == null) {
15907         throw new Error('Not a supported font format or standard PDF font.');
15908       }
15909       return new EmbeddedFont(document, font, id);
15910     };
15912     function PDFFont() {
15913       throw new Error('Cannot construct a PDFFont directly.');
15914     }
15916     PDFFont.prototype.encode = function(text) {
15917       throw new Error('Must be implemented by subclasses');
15918     };
15920     PDFFont.prototype.widthOfString = function(text) {
15921       throw new Error('Must be implemented by subclasses');
15922     };
15924     PDFFont.prototype.ref = function() {
15925       return this.dictionary != null ? this.dictionary : this.dictionary = this.document.ref();
15926     };
15928     PDFFont.prototype.finalize = function() {
15929       if (this.embedded || (this.dictionary == null)) {
15930         return;
15931       }
15932       this.embed();
15933       return this.embedded = true;
15934     };
15936     PDFFont.prototype.embed = function() {
15937       throw new Error('Must be implemented by subclasses');
15938     };
15940     PDFFont.prototype.lineHeight = function(size, includeGap) {
15941       var gap;
15942       if (includeGap == null) {
15943         includeGap = false;
15944       }
15945       gap = includeGap ? this.lineGap : 0;
15946       return (this.ascender + gap - this.descender) / 1000 * size;
15947     };
15949     return PDFFont;
15951   })();
15953   module.exports = PDFFont;
15955   StandardFont = __webpack_require__(292);
15957   EmbeddedFont = __webpack_require__(294);
15959 }).call(this);
15961 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
15963 /***/ }),
15964 /* 51 */
15965 /***/ (function(module, exports, __webpack_require__) {
15967 /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.7.1
15968 (function() {
15969   var DecodeStream, iconv;
15971   try {
15972     iconv = __webpack_require__(52);
15973   } catch (_error) {}
15975   DecodeStream = (function() {
15976     var key;
15978     function DecodeStream(buffer) {
15979       this.buffer = buffer;
15980       this.pos = 0;
15981       this.length = this.buffer.length;
15982     }
15984     DecodeStream.TYPES = {
15985       UInt8: 1,
15986       UInt16: 2,
15987       UInt24: 3,
15988       UInt32: 4,
15989       Int8: 1,
15990       Int16: 2,
15991       Int24: 3,
15992       Int32: 4,
15993       Float: 4,
15994       Double: 8
15995     };
15997     for (key in Buffer.prototype) {
15998       if (key.slice(0, 4) === 'read') {
15999         (function(key) {
16000           var bytes;
16001           bytes = DecodeStream.TYPES[key.replace(/read|[BL]E/g, '')];
16002           return DecodeStream.prototype[key] = function() {
16003             var ret;
16004             ret = this.buffer[key](this.pos);
16005             this.pos += bytes;
16006             return ret;
16007           };
16008         })(key);
16009       }
16010     }
16012     DecodeStream.prototype.readString = function(length, encoding) {
16013       var buf, byte, i, _i, _ref;
16014       if (encoding == null) {
16015         encoding = 'ascii';
16016       }
16017       switch (encoding) {
16018         case 'utf16le':
16019         case 'ucs2':
16020         case 'utf8':
16021         case 'ascii':
16022           return this.buffer.toString(encoding, this.pos, this.pos += length);
16023         case 'utf16be':
16024           buf = new Buffer(this.readBuffer(length));
16025           for (i = _i = 0, _ref = buf.length - 1; _i < _ref; i = _i += 2) {
16026             byte = buf[i];
16027             buf[i] = buf[i + 1];
16028             buf[i + 1] = byte;
16029           }
16030           return buf.toString('utf16le');
16031         default:
16032           buf = this.readBuffer(length);
16033           if (iconv) {
16034             try {
16035               return iconv.decode(buf, encoding);
16036             } catch (_error) {}
16037           }
16038           return buf;
16039       }
16040     };
16042     DecodeStream.prototype.readBuffer = function(length) {
16043       return this.buffer.slice(this.pos, this.pos += length);
16044     };
16046     DecodeStream.prototype.readUInt24BE = function() {
16047       return (this.readUInt16BE() << 8) + this.readUInt8();
16048     };
16050     DecodeStream.prototype.readUInt24LE = function() {
16051       return this.readUInt16LE() + (this.readUInt8() << 16);
16052     };
16054     DecodeStream.prototype.readInt24BE = function() {
16055       return (this.readInt16BE() << 8) + this.readUInt8();
16056     };
16058     DecodeStream.prototype.readInt24LE = function() {
16059       return this.readUInt16LE() + (this.readInt8() << 16);
16060     };
16062     return DecodeStream;
16064   })();
16066   module.exports = DecodeStream;
16068 }).call(this);
16070 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
16072 /***/ }),
16073 /* 52 */
16074 /***/ (function(module, exports, __webpack_require__) {
16076 "use strict";
16077 /* WEBPACK VAR INJECTION */(function(process) {
16079 // Some environments don't have global Buffer (e.g. React Native).
16080 // Solution would be installing npm modules "buffer" and "stream" explicitly.
16081 var Buffer = __webpack_require__(1).Buffer;
16083 var bomHandling = __webpack_require__(170),
16084     iconv = module.exports;
16086 // All codecs and aliases are kept here, keyed by encoding name/alias.
16087 // They are lazy loaded in `iconv.getCodec` from `encodings/index.js`.
16088 iconv.encodings = null;
16090 // Characters emitted in case of error.
16091 iconv.defaultCharUnicode = '�';
16092 iconv.defaultCharSingleByte = '?';
16094 // Public API.
16095 iconv.encode = function encode(str, encoding, options) {
16096     str = "" + (str || ""); // Ensure string.
16098     var encoder = iconv.getEncoder(encoding, options);
16100     var res = encoder.write(str);
16101     var trail = encoder.end();
16103     return (trail && trail.length > 0) ? Buffer.concat([res, trail]) : res;
16106 iconv.decode = function decode(buf, encoding, options) {
16107     if (typeof buf === 'string') {
16108         if (!iconv.skipDecodeWarning) {
16109             console.error('Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding');
16110             iconv.skipDecodeWarning = true;
16111         }
16113         buf = new Buffer("" + (buf || ""), "binary"); // Ensure buffer.
16114     }
16116     var decoder = iconv.getDecoder(encoding, options);
16118     var res = decoder.write(buf);
16119     var trail = decoder.end();
16121     return trail ? (res + trail) : res;
16124 iconv.encodingExists = function encodingExists(enc) {
16125     try {
16126         iconv.getCodec(enc);
16127         return true;
16128     } catch (e) {
16129         return false;
16130     }
16133 // Legacy aliases to convert functions
16134 iconv.toEncoding = iconv.encode;
16135 iconv.fromEncoding = iconv.decode;
16137 // Search for a codec in iconv.encodings. Cache codec data in iconv._codecDataCache.
16138 iconv._codecDataCache = {};
16139 iconv.getCodec = function getCodec(encoding) {
16140     if (!iconv.encodings)
16141         iconv.encodings = __webpack_require__(171); // Lazy load all encoding definitions.
16143     // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.
16144     var enc = (''+encoding).toLowerCase().replace(/[^0-9a-z]|:\d{4}$/g, "");
16146     // Traverse iconv.encodings to find actual codec.
16147     var codecOptions = {};
16148     while (true) {
16149         var codec = iconv._codecDataCache[enc];
16150         if (codec)
16151             return codec;
16153         var codecDef = iconv.encodings[enc];
16155         switch (typeof codecDef) {
16156             case "string": // Direct alias to other encoding.
16157                 enc = codecDef;
16158                 break;
16160             case "object": // Alias with options. Can be layered.
16161                 for (var key in codecDef)
16162                     codecOptions[key] = codecDef[key];
16164                 if (!codecOptions.encodingName)
16165                     codecOptions.encodingName = enc;
16167                 enc = codecDef.type;
16168                 break;
16170             case "function": // Codec itself.
16171                 if (!codecOptions.encodingName)
16172                     codecOptions.encodingName = enc;
16174                 // The codec function must load all tables and return object with .encoder and .decoder methods.
16175                 // It'll be called only once (for each different options object).
16176                 codec = new codecDef(codecOptions, iconv);
16178                 iconv._codecDataCache[codecOptions.encodingName] = codec; // Save it to be reused later.
16179                 return codec;
16181             default:
16182                 throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')");
16183         }
16184     }
16187 iconv.getEncoder = function getEncoder(encoding, options) {
16188     var codec = iconv.getCodec(encoding),
16189         encoder = new codec.encoder(options, codec);
16191     if (codec.bomAware && options && options.addBOM)
16192         encoder = new bomHandling.PrependBOM(encoder, options);
16194     return encoder;
16197 iconv.getDecoder = function getDecoder(encoding, options) {
16198     var codec = iconv.getCodec(encoding),
16199         decoder = new codec.decoder(options, codec);
16201     if (codec.bomAware && !(options && options.stripBOM === false))
16202         decoder = new bomHandling.StripBOM(decoder, options);
16204     return decoder;
16208 // Load extensions in Node. All of them are omitted in Browserify build via 'browser' field in package.json.
16209 var nodeVer = typeof process !== 'undefined' && process.versions && process.versions.node;
16210 if (nodeVer) {
16212     // Load streaming support in Node v0.10+
16213     var nodeVerArr = nodeVer.split(".").map(Number);
16214     if (nodeVerArr[0] > 0 || nodeVerArr[1] >= 10) {
16215         __webpack_require__(185)(iconv);
16216     }
16218     // Load Node primitive extensions.
16219     __webpack_require__(186)(iconv);
16222 if (false) {
16223     console.error("iconv-lite warning: javascript files use encoding different from utf-8. See https://github.com/ashtuchkin/iconv-lite/wiki/Javascript-source-file-encodings for more info.");
16226 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11)))
16228 /***/ }),
16229 /* 53 */
16230 /***/ (function(module, exports) {
16232 module.exports = [["0","\u0000",127,"€"],["8140","丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪",5,"乲乴",9,"乿",6,"亇亊"],["8180","亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂",6,"伋伌伒",4,"伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾",4,"佄佅佇",5,"佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢"],["8240","侤侫侭侰",4,"侶",8,"俀俁係俆俇俈俉俋俌俍俒",4,"俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿",11],["8280","個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯",10,"倻倽倿偀偁偂偄偅偆偉偊偋偍偐",4,"偖偗偘偙偛偝",7,"偦",5,"偭",8,"偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎",20,"傤傦傪傫傭",4,"傳",6,"傼"],["8340","傽",17,"僐",5,"僗僘僙僛",10,"僨僩僪僫僯僰僱僲僴僶",4,"僼",9,"儈"],["8380","儉儊儌",5,"儓",13,"儢",28,"兂兇兊兌兎兏児兒兓兗兘兙兛兝",4,"兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦",4,"冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒",5],["8440","凘凙凚凜凞凟凢凣凥",5,"凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄",5,"剋剎剏剒剓剕剗剘"],["8480","剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳",9,"剾劀劃",4,"劉",6,"劑劒劔",6,"劜劤劥劦劧劮劯劰労",9,"勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務",5,"勠勡勢勣勥",10,"勱",7,"勻勼勽匁匂匃匄匇匉匊匋匌匎"],["8540","匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯",9,"匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏"],["8580","厐",4,"厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯",6,"厷厸厹厺厼厽厾叀參",4,"収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝",4,"呣呥呧呩",7,"呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡"],["8640","咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠",4,"哫哬哯哰哱哴",5,"哻哾唀唂唃唄唅唈唊",4,"唒唓唕",5,"唜唝唞唟唡唥唦"],["8680","唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋",4,"啑啒啓啔啗",4,"啝啞啟啠啢啣啨啩啫啯",5,"啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠",6,"喨",8,"喲喴営喸喺喼喿",4,"嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗",4,"嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸",4,"嗿嘂嘃嘄嘅"],["8740","嘆嘇嘊嘋嘍嘐",7,"嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀",11,"噏",4,"噕噖噚噛噝",4],["8780","噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽",7,"嚇",6,"嚐嚑嚒嚔",14,"嚤",10,"嚰",6,"嚸嚹嚺嚻嚽",12,"囋",8,"囕囖囘囙囜団囥",5,"囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國",6],["8840","園",9,"圝圞圠圡圢圤圥圦圧圫圱圲圴",4,"圼圽圿坁坃坄坅坆坈坉坋坒",4,"坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀"],["8880","垁垇垈垉垊垍",4,"垔",6,"垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹",8,"埄",6,"埌埍埐埑埓埖埗埛埜埞埡埢埣埥",7,"埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥",4,"堫",4,"報堲堳場堶",7],["8940","堾",5,"塅",6,"塎塏塐塒塓塕塖塗塙",4,"塟",5,"塦",4,"塭",16,"塿墂墄墆墇墈墊墋墌"],["8980","墍",4,"墔",4,"墛墜墝墠",7,"墪",17,"墽墾墿壀壂壃壄壆",10,"壒壓壔壖",13,"壥",5,"壭壯壱売壴壵壷壸壺",7,"夃夅夆夈",4,"夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻"],["8a40","夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛",4,"奡奣奤奦",12,"奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦"],["8a80","妧妬妭妰妱妳",5,"妺妼妽妿",6,"姇姈姉姌姍姎姏姕姖姙姛姞",4,"姤姦姧姩姪姫姭",11,"姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪",6,"娳娵娷",4,"娽娾娿婁",4,"婇婈婋",9,"婖婗婘婙婛",5],["8b40","婡婣婤婥婦婨婩婫",8,"婸婹婻婼婽婾媀",17,"媓",6,"媜",13,"媫媬"],["8b80","媭",4,"媴媶媷媹",4,"媿嫀嫃",5,"嫊嫋嫍",4,"嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬",4,"嫲",22,"嬊",11,"嬘",25,"嬳嬵嬶嬸",7,"孁",6],["8c40","孈",7,"孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏"],["8c80","寑寔",8,"寠寢寣實寧審",4,"寯寱",6,"寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧",6,"屰屲",6,"屻屼屽屾岀岃",4,"岉岊岋岎岏岒岓岕岝",4,"岤",4],["8d40","岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅",5,"峌",5,"峓",5,"峚",6,"峢峣峧峩峫峬峮峯峱",9,"峼",4],["8d80","崁崄崅崈",5,"崏",4,"崕崗崘崙崚崜崝崟",4,"崥崨崪崫崬崯",4,"崵",7,"崿",7,"嵈嵉嵍",10,"嵙嵚嵜嵞",10,"嵪嵭嵮嵰嵱嵲嵳嵵",12,"嶃",21,"嶚嶛嶜嶞嶟嶠"],["8e40","嶡",21,"嶸",12,"巆",6,"巎",12,"巜巟巠巣巤巪巬巭"],["8e80","巰巵巶巸",4,"巿帀帄帇帉帊帋帍帎帒帓帗帞",7,"帨",4,"帯帰帲",4,"帹帺帾帿幀幁幃幆",5,"幍",6,"幖",4,"幜幝幟幠幣",14,"幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨",4,"庮",4,"庴庺庻庼庽庿",6],["8f40","廆廇廈廋",5,"廔廕廗廘廙廚廜",11,"廩廫",8,"廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤"],["8f80","弨弫弬弮弰弲",6,"弻弽弾弿彁",14,"彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢",5,"復徫徬徯",5,"徶徸徹徺徻徾",4,"忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇"],["9040","怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰",4,"怶",4,"怽怾恀恄",6,"恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀"],["9080","悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽",7,"惇惈惉惌",4,"惒惓惔惖惗惙惛惞惡",4,"惪惱惲惵惷惸惻",4,"愂愃愄愅愇愊愋愌愐",4,"愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬",18,"慀",6],["9140","慇慉態慍慏慐慒慓慔慖",6,"慞慟慠慡慣慤慥慦慩",6,"慱慲慳慴慶慸",18,"憌憍憏",4,"憕"],["9180","憖",6,"憞",8,"憪憫憭",9,"憸",5,"憿懀懁懃",4,"應懌",4,"懓懕",16,"懧",13,"懶",8,"戀",5,"戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸",4,"扂扄扅扆扊"],["9240","扏扐払扖扗扙扚扜",6,"扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋",5,"抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁"],["9280","拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳",5,"挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖",7,"捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙",6,"採掤掦掫掯掱掲掵掶掹掻掽掿揀"],["9340","揁揂揃揅揇揈揊揋揌揑揓揔揕揗",6,"揟揢揤",4,"揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆",4,"損搎搑搒搕",5,"搝搟搢搣搤"],["9380","搥搧搨搩搫搮",5,"搵",4,"搻搼搾摀摂摃摉摋",6,"摓摕摖摗摙",4,"摟",7,"摨摪摫摬摮",9,"摻",6,"撃撆撈",8,"撓撔撗撘撚撛撜撝撟",4,"撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆",6,"擏擑擓擔擕擖擙據"],["9440","擛擜擝擟擠擡擣擥擧",24,"攁",7,"攊",7,"攓",4,"攙",8],["9480","攢攣攤攦",4,"攬攭攰攱攲攳攷攺攼攽敀",4,"敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數",14,"斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱",7,"斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘",7,"旡旣旤旪旫"],["9540","旲旳旴旵旸旹旻",4,"昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷",4,"昽昿晀時晄",6,"晍晎晐晑晘"],["9580","晙晛晜晝晞晠晢晣晥晧晩",4,"晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘",4,"暞",8,"暩",4,"暯",4,"暵暶暷暸暺暻暼暽暿",25,"曚曞",7,"曧曨曪",5,"曱曵曶書曺曻曽朁朂會"],["9640","朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠",5,"朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗",4,"杝杢杣杤杦杧杫杬杮東杴杶"],["9680","杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹",7,"柂柅",9,"柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵",7,"柾栁栂栃栄栆栍栐栒栔栕栘",4,"栞栟栠栢",6,"栫",6,"栴栵栶栺栻栿桇桋桍桏桒桖",5],["9740","桜桝桞桟桪桬",7,"桵桸",8,"梂梄梇",7,"梐梑梒梔梕梖梘",9,"梣梤梥梩梪梫梬梮梱梲梴梶梷梸"],["9780","梹",6,"棁棃",5,"棊棌棎棏棐棑棓棔棖棗棙棛",4,"棡棢棤",9,"棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆",4,"椌椏椑椓",11,"椡椢椣椥",7,"椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃",16,"楕楖楘楙楛楜楟"],["9840","楡楢楤楥楧楨楩楪楬業楯楰楲",4,"楺楻楽楾楿榁榃榅榊榋榌榎",5,"榖榗榙榚榝",9,"榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽"],["9880","榾榿槀槂",7,"構槍槏槑槒槓槕",5,"槜槝槞槡",11,"槮槯槰槱槳",9,"槾樀",9,"樋",11,"標",5,"樠樢",5,"権樫樬樭樮樰樲樳樴樶",6,"樿",4,"橅橆橈",7,"橑",6,"橚"],["9940","橜",4,"橢橣橤橦",10,"橲",6,"橺橻橽橾橿檁檂檃檅",8,"檏檒",4,"檘",7,"檡",5],["9980","檧檨檪檭",114,"欥欦欨",6],["9a40","欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍",11,"歚",7,"歨歩歫",13,"歺歽歾歿殀殅殈"],["9a80","殌殎殏殐殑殔殕殗殘殙殜",4,"殢",7,"殫",7,"殶殸",6,"毀毃毄毆",4,"毌毎毐毑毘毚毜",4,"毢",7,"毬毭毮毰毱毲毴毶毷毸毺毻毼毾",6,"氈",4,"氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋",4,"汑汒汓汖汘"],["9b40","汙汚汢汣汥汦汧汫",4,"汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘"],["9b80","泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟",5,"洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽",4,"涃涄涆涇涊涋涍涏涐涒涖",4,"涜涢涥涬涭涰涱涳涴涶涷涹",5,"淁淂淃淈淉淊"],["9c40","淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽",7,"渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵"],["9c80","渶渷渹渻",7,"湅",7,"湏湐湑湒湕湗湙湚湜湝湞湠",10,"湬湭湯",14,"満溁溂溄溇溈溊",4,"溑",6,"溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪",5],["9d40","滰滱滲滳滵滶滷滸滺",7,"漃漄漅漇漈漊",4,"漐漑漒漖",9,"漡漢漣漥漦漧漨漬漮漰漲漴漵漷",6,"漿潀潁潂"],["9d80","潃潄潅潈潉潊潌潎",9,"潙潚潛潝潟潠潡潣潤潥潧",5,"潯潰潱潳潵潶潷潹潻潽",6,"澅澆澇澊澋澏",12,"澝澞澟澠澢",4,"澨",10,"澴澵澷澸澺",5,"濁濃",5,"濊",6,"濓",10,"濟濢濣濤濥"],["9e40","濦",7,"濰",32,"瀒",7,"瀜",6,"瀤",6],["9e80","瀫",9,"瀶瀷瀸瀺",17,"灍灎灐",13,"灟",11,"灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞",12,"炰炲炴炵炶為炾炿烄烅烆烇烉烋",12,"烚"],["9f40","烜烝烞烠烡烢烣烥烪烮烰",6,"烸烺烻烼烾",10,"焋",4,"焑焒焔焗焛",10,"焧",7,"焲焳焴"],["9f80","焵焷",13,"煆煇煈煉煋煍煏",12,"煝煟",4,"煥煩",4,"煯煰煱煴煵煶煷煹煻煼煾",5,"熅",4,"熋熌熍熎熐熑熒熓熕熖熗熚",4,"熡",6,"熩熪熫熭",5,"熴熶熷熸熺",8,"燄",9,"燏",4],["a040","燖",9,"燡燢燣燤燦燨",5,"燯",9,"燺",11,"爇",19],["a080","爛爜爞",9,"爩爫爭爮爯爲爳爴爺爼爾牀",6,"牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅",4,"犌犎犐犑犓",11,"犠",11,"犮犱犲犳犵犺",6,"狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛"],["a1a1"," 、。·ˉˇ¨〃々—~‖…‘’“”〔〕〈",7,"〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓"],["a2a1","ⅰ",9],["a2b1","⒈",19,"⑴",19,"①",9],["a2e5","㈠",9],["a2f1","Ⅰ",11],["a3a1","!"#¥%",88," ̄"],["a4a1","ぁ",82],["a5a1","ァ",85],["a6a1","Α",16,"Σ",6],["a6c1","α",16,"σ",6],["a6e0","︵︶︹︺︿﹀︽︾﹁﹂﹃﹄"],["a6ee","︻︼︷︸︱"],["a6f4","︳︴"],["a7a1","А",5,"ЁЖ",25],["a7d1","а",5,"ёж",25],["a840","ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═",35,"▁",6],["a880","█",7,"▓▔▕▼▽◢◣◤◥☉⊕〒〝〞"],["a8a1","āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ"],["a8bd","ńň"],["a8c0","ɡ"],["a8c5","ㄅ",36],["a940","〡",8,"㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰¬¦"],["a959","℡㈱"],["a95c","‐"],["a960","ー゛゜ヽヾ〆ゝゞ﹉",9,"﹔﹕﹖﹗﹙",8],["a980","﹢",4,"﹨﹩﹪﹫"],["a996","〇"],["a9a4","─",75],["aa40","狜狝狟狢",5,"狪狫狵狶狹狽狾狿猀猂猄",5,"猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀",8],["aa80","獉獊獋獌獎獏獑獓獔獕獖獘",7,"獡",10,"獮獰獱"],["ab40","獲",11,"獿",4,"玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣",5,"玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃",4],["ab80","珋珌珎珒",6,"珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳",4],["ac40","珸",10,"琄琇琈琋琌琍琎琑",8,"琜",5,"琣琤琧琩琫琭琯琱琲琷",4,"琽琾琿瑀瑂",11],["ac80","瑎",6,"瑖瑘瑝瑠",12,"瑮瑯瑱",4,"瑸瑹瑺"],["ad40","瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑",10,"璝璟",7,"璪",15,"璻",12],["ad80","瓈",9,"瓓",8,"瓝瓟瓡瓥瓧",6,"瓰瓱瓲"],["ae40","瓳瓵瓸",6,"甀甁甂甃甅",7,"甎甐甒甔甕甖甗甛甝甞甠",4,"甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘"],["ae80","畝",7,"畧畨畩畫",6,"畳畵當畷畺",4,"疀疁疂疄疅疇"],["af40","疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦",4,"疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇"],["af80","瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄"],["b040","癅",6,"癎",5,"癕癗",4,"癝癟癠癡癢癤",6,"癬癭癮癰",7,"癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛"],["b080","皜",7,"皥",8,"皯皰皳皵",9,"盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥"],["b140","盄盇盉盋盌盓盕盙盚盜盝盞盠",4,"盦",7,"盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎",10,"眛眜眝眞眡眣眤眥眧眪眫"],["b180","眬眮眰",4,"眹眻眽眾眿睂睄睅睆睈",7,"睒",7,"睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳"],["b240","睝睞睟睠睤睧睩睪睭",11,"睺睻睼瞁瞂瞃瞆",5,"瞏瞐瞓",11,"瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶",4],["b280","瞼瞾矀",12,"矎",8,"矘矙矚矝",4,"矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖"],["b340","矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃",5,"砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚"],["b380","硛硜硞",11,"硯",7,"硸硹硺硻硽",6,"场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚"],["b440","碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨",7,"碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚",9],["b480","磤磥磦磧磩磪磫磭",4,"磳磵磶磸磹磻",5,"礂礃礄礆",6,"础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮"],["b540","礍",5,"礔",9,"礟",4,"礥",14,"礵",4,"礽礿祂祃祄祅祇祊",8,"祔祕祘祙祡祣"],["b580","祤祦祩祪祫祬祮祰",6,"祹祻",4,"禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠"],["b640","禓",6,"禛",11,"禨",10,"禴",4,"禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙",5,"秠秡秢秥秨秪"],["b680","秬秮秱",6,"秹秺秼秾秿稁稄稅稇稈稉稊稌稏",4,"稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二"],["b740","稝稟稡稢稤",14,"稴稵稶稸稺稾穀",5,"穇",9,"穒",4,"穘",16],["b780","穩",6,"穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服"],["b840","窣窤窧窩窪窫窮",4,"窴",10,"竀",10,"竌",9,"竗竘竚竛竜竝竡竢竤竧",5,"竮竰竱竲竳"],["b880","竴",4,"竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹"],["b940","笯笰笲笴笵笶笷笹笻笽笿",5,"筆筈筊筍筎筓筕筗筙筜筞筟筡筣",10,"筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆",6,"箎箏"],["b980","箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹",7,"篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈"],["ba40","篅篈築篊篋篍篎篏篐篒篔",4,"篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲",4,"篸篹篺篻篽篿",7,"簈簉簊簍簎簐",5,"簗簘簙"],["ba80","簚",4,"簠",5,"簨簩簫",12,"簹",5,"籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖"],["bb40","籃",9,"籎",36,"籵",5,"籾",9],["bb80","粈粊",6,"粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴",4,"粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕"],["bc40","粿糀糂糃糄糆糉糋糎",6,"糘糚糛糝糞糡",6,"糩",5,"糰",7,"糹糺糼",13,"紋",5],["bc80","紑",14,"紡紣紤紥紦紨紩紪紬紭紮細",6,"肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件"],["bd40","紷",54,"絯",7],["bd80","絸",32,"健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸"],["be40","継",12,"綧",6,"綯",42],["be80","線",32,"尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻"],["bf40","緻",62],["bf80","縺縼",4,"繂",4,"繈",21,"俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀"],["c040","繞",35,"纃",23,"纜纝纞"],["c080","纮纴纻纼绖绤绬绹缊缐缞缷缹缻",6,"罃罆",9,"罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐"],["c140","罖罙罛罜罝罞罠罣",4,"罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂",7,"羋羍羏",4,"羕",4,"羛羜羠羢羣羥羦羨",6,"羱"],["c180","羳",4,"羺羻羾翀翂翃翄翆翇翈翉翋翍翏",4,"翖翗翙",5,"翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿"],["c240","翤翧翨翪翫翬翭翯翲翴",6,"翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫",5,"耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗"],["c280","聙聛",13,"聫",5,"聲",11,"隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫"],["c340","聾肁肂肅肈肊肍",5,"肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇",4,"胏",6,"胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋"],["c380","脌脕脗脙脛脜脝脟",12,"脭脮脰脳脴脵脷脹",4,"脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸"],["c440","腀",5,"腇腉腍腎腏腒腖腗腘腛",4,"腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃",4,"膉膋膌膍膎膐膒",5,"膙膚膞",4,"膤膥"],["c480","膧膩膫",7,"膴",5,"膼膽膾膿臄臅臇臈臉臋臍",6,"摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁"],["c540","臔",14,"臤臥臦臨臩臫臮",4,"臵",5,"臽臿舃與",4,"舎舏舑舓舕",5,"舝舠舤舥舦舧舩舮舲舺舼舽舿"],["c580","艀艁艂艃艅艆艈艊艌艍艎艐",7,"艙艛艜艝艞艠",7,"艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗"],["c640","艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸"],["c680","苺苼",4,"茊茋茍茐茒茓茖茘茙茝",9,"茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐"],["c740","茾茿荁荂荄荅荈荊",4,"荓荕",4,"荝荢荰",6,"荹荺荾",6,"莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡",6,"莬莭莮"],["c780","莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠"],["c840","菮華菳",4,"菺菻菼菾菿萀萂萅萇萈萉萊萐萒",5,"萙萚萛萞",5,"萩",7,"萲",5,"萹萺萻萾",7,"葇葈葉"],["c880","葊",6,"葒",4,"葘葝葞葟葠葢葤",4,"葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁"],["c940","葽",4,"蒃蒄蒅蒆蒊蒍蒏",7,"蒘蒚蒛蒝蒞蒟蒠蒢",12,"蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗"],["c980","蓘",4,"蓞蓡蓢蓤蓧",4,"蓭蓮蓯蓱",10,"蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳"],["ca40","蔃",8,"蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢",8,"蔭",9,"蔾",4,"蕄蕅蕆蕇蕋",10],["ca80","蕗蕘蕚蕛蕜蕝蕟",4,"蕥蕦蕧蕩",8,"蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱"],["cb40","薂薃薆薈",6,"薐",10,"薝",6,"薥薦薧薩薫薬薭薱",5,"薸薺",6,"藂",6,"藊",4,"藑藒"],["cb80","藔藖",5,"藝",6,"藥藦藧藨藪",14,"恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔"],["cc40","藹藺藼藽藾蘀",4,"蘆",10,"蘒蘓蘔蘕蘗",15,"蘨蘪",13,"蘹蘺蘻蘽蘾蘿虀"],["cc80","虁",11,"虒虓處",4,"虛虜虝號虠虡虣",7,"獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃"],["cd40","虭虯虰虲",6,"蚃",6,"蚎",4,"蚔蚖",5,"蚞",4,"蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻",4,"蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜"],["cd80","蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威"],["ce40","蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀",6,"蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚",5,"蝡蝢蝦",7,"蝯蝱蝲蝳蝵"],["ce80","蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎",4,"螔螕螖螘",6,"螠",4,"巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺"],["cf40","螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁",4,"蟇蟈蟉蟌",4,"蟔",6,"蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯",9],["cf80","蟺蟻蟼蟽蟿蠀蠁蠂蠄",5,"蠋",7,"蠔蠗蠘蠙蠚蠜",4,"蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓"],["d040","蠤",13,"蠳",5,"蠺蠻蠽蠾蠿衁衂衃衆",5,"衎",5,"衕衖衘衚",6,"衦衧衪衭衯衱衳衴衵衶衸衹衺"],["d080","衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗",4,"袝",4,"袣袥",5,"小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄"],["d140","袬袮袯袰袲",4,"袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚",4,"裠裡裦裧裩",6,"裲裵裶裷裺裻製裿褀褁褃",5],["d180","褉褋",4,"褑褔",4,"褜",4,"褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶"],["d240","褸",8,"襂襃襅",24,"襠",5,"襧",19,"襼"],["d280","襽襾覀覂覄覅覇",26,"摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐"],["d340","覢",30,"觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴",6],["d380","觻",4,"訁",5,"計",21,"印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉"],["d440","訞",31,"訿",8,"詉",21],["d480","詟",25,"詺",6,"浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧"],["d540","誁",7,"誋",7,"誔",46],["d580","諃",32,"铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政"],["d640","諤",34,"謈",27],["d680","謤謥謧",30,"帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑"],["d740","譆",31,"譧",4,"譭",25],["d780","讇",24,"讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座"],["d840","谸",8,"豂豃豄豅豈豊豋豍",7,"豖豗豘豙豛",5,"豣",6,"豬",6,"豴豵豶豷豻",6,"貃貄貆貇"],["d880","貈貋貍",6,"貕貖貗貙",20,"亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝"],["d940","貮",62],["d980","賭",32,"佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼"],["da40","贎",14,"贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸",8,"趂趃趆趇趈趉趌",4,"趒趓趕",9,"趠趡"],["da80","趢趤",12,"趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺"],["db40","跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾",6,"踆踇踈踋踍踎踐踑踒踓踕",7,"踠踡踤",4,"踫踭踰踲踳踴踶踷踸踻踼踾"],["db80","踿蹃蹅蹆蹌",4,"蹓",5,"蹚",11,"蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝"],["dc40","蹳蹵蹷",4,"蹽蹾躀躂躃躄躆躈",6,"躑躒躓躕",6,"躝躟",11,"躭躮躰躱躳",6,"躻",7],["dc80","軃",10,"軏",21,"堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥"],["dd40","軥",62],["dd80","輤",32,"荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺"],["de40","轅",32,"轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆"],["de80","迉",4,"迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖"],["df40","這逜連逤逥逧",5,"逰",4,"逷逹逺逽逿遀遃遅遆遈",4,"過達違遖遙遚遜",5,"遤遦遧適遪遫遬遯",4,"遶",6,"遾邁"],["df80","還邅邆邇邉邊邌",4,"邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼"],["e040","郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅",19,"鄚鄛鄜"],["e080","鄝鄟鄠鄡鄤",10,"鄰鄲",6,"鄺",8,"酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼"],["e140","酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀",4,"醆醈醊醎醏醓",6,"醜",5,"醤",5,"醫醬醰醱醲醳醶醷醸醹醻"],["e180","醼",10,"釈釋釐釒",9,"針",8,"帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺"],["e240","釦",62],["e280","鈥",32,"狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧",5,"饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂"],["e340","鉆",45,"鉵",16],["e380","銆",7,"銏",24,"恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾"],["e440","銨",5,"銯",24,"鋉",31],["e480","鋩",32,"洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑"],["e540","錊",51,"錿",10],["e580","鍊",31,"鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣"],["e640","鍬",34,"鎐",27],["e680","鎬",29,"鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩"],["e740","鏎",7,"鏗",54],["e780","鐎",32,"纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡",6,"缪缫缬缭缯",4,"缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬"],["e840","鐯",14,"鐿",43,"鑬鑭鑮鑯"],["e880","鑰",20,"钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹"],["e940","锧锳锽镃镈镋镕镚镠镮镴镵長",7,"門",42],["e980","閫",32,"椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋"],["ea40","闌",27,"闬闿阇阓阘阛阞阠阣",6,"阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗"],["ea80","陘陙陚陜陝陞陠陣陥陦陫陭",4,"陳陸",12,"隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰"],["eb40","隌階隑隒隓隕隖隚際隝",9,"隨",7,"隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖",9,"雡",6,"雫"],["eb80","雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗",4,"霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻"],["ec40","霡",8,"霫霬霮霯霱霳",4,"霺霻霼霽霿",18,"靔靕靗靘靚靜靝靟靣靤靦靧靨靪",7],["ec80","靲靵靷",4,"靽",7,"鞆",4,"鞌鞎鞏鞐鞓鞕鞖鞗鞙",4,"臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐"],["ed40","鞞鞟鞡鞢鞤",6,"鞬鞮鞰鞱鞳鞵",46],["ed80","韤韥韨韮",4,"韴韷",23,"怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨"],["ee40","頏",62],["ee80","顎",32,"睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶",4,"钼钽钿铄铈",6,"铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪"],["ef40","顯",5,"颋颎颒颕颙颣風",37,"飏飐飔飖飗飛飜飝飠",4],["ef80","飥飦飩",30,"铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒",4,"锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤",8,"镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔"],["f040","餈",4,"餎餏餑",28,"餯",26],["f080","饊",9,"饖",12,"饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨",4,"鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦",6,"鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙"],["f140","馌馎馚",10,"馦馧馩",47],["f180","駙",32,"瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃"],["f240","駺",62],["f280","騹",32,"颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒"],["f340","驚",17,"驲骃骉骍骎骔骕骙骦骩",6,"骲骳骴骵骹骻骽骾骿髃髄髆",4,"髍髎髏髐髒體髕髖髗髙髚髛髜"],["f380","髝髞髠髢髣髤髥髧髨髩髪髬髮髰",8,"髺髼",6,"鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋"],["f440","鬇鬉",5,"鬐鬑鬒鬔",10,"鬠鬡鬢鬤",10,"鬰鬱鬳",7,"鬽鬾鬿魀魆魊魋魌魎魐魒魓魕",5],["f480","魛",32,"簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤"],["f540","魼",62],["f580","鮻",32,"酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜"],["f640","鯜",62],["f680","鰛",32,"觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅",5,"龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞",5,"鲥",4,"鲫鲭鲮鲰",7,"鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋"],["f740","鰼",62],["f780","鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾",4,"鳈鳉鳑鳒鳚鳛鳠鳡鳌",4,"鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄"],["f840","鳣",62],["f880","鴢",32],["f940","鵃",62],["f980","鶂",32],["fa40","鶣",62],["fa80","鷢",32],["fb40","鸃",27,"鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴",9,"麀"],["fb80","麁麃麄麅麆麉麊麌",5,"麔",8,"麞麠",5,"麧麨麩麪"],["fc40","麫",8,"麵麶麷麹麺麼麿",4,"黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰",8,"黺黽黿",6],["fc80","鼆",4,"鼌鼏鼑鼒鼔鼕鼖鼘鼚",5,"鼡鼣",8,"鼭鼮鼰鼱"],["fd40","鼲",4,"鼸鼺鼼鼿",4,"齅",10,"齒",38],["fd80","齹",5,"龁龂龍",11,"龜龝龞龡",4,"郎凉秊裏隣"],["fe40","兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩"]]
16234 /***/ }),
16235 /* 54 */
16236 /***/ (function(module, exports, __webpack_require__) {
16238 // fallback for non-array-like ES3 and non-enumerable old V8 strings
16239 var cof = __webpack_require__(55);
16240 // eslint-disable-next-line no-prototype-builtins
16241 module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
16242   return cof(it) == 'String' ? it.split('') : Object(it);
16246 /***/ }),
16247 /* 55 */
16248 /***/ (function(module, exports) {
16250 var toString = {}.toString;
16252 module.exports = function (it) {
16253   return toString.call(it).slice(8, -1);
16257 /***/ }),
16258 /* 56 */
16259 /***/ (function(module, exports) {
16261 // 7.2.1 RequireObjectCoercible(argument)
16262 module.exports = function (it) {
16263   if (it == undefined) throw TypeError("Can't call method on  " + it);
16264   return it;
16268 /***/ }),
16269 /* 57 */
16270 /***/ (function(module, exports, __webpack_require__) {
16272 var pIE = __webpack_require__(35);
16273 var createDesc = __webpack_require__(27);
16274 var toIObject = __webpack_require__(17);
16275 var toPrimitive = __webpack_require__(58);
16276 var has = __webpack_require__(18);
16277 var IE8_DOM_DEFINE = __webpack_require__(95);
16278 var gOPD = Object.getOwnPropertyDescriptor;
16280 exports.f = __webpack_require__(5) ? gOPD : function getOwnPropertyDescriptor(O, P) {
16281   O = toIObject(O);
16282   P = toPrimitive(P, true);
16283   if (IE8_DOM_DEFINE) try {
16284     return gOPD(O, P);
16285   } catch (e) { /* empty */ }
16286   if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
16290 /***/ }),
16291 /* 58 */
16292 /***/ (function(module, exports, __webpack_require__) {
16294 // 7.1.1 ToPrimitive(input [, PreferredType])
16295 var isObject = __webpack_require__(9);
16296 // instead of the ES6 spec version, we didn't implement @@toPrimitive case
16297 // and the second argument - flag - preferred type is a string
16298 module.exports = function (it, S) {
16299   if (!isObject(it)) return it;
16300   var fn, val;
16301   if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
16302   if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
16303   if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
16304   throw TypeError("Can't convert object to primitive value");
16308 /***/ }),
16309 /* 59 */
16310 /***/ (function(module, exports, __webpack_require__) {
16312 // most Object methods by ES6 should accept primitives
16313 var $export = __webpack_require__(3);
16314 var core = __webpack_require__(2);
16315 var fails = __webpack_require__(19);
16316 module.exports = function (KEY, exec) {
16317   var fn = (core.Object || {})[KEY] || Object[KEY];
16318   var exp = {};
16319   exp[KEY] = exec(fn);
16320   $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);
16324 /***/ }),
16325 /* 60 */
16326 /***/ (function(module, exports, __webpack_require__) {
16328 module.exports = { "default": __webpack_require__(200), __esModule: true };
16330 /***/ }),
16331 /* 61 */
16332 /***/ (function(module, exports, __webpack_require__) {
16334 "use strict";
16336 var LIBRARY = __webpack_require__(62);
16337 var $export = __webpack_require__(3);
16338 var redefine = __webpack_require__(99);
16339 var hide = __webpack_require__(13);
16340 var has = __webpack_require__(18);
16341 var Iterators = __webpack_require__(23);
16342 var $iterCreate = __webpack_require__(203);
16343 var setToStringTag = __webpack_require__(39);
16344 var getPrototypeOf = __webpack_require__(206);
16345 var ITERATOR = __webpack_require__(4)('iterator');
16346 var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
16347 var FF_ITERATOR = '@@iterator';
16348 var KEYS = 'keys';
16349 var VALUES = 'values';
16351 var returnThis = function () { return this; };
16353 module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
16354   $iterCreate(Constructor, NAME, next);
16355   var getMethod = function (kind) {
16356     if (!BUGGY && kind in proto) return proto[kind];
16357     switch (kind) {
16358       case KEYS: return function keys() { return new Constructor(this, kind); };
16359       case VALUES: return function values() { return new Constructor(this, kind); };
16360     } return function entries() { return new Constructor(this, kind); };
16361   };
16362   var TAG = NAME + ' Iterator';
16363   var DEF_VALUES = DEFAULT == VALUES;
16364   var VALUES_BUG = false;
16365   var proto = Base.prototype;
16366   var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
16367   var $default = (!BUGGY && $native) || getMethod(DEFAULT);
16368   var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
16369   var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
16370   var methods, key, IteratorPrototype;
16371   // Fix native
16372   if ($anyNative) {
16373     IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
16374     if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
16375       // Set @@toStringTag to native iterators
16376       setToStringTag(IteratorPrototype, TAG, true);
16377       // fix for some old engines
16378       if (!LIBRARY && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);
16379     }
16380   }
16381   // fix Array#{values, @@iterator}.name in V8 / FF
16382   if (DEF_VALUES && $native && $native.name !== VALUES) {
16383     VALUES_BUG = true;
16384     $default = function values() { return $native.call(this); };
16385   }
16386   // Define iterator
16387   if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
16388     hide(proto, ITERATOR, $default);
16389   }
16390   // Plug for library
16391   Iterators[NAME] = $default;
16392   Iterators[TAG] = returnThis;
16393   if (DEFAULT) {
16394     methods = {
16395       values: DEF_VALUES ? $default : getMethod(VALUES),
16396       keys: IS_SET ? $default : getMethod(KEYS),
16397       entries: $entries
16398     };
16399     if (FORCED) for (key in methods) {
16400       if (!(key in proto)) redefine(proto, key, methods[key]);
16401     } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
16402   }
16403   return methods;
16407 /***/ }),
16408 /* 62 */
16409 /***/ (function(module, exports) {
16411 module.exports = true;
16414 /***/ }),
16415 /* 63 */
16416 /***/ (function(module, exports) {
16418 // 7.1.4 ToInteger
16419 var ceil = Math.ceil;
16420 var floor = Math.floor;
16421 module.exports = function (it) {
16422   return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
16426 /***/ }),
16427 /* 64 */
16428 /***/ (function(module, exports, __webpack_require__) {
16430 var shared = __webpack_require__(65)('keys');
16431 var uid = __webpack_require__(38);
16432 module.exports = function (key) {
16433   return shared[key] || (shared[key] = uid(key));
16437 /***/ }),
16438 /* 65 */
16439 /***/ (function(module, exports, __webpack_require__) {
16441 var global = __webpack_require__(10);
16442 var SHARED = '__core-js_shared__';
16443 var store = global[SHARED] || (global[SHARED] = {});
16444 module.exports = function (key) {
16445   return store[key] || (store[key] = {});
16449 /***/ }),
16450 /* 66 */
16451 /***/ (function(module, exports) {
16453 // IE 8- don't enum bug keys
16454 module.exports = (
16455   'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
16456 ).split(',');
16459 /***/ }),
16460 /* 67 */
16461 /***/ (function(module, exports, __webpack_require__) {
16463 var classof = __webpack_require__(68);
16464 var ITERATOR = __webpack_require__(4)('iterator');
16465 var Iterators = __webpack_require__(23);
16466 module.exports = __webpack_require__(2).getIteratorMethod = function (it) {
16467   if (it != undefined) return it[ITERATOR]
16468     || it['@@iterator']
16469     || Iterators[classof(it)];
16473 /***/ }),
16474 /* 68 */
16475 /***/ (function(module, exports, __webpack_require__) {
16477 // getting tag from 19.1.3.6 Object.prototype.toString()
16478 var cof = __webpack_require__(55);
16479 var TAG = __webpack_require__(4)('toStringTag');
16480 // ES3 wrong here
16481 var ARG = cof(function () { return arguments; }()) == 'Arguments';
16483 // fallback for IE11 Script Access Denied error
16484 var tryGet = function (it, key) {
16485   try {
16486     return it[key];
16487   } catch (e) { /* empty */ }
16490 module.exports = function (it) {
16491   var O, T, B;
16492   return it === undefined ? 'Undefined' : it === null ? 'Null'
16493     // @@toStringTag case
16494     : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
16495     // builtinTag case
16496     : ARG ? cof(O)
16497     // ES3 arguments fallback
16498     : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
16502 /***/ }),
16503 /* 69 */
16504 /***/ (function(module, exports, __webpack_require__) {
16506 "use strict";
16509 exports.__esModule = true;
16511 var _iterator = __webpack_require__(103);
16513 var _iterator2 = _interopRequireDefault(_iterator);
16515 var _symbol = __webpack_require__(216);
16517 var _symbol2 = _interopRequireDefault(_symbol);
16519 var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };
16521 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16523 exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
16524   return typeof obj === "undefined" ? "undefined" : _typeof(obj);
16525 } : function (obj) {
16526   return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
16529 /***/ }),
16530 /* 70 */
16531 /***/ (function(module, exports, __webpack_require__) {
16533 exports.f = __webpack_require__(4);
16536 /***/ }),
16537 /* 71 */
16538 /***/ (function(module, exports, __webpack_require__) {
16540 var global = __webpack_require__(10);
16541 var core = __webpack_require__(2);
16542 var LIBRARY = __webpack_require__(62);
16543 var wksExt = __webpack_require__(70);
16544 var defineProperty = __webpack_require__(6).f;
16545 module.exports = function (name) {
16546   var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
16547   if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
16551 /***/ }),
16552 /* 72 */
16553 /***/ (function(module, exports) {
16555 exports.f = Object.getOwnPropertySymbols;
16558 /***/ }),
16559 /* 73 */
16560 /***/ (function(module, exports) {
16564 /***/ }),
16565 /* 74 */
16566 /***/ (function(module, exports, __webpack_require__) {
16568 module.exports = { "default": __webpack_require__(223), __esModule: true };
16570 /***/ }),
16571 /* 75 */
16572 /***/ (function(module, exports, __webpack_require__) {
16574 var isObject = __webpack_require__(9);
16575 module.exports = function (it, TYPE) {
16576   if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
16577   return it;
16581 /***/ }),
16582 /* 76 */
16583 /***/ (function(module, exports) {
16585 var toString = {}.toString;
16587 module.exports = Array.isArray || function (arr) {
16588   return toString.call(arr) == '[object Array]';
16592 /***/ }),
16593 /* 77 */
16594 /***/ (function(module, exports, __webpack_require__) {
16596 "use strict";
16599 function TraversalTracker() {
16600         this.events = {};
16603 TraversalTracker.prototype.startTracking = function (event, callback) {
16604         var callbacks = this.events[event] || (this.events[event] = []);
16606         if (callbacks.indexOf(callback) < 0) {
16607                 callbacks.push(callback);
16608         }
16611 TraversalTracker.prototype.stopTracking = function (event, callback) {
16612         var callbacks = this.events[event];
16614         if (!callbacks) {
16615                 return;
16616         }
16618         var index = callbacks.indexOf(callback);
16619         if (index >= 0) {
16620                 callbacks.splice(index, 1);
16621         }
16624 TraversalTracker.prototype.emit = function (event) {
16625         var args = Array.prototype.slice.call(arguments, 1);
16626         var callbacks = this.events[event];
16628         if (!callbacks) {
16629                 return;
16630         }
16632         callbacks.forEach(function (callback) {
16633                 callback.apply(this, args);
16634         });
16637 TraversalTracker.prototype.auto = function (event, callback, innerFunction) {
16638         this.startTracking(event, callback);
16639         innerFunction();
16640         this.stopTracking(event, callback);
16643 module.exports = TraversalTracker;
16646 /***/ }),
16647 /* 78 */
16648 /***/ (function(module, exports, __webpack_require__) {
16650 // Generated by CoffeeScript 1.7.1
16651 (function() {
16652   var AI, AL, BA, BK, CB, CI_BRK, CJ, CP_BRK, CR, DI_BRK, ID, IN_BRK, LF, LineBreaker, NL, NS, PR_BRK, SA, SG, SP, UnicodeTrie, WJ, XX, base64, characterClasses, classTrie, data, fs, pairTable, _ref, _ref1;
16654   UnicodeTrie = __webpack_require__(43);
16658   base64 = __webpack_require__(131);
16660   _ref = __webpack_require__(132), BK = _ref.BK, CR = _ref.CR, LF = _ref.LF, NL = _ref.NL, CB = _ref.CB, BA = _ref.BA, SP = _ref.SP, WJ = _ref.WJ, SP = _ref.SP, BK = _ref.BK, LF = _ref.LF, NL = _ref.NL, AI = _ref.AI, AL = _ref.AL, SA = _ref.SA, SG = _ref.SG, XX = _ref.XX, CJ = _ref.CJ, ID = _ref.ID, NS = _ref.NS, characterClasses = _ref.characterClasses;
16662   _ref1 = __webpack_require__(133), DI_BRK = _ref1.DI_BRK, IN_BRK = _ref1.IN_BRK, CI_BRK = _ref1.CI_BRK, CP_BRK = _ref1.CP_BRK, PR_BRK = _ref1.PR_BRK, pairTable = _ref1.pairTable;
16664   data = base64.toByteArray("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");
16666   classTrie = new UnicodeTrie(data);
16668   LineBreaker = (function() {
16669     var Break, mapClass, mapFirst;
16671     function LineBreaker(string) {
16672       this.string = string;
16673       this.pos = 0;
16674       this.lastPos = 0;
16675       this.curClass = null;
16676       this.nextClass = null;
16677     }
16679     LineBreaker.prototype.nextCodePoint = function() {
16680       var code, next;
16681       code = this.string.charCodeAt(this.pos++);
16682       next = this.string.charCodeAt(this.pos);
16683       if ((0xd800 <= code && code <= 0xdbff) && (0xdc00 <= next && next <= 0xdfff)) {
16684         this.pos++;
16685         return ((code - 0xd800) * 0x400) + (next - 0xdc00) + 0x10000;
16686       }
16687       return code;
16688     };
16690     mapClass = function(c) {
16691       switch (c) {
16692         case AI:
16693           return AL;
16694         case SA:
16695         case SG:
16696         case XX:
16697           return AL;
16698         case CJ:
16699           return NS;
16700         default:
16701           return c;
16702       }
16703     };
16705     mapFirst = function(c) {
16706       switch (c) {
16707         case LF:
16708         case NL:
16709           return BK;
16710         case CB:
16711           return BA;
16712         case SP:
16713           return WJ;
16714         default:
16715           return c;
16716       }
16717     };
16719     LineBreaker.prototype.nextCharClass = function(first) {
16720       if (first == null) {
16721         first = false;
16722       }
16723       return mapClass(classTrie.get(this.nextCodePoint()));
16724     };
16726     Break = (function() {
16727       function Break(position, required) {
16728         this.position = position;
16729         this.required = required != null ? required : false;
16730       }
16732       return Break;
16734     })();
16736     LineBreaker.prototype.nextBreak = function() {
16737       var cur, lastClass, shouldBreak;
16738       if (this.curClass == null) {
16739         this.curClass = mapFirst(this.nextCharClass());
16740       }
16741       while (this.pos < this.string.length) {
16742         this.lastPos = this.pos;
16743         lastClass = this.nextClass;
16744         this.nextClass = this.nextCharClass();
16745         if (this.curClass === BK || (this.curClass === CR && this.nextClass !== LF)) {
16746           this.curClass = mapFirst(mapClass(this.nextClass));
16747           return new Break(this.lastPos, true);
16748         }
16749         cur = (function() {
16750           switch (this.nextClass) {
16751             case SP:
16752               return this.curClass;
16753             case BK:
16754             case LF:
16755             case NL:
16756               return BK;
16757             case CR:
16758               return CR;
16759             case CB:
16760               return BA;
16761           }
16762         }).call(this);
16763         if (cur != null) {
16764           this.curClass = cur;
16765           if (this.nextClass === CB) {
16766             return new Break(this.lastPos);
16767           }
16768           continue;
16769         }
16770         shouldBreak = false;
16771         switch (pairTable[this.curClass][this.nextClass]) {
16772           case DI_BRK:
16773             shouldBreak = true;
16774             break;
16775           case IN_BRK:
16776             shouldBreak = lastClass === SP;
16777             break;
16778           case CI_BRK:
16779             shouldBreak = lastClass === SP;
16780             if (!shouldBreak) {
16781               continue;
16782             }
16783             break;
16784           case CP_BRK:
16785             if (lastClass !== SP) {
16786               continue;
16787             }
16788         }
16789         this.curClass = this.nextClass;
16790         if (shouldBreak) {
16791           return new Break(this.lastPos);
16792         }
16793       }
16794       if (this.pos >= this.string.length) {
16795         if (this.lastPos < this.string.length) {
16796           this.lastPos = this.string.length;
16797           return new Break(this.string.length);
16798         } else {
16799           return null;
16800         }
16801       }
16802     };
16804     return LineBreaker;
16806   })();
16808   module.exports = LineBreaker;
16810 }).call(this);
16813 /***/ }),
16814 /* 79 */
16815 /***/ (function(module, exports) {
16817 var TINF_OK = 0;
16818 var TINF_DATA_ERROR = -3;
16820 function Tree() {
16821   this.table = new Uint16Array(16);   /* table of code length counts */
16822   this.trans = new Uint16Array(288);  /* code -> symbol translation table */
16825 function Data(source, dest) {
16826   this.source = source;
16827   this.sourceIndex = 0;
16828   this.tag = 0;
16829   this.bitcount = 0;
16831   this.dest = dest;
16832   this.destLen = 0;
16834   this.ltree = new Tree();  /* dynamic length/symbol tree */
16835   this.dtree = new Tree();  /* dynamic distance tree */
16838 /* --------------------------------------------------- *
16839  * -- uninitialized global data (static structures) -- *
16840  * --------------------------------------------------- */
16842 var sltree = new Tree();
16843 var sdtree = new Tree();
16845 /* extra bits and base tables for length codes */
16846 var length_bits = new Uint8Array(30);
16847 var length_base = new Uint16Array(30);
16849 /* extra bits and base tables for distance codes */
16850 var dist_bits = new Uint8Array(30);
16851 var dist_base = new Uint16Array(30);
16853 /* special ordering of code length codes */
16854 var clcidx = new Uint8Array([
16855   16, 17, 18, 0, 8, 7, 9, 6,
16856   10, 5, 11, 4, 12, 3, 13, 2,
16857   14, 1, 15
16860 /* used by tinf_decode_trees, avoids allocations every call */
16861 var code_tree = new Tree();
16862 var lengths = new Uint8Array(288 + 32);
16864 /* ----------------------- *
16865  * -- utility functions -- *
16866  * ----------------------- */
16868 /* build extra bits and base tables */
16869 function tinf_build_bits_base(bits, base, delta, first) {
16870   var i, sum;
16872   /* build bits table */
16873   for (i = 0; i < delta; ++i) bits[i] = 0;
16874   for (i = 0; i < 30 - delta; ++i) bits[i + delta] = i / delta | 0;
16876   /* build base table */
16877   for (sum = first, i = 0; i < 30; ++i) {
16878     base[i] = sum;
16879     sum += 1 << bits[i];
16880   }
16883 /* build the fixed huffman trees */
16884 function tinf_build_fixed_trees(lt, dt) {
16885   var i;
16887   /* build fixed length tree */
16888   for (i = 0; i < 7; ++i) lt.table[i] = 0;
16890   lt.table[7] = 24;
16891   lt.table[8] = 152;
16892   lt.table[9] = 112;
16894   for (i = 0; i < 24; ++i) lt.trans[i] = 256 + i;
16895   for (i = 0; i < 144; ++i) lt.trans[24 + i] = i;
16896   for (i = 0; i < 8; ++i) lt.trans[24 + 144 + i] = 280 + i;
16897   for (i = 0; i < 112; ++i) lt.trans[24 + 144 + 8 + i] = 144 + i;
16899   /* build fixed distance tree */
16900   for (i = 0; i < 5; ++i) dt.table[i] = 0;
16902   dt.table[5] = 32;
16904   for (i = 0; i < 32; ++i) dt.trans[i] = i;
16907 /* given an array of code lengths, build a tree */
16908 var offs = new Uint16Array(16);
16910 function tinf_build_tree(t, lengths, off, num) {
16911   var i, sum;
16913   /* clear code length count table */
16914   for (i = 0; i < 16; ++i) t.table[i] = 0;
16916   /* scan symbol lengths, and sum code length counts */
16917   for (i = 0; i < num; ++i) t.table[lengths[off + i]]++;
16919   t.table[0] = 0;
16921   /* compute offset table for distribution sort */
16922   for (sum = 0, i = 0; i < 16; ++i) {
16923     offs[i] = sum;
16924     sum += t.table[i];
16925   }
16927   /* create code->symbol translation table (symbols sorted by code) */
16928   for (i = 0; i < num; ++i) {
16929     if (lengths[off + i]) t.trans[offs[lengths[off + i]]++] = i;
16930   }
16933 /* ---------------------- *
16934  * -- decode functions -- *
16935  * ---------------------- */
16937 /* get one bit from source stream */
16938 function tinf_getbit(d) {
16939   /* check if tag is empty */
16940   if (!d.bitcount--) {
16941     /* load next tag */
16942     d.tag = d.source[d.sourceIndex++];
16943     d.bitcount = 7;
16944   }
16946   /* shift bit out of tag */
16947   var bit = d.tag & 1;
16948   d.tag >>>= 1;
16950   return bit;
16953 /* read a num bit value from a stream and add base */
16954 function tinf_read_bits(d, num, base) {
16955   if (!num)
16956     return base;
16958   while (d.bitcount < 24) {
16959     d.tag |= d.source[d.sourceIndex++] << d.bitcount;
16960     d.bitcount += 8;
16961   }
16963   var val = d.tag & (0xffff >>> (16 - num));
16964   d.tag >>>= num;
16965   d.bitcount -= num;
16966   return val + base;
16969 /* given a data stream and a tree, decode a symbol */
16970 function tinf_decode_symbol(d, t) {
16971   while (d.bitcount < 24) {
16972     d.tag |= d.source[d.sourceIndex++] << d.bitcount;
16973     d.bitcount += 8;
16974   }
16976   var sum = 0, cur = 0, len = 0;
16977   var tag = d.tag;
16979   /* get more bits while code value is above sum */
16980   do {
16981     cur = 2 * cur + (tag & 1);
16982     tag >>>= 1;
16983     ++len;
16985     sum += t.table[len];
16986     cur -= t.table[len];
16987   } while (cur >= 0);
16989   d.tag = tag;
16990   d.bitcount -= len;
16992   return t.trans[sum + cur];
16995 /* given a data stream, decode dynamic trees from it */
16996 function tinf_decode_trees(d, lt, dt) {
16997   var hlit, hdist, hclen;
16998   var i, num, length;
17000   /* get 5 bits HLIT (257-286) */
17001   hlit = tinf_read_bits(d, 5, 257);
17003   /* get 5 bits HDIST (1-32) */
17004   hdist = tinf_read_bits(d, 5, 1);
17006   /* get 4 bits HCLEN (4-19) */
17007   hclen = tinf_read_bits(d, 4, 4);
17009   for (i = 0; i < 19; ++i) lengths[i] = 0;
17011   /* read code lengths for code length alphabet */
17012   for (i = 0; i < hclen; ++i) {
17013     /* get 3 bits code length (0-7) */
17014     var clen = tinf_read_bits(d, 3, 0);
17015     lengths[clcidx[i]] = clen;
17016   }
17018   /* build code length tree */
17019   tinf_build_tree(code_tree, lengths, 0, 19);
17021   /* decode code lengths for the dynamic trees */
17022   for (num = 0; num < hlit + hdist;) {
17023     var sym = tinf_decode_symbol(d, code_tree);
17025     switch (sym) {
17026       case 16:
17027         /* copy previous code length 3-6 times (read 2 bits) */
17028         var prev = lengths[num - 1];
17029         for (length = tinf_read_bits(d, 2, 3); length; --length) {
17030           lengths[num++] = prev;
17031         }
17032         break;
17033       case 17:
17034         /* repeat code length 0 for 3-10 times (read 3 bits) */
17035         for (length = tinf_read_bits(d, 3, 3); length; --length) {
17036           lengths[num++] = 0;
17037         }
17038         break;
17039       case 18:
17040         /* repeat code length 0 for 11-138 times (read 7 bits) */
17041         for (length = tinf_read_bits(d, 7, 11); length; --length) {
17042           lengths[num++] = 0;
17043         }
17044         break;
17045       default:
17046         /* values 0-15 represent the actual code lengths */
17047         lengths[num++] = sym;
17048         break;
17049     }
17050   }
17052   /* build dynamic trees */
17053   tinf_build_tree(lt, lengths, 0, hlit);
17054   tinf_build_tree(dt, lengths, hlit, hdist);
17057 /* ----------------------------- *
17058  * -- block inflate functions -- *
17059  * ----------------------------- */
17061 /* given a stream and two trees, inflate a block of data */
17062 function tinf_inflate_block_data(d, lt, dt) {
17063   while (1) {
17064     var sym = tinf_decode_symbol(d, lt);
17066     /* check for end of block */
17067     if (sym === 256) {
17068       return TINF_OK;
17069     }
17071     if (sym < 256) {
17072       d.dest[d.destLen++] = sym;
17073     } else {
17074       var length, dist, offs;
17075       var i;
17077       sym -= 257;
17079       /* possibly get more bits from length code */
17080       length = tinf_read_bits(d, length_bits[sym], length_base[sym]);
17082       dist = tinf_decode_symbol(d, dt);
17084       /* possibly get more bits from distance code */
17085       offs = d.destLen - tinf_read_bits(d, dist_bits[dist], dist_base[dist]);
17087       /* copy match */
17088       for (i = offs; i < offs + length; ++i) {
17089         d.dest[d.destLen++] = d.dest[i];
17090       }
17091     }
17092   }
17095 /* inflate an uncompressed block of data */
17096 function tinf_inflate_uncompressed_block(d) {
17097   var length, invlength;
17098   var i;
17100   /* unread from bitbuffer */
17101   while (d.bitcount > 8) {
17102     d.sourceIndex--;
17103     d.bitcount -= 8;
17104   }
17106   /* get length */
17107   length = d.source[d.sourceIndex + 1];
17108   length = 256 * length + d.source[d.sourceIndex];
17110   /* get one's complement of length */
17111   invlength = d.source[d.sourceIndex + 3];
17112   invlength = 256 * invlength + d.source[d.sourceIndex + 2];
17114   /* check length */
17115   if (length !== (~invlength & 0x0000ffff))
17116     return TINF_DATA_ERROR;
17118   d.sourceIndex += 4;
17120   /* copy block */
17121   for (i = length; i; --i)
17122     d.dest[d.destLen++] = d.source[d.sourceIndex++];
17124   /* make sure we start next block on a byte boundary */
17125   d.bitcount = 0;
17127   return TINF_OK;
17130 /* inflate stream from source to dest */
17131 function tinf_uncompress(source, dest) {
17132   var d = new Data(source, dest);
17133   var bfinal, btype, res;
17135   do {
17136     /* read final block flag */
17137     bfinal = tinf_getbit(d);
17139     /* read block type (2 bits) */
17140     btype = tinf_read_bits(d, 2, 0);
17142     /* decompress block */
17143     switch (btype) {
17144       case 0:
17145         /* decompress uncompressed block */
17146         res = tinf_inflate_uncompressed_block(d);
17147         break;
17148       case 1:
17149         /* decompress block with fixed huffman trees */
17150         res = tinf_inflate_block_data(d, sltree, sdtree);
17151         break;
17152       case 2:
17153         /* decompress block with dynamic huffman trees */
17154         tinf_decode_trees(d, d.ltree, d.dtree);
17155         res = tinf_inflate_block_data(d, d.ltree, d.dtree);
17156         break;
17157       default:
17158         res = TINF_DATA_ERROR;
17159     }
17161     if (res !== TINF_OK)
17162       throw new Error('Data error');
17164   } while (!bfinal);
17166   if (d.destLen < d.dest.length) {
17167     if (typeof d.dest.slice === 'function')
17168       return d.dest.slice(0, d.destLen);
17169     else
17170       return d.dest.subarray(0, d.destLen);
17171   }
17173   return d.dest;
17176 /* -------------------- *
17177  * -- initialization -- *
17178  * -------------------- */
17180 /* build fixed huffman trees */
17181 tinf_build_fixed_trees(sltree, sdtree);
17183 /* build extra bits and base tables */
17184 tinf_build_bits_base(length_bits, length_base, 4, 3);
17185 tinf_build_bits_base(dist_bits, dist_base, 2, 1);
17187 /* fix a special case */
17188 length_bits[28] = 0;
17189 length_base[28] = 258;
17191 module.exports = tinf_uncompress;
17194 /***/ }),
17195 /* 80 */
17196 /***/ (function(module, exports, __webpack_require__) {
17198 "use strict";
17201 var isString = __webpack_require__(0).isString;
17202 var isArray = __webpack_require__(0).isArray;
17203 var isUndefined = __webpack_require__(0).isUndefined;
17204 var isNull = __webpack_require__(0).isNull;
17207  * Creates an instance of StyleContextStack used for style inheritance and style overrides
17209  * @constructor
17210  * @this {StyleContextStack}
17211  * @param {Object} named styles dictionary
17212  * @param {Object} optional default style definition
17213  */
17214 function StyleContextStack(styleDictionary, defaultStyle) {
17215         this.defaultStyle = defaultStyle || {};
17216         this.styleDictionary = styleDictionary;
17217         this.styleOverrides = [];
17221  * Creates cloned version of current stack
17222  * @return {StyleContextStack} current stack snapshot
17223  */
17224 StyleContextStack.prototype.clone = function () {
17225         var stack = new StyleContextStack(this.styleDictionary, this.defaultStyle);
17227         this.styleOverrides.forEach(function (item) {
17228                 stack.styleOverrides.push(item);
17229         });
17231         return stack;
17235  * Pushes style-name or style-overrides-object onto the stack for future evaluation
17237  * @param {String|Object} styleNameOrOverride style-name (referring to styleDictionary) or
17238  *                                            a new dictionary defining overriding properties
17239  */
17240 StyleContextStack.prototype.push = function (styleNameOrOverride) {
17241         this.styleOverrides.push(styleNameOrOverride);
17245  * Removes last style-name or style-overrides-object from the stack
17247  * @param {Number} howMany - optional number of elements to be popped (if not specified,
17248  *                           one element will be removed from the stack)
17249  */
17250 StyleContextStack.prototype.pop = function (howMany) {
17251         howMany = howMany || 1;
17253         while (howMany-- > 0) {
17254                 this.styleOverrides.pop();
17255         }
17259  * Creates a set of named styles or/and a style-overrides-object based on the item,
17260  * pushes those elements onto the stack for future evaluation and returns the number
17261  * of elements pushed, so they can be easily poped then.
17263  * @param {Object} item - an object with optional style property and/or style overrides
17264  * @return the number of items pushed onto the stack
17265  */
17266 StyleContextStack.prototype.autopush = function (item) {
17267         if (isString(item)) {
17268                 return 0;
17269         }
17271         var styleNames = [];
17273         if (item.style) {
17274                 if (isArray(item.style)) {
17275                         styleNames = item.style;
17276                 } else {
17277                         styleNames = [item.style];
17278                 }
17279         }
17281         for (var i = 0, l = styleNames.length; i < l; i++) {
17282                 this.push(styleNames[i]);
17283         }
17285         var styleProperties = [
17286                 'font',
17287                 'fontSize',
17288                 'fontFeatures',
17289                 'bold',
17290                 'italics',
17291                 'alignment',
17292                 'color',
17293                 'columnGap',
17294                 'fillColor',
17295                 'decoration',
17296                 'decorationStyle',
17297                 'decorationColor',
17298                 'background',
17299                 'lineHeight',
17300                 'characterSpacing',
17301                 'noWrap',
17302                 'markerColor',
17303                 'leadingIndent'
17304                         //'tableCellPadding'
17305                         // 'cellBorder',
17306                         // 'headerCellBorder',
17307                         // 'oddRowCellBorder',
17308                         // 'evenRowCellBorder',
17309                         // 'tableBorder'
17310         ];
17311         var styleOverrideObject = {};
17312         var pushStyleOverrideObject = false;
17314         styleProperties.forEach(function (key) {
17315                 if (!isUndefined(item[key]) && !isNull(item[key])) {
17316                         styleOverrideObject[key] = item[key];
17317                         pushStyleOverrideObject = true;
17318                 }
17319         });
17321         if (pushStyleOverrideObject) {
17322                 this.push(styleOverrideObject);
17323         }
17325         return styleNames.length + (pushStyleOverrideObject ? 1 : 0);
17329  * Automatically pushes elements onto the stack, using autopush based on item,
17330  * executes callback and then pops elements back. Returns value returned by callback
17332  * @param  {Object}   item - an object with optional style property and/or style overrides
17333  * @param  {Function} function to be called between autopush and pop
17334  * @return {Object} value returned by callback
17335  */
17336 StyleContextStack.prototype.auto = function (item, callback) {
17337         var pushedItems = this.autopush(item);
17338         var result = callback();
17340         if (pushedItems > 0) {
17341                 this.pop(pushedItems);
17342         }
17344         return result;
17348  * Evaluates stack and returns value of a named property
17350  * @param {String} property - property name
17351  * @return property value or null if not found
17352  */
17353 StyleContextStack.prototype.getProperty = function (property) {
17354         if (this.styleOverrides) {
17355                 for (var i = this.styleOverrides.length - 1; i >= 0; i--) {
17356                         var item = this.styleOverrides[i];
17358                         if (isString(item)) {
17359                                 // named-style-override
17360                                 var style = this.styleDictionary[item];
17361                                 if (style && !isUndefined(style[property]) && !isNull(style[property])) {
17362                                         return style[property];
17363                                 }
17364                         } else if (!isUndefined(item[property]) && !isNull(item[property])) {
17365                                 // style-overrides-object
17366                                 return item[property];
17367                         }
17368                 }
17369         }
17371         return this.defaultStyle && this.defaultStyle[property];
17374 module.exports = StyleContextStack;
17377 /***/ }),
17378 /* 81 */
17379 /***/ (function(module, exports, __webpack_require__) {
17381 "use strict";
17384 var TraversalTracker = __webpack_require__(77);
17385 var isString = __webpack_require__(0).isString;
17388  * Creates an instance of DocumentContext - a store for current x, y positions and available width/height.
17389  * It facilitates column divisions and vertical sync
17390  */
17391 function DocumentContext(pageSize, pageMargins) {
17392         this.pages = [];
17394         this.pageMargins = pageMargins;
17396         this.x = pageMargins.left;
17397         this.availableWidth = pageSize.width - pageMargins.left - pageMargins.right;
17398         this.availableHeight = 0;
17399         this.page = -1;
17401         this.snapshots = [];
17403         this.endingCell = null;
17405         this.tracker = new TraversalTracker();
17407         this.addPage(pageSize);
17409         this.hasBackground = false;
17412 DocumentContext.prototype.beginColumnGroup = function () {
17413         this.snapshots.push({
17414                 x: this.x,
17415                 y: this.y,
17416                 availableHeight: this.availableHeight,
17417                 availableWidth: this.availableWidth,
17418                 page: this.page,
17419                 bottomMost: {
17420                         x: this.x,
17421                         y: this.y,
17422                         availableHeight: this.availableHeight,
17423                         availableWidth: this.availableWidth,
17424                         page: this.page
17425                 },
17426                 endingCell: this.endingCell,
17427                 lastColumnWidth: this.lastColumnWidth
17428         });
17430         this.lastColumnWidth = 0;
17433 DocumentContext.prototype.beginColumn = function (width, offset, endingCell) {
17434         var saved = this.snapshots[this.snapshots.length - 1];
17436         this.calculateBottomMost(saved);
17438         this.endingCell = endingCell;
17439         this.page = saved.page;
17440         this.x = this.x + this.lastColumnWidth + (offset || 0);
17441         this.y = saved.y;
17442         this.availableWidth = width;    //saved.availableWidth - offset;
17443         this.availableHeight = saved.availableHeight;
17445         this.lastColumnWidth = width;
17448 DocumentContext.prototype.calculateBottomMost = function (destContext) {
17449         if (this.endingCell) {
17450                 this.saveContextInEndingCell(this.endingCell);
17451                 this.endingCell = null;
17452         } else {
17453                 destContext.bottomMost = bottomMostContext(this, destContext.bottomMost);
17454         }
17457 DocumentContext.prototype.markEnding = function (endingCell) {
17458         this.page = endingCell._columnEndingContext.page;
17459         this.x = endingCell._columnEndingContext.x;
17460         this.y = endingCell._columnEndingContext.y;
17461         this.availableWidth = endingCell._columnEndingContext.availableWidth;
17462         this.availableHeight = endingCell._columnEndingContext.availableHeight;
17463         this.lastColumnWidth = endingCell._columnEndingContext.lastColumnWidth;
17466 DocumentContext.prototype.saveContextInEndingCell = function (endingCell) {
17467         endingCell._columnEndingContext = {
17468                 page: this.page,
17469                 x: this.x,
17470                 y: this.y,
17471                 availableHeight: this.availableHeight,
17472                 availableWidth: this.availableWidth,
17473                 lastColumnWidth: this.lastColumnWidth
17474         };
17477 DocumentContext.prototype.completeColumnGroup = function (height) {
17478         var saved = this.snapshots.pop();
17480         this.calculateBottomMost(saved);
17482         this.endingCell = null;
17483         this.x = saved.x;
17485         var y = saved.bottomMost.y;
17486         if (height) {
17487                 if (saved.page === saved.bottomMost.page) {
17488                         if ((saved.y + height) > y) {
17489                                 y = saved.y + height;
17490                         }
17491                 } else {
17492                         y += height;
17493                 }
17494         }
17496         this.y = y;
17497         this.page = saved.bottomMost.page;
17498         this.availableWidth = saved.availableWidth;
17499         this.availableHeight = saved.bottomMost.availableHeight;
17500         if (height) {
17501                 this.availableHeight -= (y - saved.bottomMost.y);
17502         }
17503         this.lastColumnWidth = saved.lastColumnWidth;
17506 DocumentContext.prototype.addMargin = function (left, right) {
17507         this.x += left;
17508         this.availableWidth -= left + (right || 0);
17511 DocumentContext.prototype.moveDown = function (offset) {
17512         this.y += offset;
17513         this.availableHeight -= offset;
17515         return this.availableHeight > 0;
17518 DocumentContext.prototype.initializePage = function () {
17519         this.y = this.pageMargins.top;
17520         this.availableHeight = this.getCurrentPage().pageSize.height - this.pageMargins.top - this.pageMargins.bottom;
17521         this.pageSnapshot().availableWidth = this.getCurrentPage().pageSize.width - this.pageMargins.left - this.pageMargins.right;
17524 DocumentContext.prototype.pageSnapshot = function () {
17525         if (this.snapshots[0]) {
17526                 return this.snapshots[0];
17527         } else {
17528                 return this;
17529         }
17532 DocumentContext.prototype.moveTo = function (x, y) {
17533         if (x !== undefined && x !== null) {
17534                 this.x = x;
17535                 this.availableWidth = this.getCurrentPage().pageSize.width - this.x - this.pageMargins.right;
17536         }
17537         if (y !== undefined && y !== null) {
17538                 this.y = y;
17539                 this.availableHeight = this.getCurrentPage().pageSize.height - this.y - this.pageMargins.bottom;
17540         }
17543 DocumentContext.prototype.beginDetachedBlock = function () {
17544         this.snapshots.push({
17545                 x: this.x,
17546                 y: this.y,
17547                 availableHeight: this.availableHeight,
17548                 availableWidth: this.availableWidth,
17549                 page: this.page,
17550                 endingCell: this.endingCell,
17551                 lastColumnWidth: this.lastColumnWidth
17552         });
17555 DocumentContext.prototype.endDetachedBlock = function () {
17556         var saved = this.snapshots.pop();
17558         this.x = saved.x;
17559         this.y = saved.y;
17560         this.availableWidth = saved.availableWidth;
17561         this.availableHeight = saved.availableHeight;
17562         this.page = saved.page;
17563         this.endingCell = saved.endingCell;
17564         this.lastColumnWidth = saved.lastColumnWidth;
17567 function pageOrientation(pageOrientationString, currentPageOrientation) {
17568         if (pageOrientationString === undefined) {
17569                 return currentPageOrientation;
17570         } else if (isString(pageOrientationString) && (pageOrientationString.toLowerCase() === 'landscape')) {
17571                 return 'landscape';
17572         } else {
17573                 return 'portrait';
17574         }
17577 var getPageSize = function (currentPage, newPageOrientation) {
17579         newPageOrientation = pageOrientation(newPageOrientation, currentPage.pageSize.orientation);
17581         if (newPageOrientation !== currentPage.pageSize.orientation) {
17582                 return {
17583                         orientation: newPageOrientation,
17584                         width: currentPage.pageSize.height,
17585                         height: currentPage.pageSize.width
17586                 };
17587         } else {
17588                 return {
17589                         orientation: currentPage.pageSize.orientation,
17590                         width: currentPage.pageSize.width,
17591                         height: currentPage.pageSize.height
17592                 };
17593         }
17598 DocumentContext.prototype.moveToNextPage = function (pageOrientation) {
17599         var nextPageIndex = this.page + 1;
17601         var prevPage = this.page;
17602         var prevY = this.y;
17604         var createNewPage = nextPageIndex >= this.pages.length;
17605         if (createNewPage) {
17606                 var currentAvailableWidth = this.availableWidth;
17607                 var currentPageOrientation = this.getCurrentPage().pageSize.orientation;
17609                 var pageSize = getPageSize(this.getCurrentPage(), pageOrientation);
17610                 this.addPage(pageSize);
17612                 if (currentPageOrientation === pageSize.orientation) {
17613                         this.availableWidth = currentAvailableWidth;
17614                 }
17615         } else {
17616                 this.page = nextPageIndex;
17617                 this.initializePage();
17618         }
17620         return {
17621                 newPageCreated: createNewPage,
17622                 prevPage: prevPage,
17623                 prevY: prevY,
17624                 y: this.y
17625         };
17629 DocumentContext.prototype.addPage = function (pageSize) {
17630         var page = {items: [], pageSize: pageSize};
17631         this.pages.push(page);
17632         this.page = this.pages.length - 1;
17633         this.initializePage();
17635         this.tracker.emit('pageAdded');
17637         return page;
17640 DocumentContext.prototype.getCurrentPage = function () {
17641         if (this.page < 0 || this.page >= this.pages.length) {
17642                 return null;
17643         }
17645         return this.pages[this.page];
17648 DocumentContext.prototype.getCurrentPosition = function () {
17649         var pageSize = this.getCurrentPage().pageSize;
17650         var innerHeight = pageSize.height - this.pageMargins.top - this.pageMargins.bottom;
17651         var innerWidth = pageSize.width - this.pageMargins.left - this.pageMargins.right;
17653         return {
17654                 pageNumber: this.page + 1,
17655                 pageOrientation: pageSize.orientation,
17656                 pageInnerHeight: innerHeight,
17657                 pageInnerWidth: innerWidth,
17658                 left: this.x,
17659                 top: this.y,
17660                 verticalRatio: ((this.y - this.pageMargins.top) / innerHeight),
17661                 horizontalRatio: ((this.x - this.pageMargins.left) / innerWidth)
17662         };
17665 function bottomMostContext(c1, c2) {
17666         var r;
17668         if (c1.page > c2.page) {
17669                 r = c1;
17670         } else if (c2.page > c1.page) {
17671                 r = c2;
17672         } else {
17673                 r = (c1.y > c2.y) ? c1 : c2;
17674         }
17676         return {
17677                 page: r.page,
17678                 x: r.x,
17679                 y: r.y,
17680                 availableHeight: r.availableHeight,
17681                 availableWidth: r.availableWidth
17682         };
17685 module.exports = DocumentContext;
17688 /***/ }),
17689 /* 82 */
17690 /***/ (function(module, exports, __webpack_require__) {
17692 "use strict";
17696  * Creates an instance of Line
17698  * @constructor
17699  * @this {Line}
17700  * @param {Number} Maximum width this line can have
17701  */
17702 function Line(maxWidth) {
17703         this.maxWidth = maxWidth;
17704         this.leadingCut = 0;
17705         this.trailingCut = 0;
17706         this.inlineWidths = 0;
17707         this.inlines = [];
17710 Line.prototype.getAscenderHeight = function () {
17711         var y = 0;
17713         this.inlines.forEach(function (inline) {
17714                 y = Math.max(y, inline.font.ascender / 1000 * inline.fontSize);
17715         });
17716         return y;
17719 Line.prototype.hasEnoughSpaceForInline = function (inline) {
17720         if (this.inlines.length === 0) {
17721                 return true;
17722         }
17723         if (this.newLineForced) {
17724                 return false;
17725         }
17727         return this.inlineWidths + inline.width - this.leadingCut - (inline.trailingCut || 0) <= this.maxWidth;
17730 Line.prototype.addInline = function (inline) {
17731         if (this.inlines.length === 0) {
17732                 this.leadingCut = inline.leadingCut || 0;
17733         }
17734         this.trailingCut = inline.trailingCut || 0;
17736         inline.x = this.inlineWidths - this.leadingCut;
17738         this.inlines.push(inline);
17739         this.inlineWidths += inline.width;
17741         if (inline.lineEnd) {
17742                 this.newLineForced = true;
17743         }
17746 Line.prototype.getWidth = function () {
17747         return this.inlineWidths - this.leadingCut - this.trailingCut;
17751  * Returns line height
17752  * @return {Number}
17753  */
17754 Line.prototype.getHeight = function () {
17755         var max = 0;
17757         this.inlines.forEach(function (item) {
17758                 max = Math.max(max, item.height || 0);
17759         });
17761         return max;
17764 module.exports = Line;
17767 /***/ }),
17768 /* 83 */
17769 /***/ (function(module, exports, __webpack_require__) {
17771 "use strict";
17772 /* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.
17774 // Permission is hereby granted, free of charge, to any person obtaining a
17775 // copy of this software and associated documentation files (the
17776 // "Software"), to deal in the Software without restriction, including
17777 // without limitation the rights to use, copy, modify, merge, publish,
17778 // distribute, sublicense, and/or sell copies of the Software, and to permit
17779 // persons to whom the Software is furnished to do so, subject to the
17780 // following conditions:
17782 // The above copyright notice and this permission notice shall be included
17783 // in all copies or substantial portions of the Software.
17785 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17786 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17787 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17788 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
17789 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
17790 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
17791 // USE OR OTHER DEALINGS IN THE SOFTWARE.
17795 /*<replacement>*/
17797 var processNextTick = __webpack_require__(32).nextTick;
17798 /*</replacement>*/
17800 module.exports = Readable;
17802 /*<replacement>*/
17803 var isArray = __webpack_require__(76);
17804 /*</replacement>*/
17806 /*<replacement>*/
17807 var Duplex;
17808 /*</replacement>*/
17810 Readable.ReadableState = ReadableState;
17812 /*<replacement>*/
17813 var EE = __webpack_require__(31).EventEmitter;
17815 var EElistenerCount = function (emitter, type) {
17816   return emitter.listeners(type).length;
17818 /*</replacement>*/
17820 /*<replacement>*/
17821 var Stream = __webpack_require__(84);
17822 /*</replacement>*/
17824 /*<replacement>*/
17826 var Buffer = __webpack_require__(33).Buffer;
17827 var OurUint8Array = global.Uint8Array || function () {};
17828 function _uint8ArrayToBuffer(chunk) {
17829   return Buffer.from(chunk);
17831 function _isUint8Array(obj) {
17832   return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
17835 /*</replacement>*/
17837 /*<replacement>*/
17838 var util = __webpack_require__(25);
17839 util.inherits = __webpack_require__(21);
17840 /*</replacement>*/
17842 /*<replacement>*/
17843 var debugUtil = __webpack_require__(139);
17844 var debug = void 0;
17845 if (debugUtil && debugUtil.debuglog) {
17846   debug = debugUtil.debuglog('stream');
17847 } else {
17848   debug = function () {};
17850 /*</replacement>*/
17852 var BufferList = __webpack_require__(140);
17853 var destroyImpl = __webpack_require__(85);
17854 var StringDecoder;
17856 util.inherits(Readable, Stream);
17858 var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
17860 function prependListener(emitter, event, fn) {
17861   // Sadly this is not cacheable as some libraries bundle their own
17862   // event emitter implementation with them.
17863   if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
17865   // This is a hack to make sure that our error handler is attached before any
17866   // userland ones.  NEVER DO THIS. This is here only because this code needs
17867   // to continue to work with older versions of Node.js that do not include
17868   // the prependListener() method. The goal is to eventually remove this hack.
17869   if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
17872 function ReadableState(options, stream) {
17873   Duplex = Duplex || __webpack_require__(16);
17875   options = options || {};
17877   // Duplex streams are both readable and writable, but share
17878   // the same options object.
17879   // However, some cases require setting options to different
17880   // values for the readable and the writable sides of the duplex stream.
17881   // These options can be provided separately as readableXXX and writableXXX.
17882   var isDuplex = stream instanceof Duplex;
17884   // object stream flag. Used to make read(n) ignore n and to
17885   // make all the buffer merging and length checks go away
17886   this.objectMode = !!options.objectMode;
17888   if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
17890   // the point at which it stops calling _read() to fill the buffer
17891   // Note: 0 is a valid value, means "don't call _read preemptively ever"
17892   var hwm = options.highWaterMark;
17893   var readableHwm = options.readableHighWaterMark;
17894   var defaultHwm = this.objectMode ? 16 : 16 * 1024;
17896   if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;
17898   // cast to ints.
17899   this.highWaterMark = Math.floor(this.highWaterMark);
17901   // A linked list is used to store data chunks instead of an array because the
17902   // linked list can remove elements from the beginning faster than
17903   // array.shift()
17904   this.buffer = new BufferList();
17905   this.length = 0;
17906   this.pipes = null;
17907   this.pipesCount = 0;
17908   this.flowing = null;
17909   this.ended = false;
17910   this.endEmitted = false;
17911   this.reading = false;
17913   // a flag to be able to tell if the event 'readable'/'data' is emitted
17914   // immediately, or on a later tick.  We set this to true at first, because
17915   // any actions that shouldn't happen until "later" should generally also
17916   // not happen before the first read call.
17917   this.sync = true;
17919   // whenever we return null, then we set a flag to say
17920   // that we're awaiting a 'readable' event emission.
17921   this.needReadable = false;
17922   this.emittedReadable = false;
17923   this.readableListening = false;
17924   this.resumeScheduled = false;
17926   // has it been destroyed
17927   this.destroyed = false;
17929   // Crypto is kind of old and crusty.  Historically, its default string
17930   // encoding is 'binary' so we have to make this configurable.
17931   // Everything else in the universe uses 'utf8', though.
17932   this.defaultEncoding = options.defaultEncoding || 'utf8';
17934   // the number of writers that are awaiting a drain event in .pipe()s
17935   this.awaitDrain = 0;
17937   // if true, a maybeReadMore has been scheduled
17938   this.readingMore = false;
17940   this.decoder = null;
17941   this.encoding = null;
17942   if (options.encoding) {
17943     if (!StringDecoder) StringDecoder = __webpack_require__(47).StringDecoder;
17944     this.decoder = new StringDecoder(options.encoding);
17945     this.encoding = options.encoding;
17946   }
17949 function Readable(options) {
17950   Duplex = Duplex || __webpack_require__(16);
17952   if (!(this instanceof Readable)) return new Readable(options);
17954   this._readableState = new ReadableState(options, this);
17956   // legacy
17957   this.readable = true;
17959   if (options) {
17960     if (typeof options.read === 'function') this._read = options.read;
17962     if (typeof options.destroy === 'function') this._destroy = options.destroy;
17963   }
17965   Stream.call(this);
17968 Object.defineProperty(Readable.prototype, 'destroyed', {
17969   get: function () {
17970     if (this._readableState === undefined) {
17971       return false;
17972     }
17973     return this._readableState.destroyed;
17974   },
17975   set: function (value) {
17976     // we ignore the value if the stream
17977     // has not been initialized yet
17978     if (!this._readableState) {
17979       return;
17980     }
17982     // backward compatibility, the user is explicitly
17983     // managing destroyed
17984     this._readableState.destroyed = value;
17985   }
17988 Readable.prototype.destroy = destroyImpl.destroy;
17989 Readable.prototype._undestroy = destroyImpl.undestroy;
17990 Readable.prototype._destroy = function (err, cb) {
17991   this.push(null);
17992   cb(err);
17995 // Manually shove something into the read() buffer.
17996 // This returns true if the highWaterMark has not been hit yet,
17997 // similar to how Writable.write() returns true if you should
17998 // write() some more.
17999 Readable.prototype.push = function (chunk, encoding) {
18000   var state = this._readableState;
18001   var skipChunkCheck;
18003   if (!state.objectMode) {
18004     if (typeof chunk === 'string') {
18005       encoding = encoding || state.defaultEncoding;
18006       if (encoding !== state.encoding) {
18007         chunk = Buffer.from(chunk, encoding);
18008         encoding = '';
18009       }
18010       skipChunkCheck = true;
18011     }
18012   } else {
18013     skipChunkCheck = true;
18014   }
18016   return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
18019 // Unshift should *always* be something directly out of read()
18020 Readable.prototype.unshift = function (chunk) {
18021   return readableAddChunk(this, chunk, null, true, false);
18024 function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
18025   var state = stream._readableState;
18026   if (chunk === null) {
18027     state.reading = false;
18028     onEofChunk(stream, state);
18029   } else {
18030     var er;
18031     if (!skipChunkCheck) er = chunkInvalid(state, chunk);
18032     if (er) {
18033       stream.emit('error', er);
18034     } else if (state.objectMode || chunk && chunk.length > 0) {
18035       if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
18036         chunk = _uint8ArrayToBuffer(chunk);
18037       }
18039       if (addToFront) {
18040         if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
18041       } else if (state.ended) {
18042         stream.emit('error', new Error('stream.push() after EOF'));
18043       } else {
18044         state.reading = false;
18045         if (state.decoder && !encoding) {
18046           chunk = state.decoder.write(chunk);
18047           if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
18048         } else {
18049           addChunk(stream, state, chunk, false);
18050         }
18051       }
18052     } else if (!addToFront) {
18053       state.reading = false;
18054     }
18055   }
18057   return needMoreData(state);
18060 function addChunk(stream, state, chunk, addToFront) {
18061   if (state.flowing && state.length === 0 && !state.sync) {
18062     stream.emit('data', chunk);
18063     stream.read(0);
18064   } else {
18065     // update the buffer info.
18066     state.length += state.objectMode ? 1 : chunk.length;
18067     if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
18069     if (state.needReadable) emitReadable(stream);
18070   }
18071   maybeReadMore(stream, state);
18074 function chunkInvalid(state, chunk) {
18075   var er;
18076   if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
18077     er = new TypeError('Invalid non-string/buffer chunk');
18078   }
18079   return er;
18082 // if it's past the high water mark, we can push in some more.
18083 // Also, if we have no data yet, we can stand some
18084 // more bytes.  This is to work around cases where hwm=0,
18085 // such as the repl.  Also, if the push() triggered a
18086 // readable event, and the user called read(largeNumber) such that
18087 // needReadable was set, then we ought to push more, so that another
18088 // 'readable' event will be triggered.
18089 function needMoreData(state) {
18090   return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
18093 Readable.prototype.isPaused = function () {
18094   return this._readableState.flowing === false;
18097 // backwards compatibility.
18098 Readable.prototype.setEncoding = function (enc) {
18099   if (!StringDecoder) StringDecoder = __webpack_require__(47).StringDecoder;
18100   this._readableState.decoder = new StringDecoder(enc);
18101   this._readableState.encoding = enc;
18102   return this;
18105 // Don't raise the hwm > 8MB
18106 var MAX_HWM = 0x800000;
18107 function computeNewHighWaterMark(n) {
18108   if (n >= MAX_HWM) {
18109     n = MAX_HWM;
18110   } else {
18111     // Get the next highest power of 2 to prevent increasing hwm excessively in
18112     // tiny amounts
18113     n--;
18114     n |= n >>> 1;
18115     n |= n >>> 2;
18116     n |= n >>> 4;
18117     n |= n >>> 8;
18118     n |= n >>> 16;
18119     n++;
18120   }
18121   return n;
18124 // This function is designed to be inlinable, so please take care when making
18125 // changes to the function body.
18126 function howMuchToRead(n, state) {
18127   if (n <= 0 || state.length === 0 && state.ended) return 0;
18128   if (state.objectMode) return 1;
18129   if (n !== n) {
18130     // Only flow one buffer at a time
18131     if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
18132   }
18133   // If we're asking for more than the current hwm, then raise the hwm.
18134   if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
18135   if (n <= state.length) return n;
18136   // Don't have enough
18137   if (!state.ended) {
18138     state.needReadable = true;
18139     return 0;
18140   }
18141   return state.length;
18144 // you can override either this method, or the async _read(n) below.
18145 Readable.prototype.read = function (n) {
18146   debug('read', n);
18147   n = parseInt(n, 10);
18148   var state = this._readableState;
18149   var nOrig = n;
18151   if (n !== 0) state.emittedReadable = false;
18153   // if we're doing read(0) to trigger a readable event, but we
18154   // already have a bunch of data in the buffer, then just trigger
18155   // the 'readable' event and move on.
18156   if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
18157     debug('read: emitReadable', state.length, state.ended);
18158     if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
18159     return null;
18160   }
18162   n = howMuchToRead(n, state);
18164   // if we've ended, and we're now clear, then finish it up.
18165   if (n === 0 && state.ended) {
18166     if (state.length === 0) endReadable(this);
18167     return null;
18168   }
18170   // All the actual chunk generation logic needs to be
18171   // *below* the call to _read.  The reason is that in certain
18172   // synthetic stream cases, such as passthrough streams, _read
18173   // may be a completely synchronous operation which may change
18174   // the state of the read buffer, providing enough data when
18175   // before there was *not* enough.
18176   //
18177   // So, the steps are:
18178   // 1. Figure out what the state of things will be after we do
18179   // a read from the buffer.
18180   //
18181   // 2. If that resulting state will trigger a _read, then call _read.
18182   // Note that this may be asynchronous, or synchronous.  Yes, it is
18183   // deeply ugly to write APIs this way, but that still doesn't mean
18184   // that the Readable class should behave improperly, as streams are
18185   // designed to be sync/async agnostic.
18186   // Take note if the _read call is sync or async (ie, if the read call
18187   // has returned yet), so that we know whether or not it's safe to emit
18188   // 'readable' etc.
18189   //
18190   // 3. Actually pull the requested chunks out of the buffer and return.
18192   // if we need a readable event, then we need to do some reading.
18193   var doRead = state.needReadable;
18194   debug('need readable', doRead);
18196   // if we currently have less than the highWaterMark, then also read some
18197   if (state.length === 0 || state.length - n < state.highWaterMark) {
18198     doRead = true;
18199     debug('length less than watermark', doRead);
18200   }
18202   // however, if we've ended, then there's no point, and if we're already
18203   // reading, then it's unnecessary.
18204   if (state.ended || state.reading) {
18205     doRead = false;
18206     debug('reading or ended', doRead);
18207   } else if (doRead) {
18208     debug('do read');
18209     state.reading = true;
18210     state.sync = true;
18211     // if the length is currently zero, then we *need* a readable event.
18212     if (state.length === 0) state.needReadable = true;
18213     // call internal read method
18214     this._read(state.highWaterMark);
18215     state.sync = false;
18216     // If _read pushed data synchronously, then `reading` will be false,
18217     // and we need to re-evaluate how much data we can return to the user.
18218     if (!state.reading) n = howMuchToRead(nOrig, state);
18219   }
18221   var ret;
18222   if (n > 0) ret = fromList(n, state);else ret = null;
18224   if (ret === null) {
18225     state.needReadable = true;
18226     n = 0;
18227   } else {
18228     state.length -= n;
18229   }
18231   if (state.length === 0) {
18232     // If we have nothing in the buffer, then we want to know
18233     // as soon as we *do* get something into the buffer.
18234     if (!state.ended) state.needReadable = true;
18236     // If we tried to read() past the EOF, then emit end on the next tick.
18237     if (nOrig !== n && state.ended) endReadable(this);
18238   }
18240   if (ret !== null) this.emit('data', ret);
18242   return ret;
18245 function onEofChunk(stream, state) {
18246   if (state.ended) return;
18247   if (state.decoder) {
18248     var chunk = state.decoder.end();
18249     if (chunk && chunk.length) {
18250       state.buffer.push(chunk);
18251       state.length += state.objectMode ? 1 : chunk.length;
18252     }
18253   }
18254   state.ended = true;
18256   // emit 'readable' now to make sure it gets picked up.
18257   emitReadable(stream);
18260 // Don't emit readable right away in sync mode, because this can trigger
18261 // another read() call => stack overflow.  This way, it might trigger
18262 // a nextTick recursion warning, but that's not so bad.
18263 function emitReadable(stream) {
18264   var state = stream._readableState;
18265   state.needReadable = false;
18266   if (!state.emittedReadable) {
18267     debug('emitReadable', state.flowing);
18268     state.emittedReadable = true;
18269     if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream);
18270   }
18273 function emitReadable_(stream) {
18274   debug('emit readable');
18275   stream.emit('readable');
18276   flow(stream);
18279 // at this point, the user has presumably seen the 'readable' event,
18280 // and called read() to consume some data.  that may have triggered
18281 // in turn another _read(n) call, in which case reading = true if
18282 // it's in progress.
18283 // However, if we're not ended, or reading, and the length < hwm,
18284 // then go ahead and try to read some more preemptively.
18285 function maybeReadMore(stream, state) {
18286   if (!state.readingMore) {
18287     state.readingMore = true;
18288     processNextTick(maybeReadMore_, stream, state);
18289   }
18292 function maybeReadMore_(stream, state) {
18293   var len = state.length;
18294   while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
18295     debug('maybeReadMore read 0');
18296     stream.read(0);
18297     if (len === state.length)
18298       // didn't get any data, stop spinning.
18299       break;else len = state.length;
18300   }
18301   state.readingMore = false;
18304 // abstract method.  to be overridden in specific implementation classes.
18305 // call cb(er, data) where data is <= n in length.
18306 // for virtual (non-string, non-buffer) streams, "length" is somewhat
18307 // arbitrary, and perhaps not very meaningful.
18308 Readable.prototype._read = function (n) {
18309   this.emit('error', new Error('_read() is not implemented'));
18312 Readable.prototype.pipe = function (dest, pipeOpts) {
18313   var src = this;
18314   var state = this._readableState;
18316   switch (state.pipesCount) {
18317     case 0:
18318       state.pipes = dest;
18319       break;
18320     case 1:
18321       state.pipes = [state.pipes, dest];
18322       break;
18323     default:
18324       state.pipes.push(dest);
18325       break;
18326   }
18327   state.pipesCount += 1;
18328   debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
18330   var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
18332   var endFn = doEnd ? onend : unpipe;
18333   if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn);
18335   dest.on('unpipe', onunpipe);
18336   function onunpipe(readable, unpipeInfo) {
18337     debug('onunpipe');
18338     if (readable === src) {
18339       if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
18340         unpipeInfo.hasUnpiped = true;
18341         cleanup();
18342       }
18343     }
18344   }
18346   function onend() {
18347     debug('onend');
18348     dest.end();
18349   }
18351   // when the dest drains, it reduces the awaitDrain counter
18352   // on the source.  This would be more elegant with a .once()
18353   // handler in flow(), but adding and removing repeatedly is
18354   // too slow.
18355   var ondrain = pipeOnDrain(src);
18356   dest.on('drain', ondrain);
18358   var cleanedUp = false;
18359   function cleanup() {
18360     debug('cleanup');
18361     // cleanup event handlers once the pipe is broken
18362     dest.removeListener('close', onclose);
18363     dest.removeListener('finish', onfinish);
18364     dest.removeListener('drain', ondrain);
18365     dest.removeListener('error', onerror);
18366     dest.removeListener('unpipe', onunpipe);
18367     src.removeListener('end', onend);
18368     src.removeListener('end', unpipe);
18369     src.removeListener('data', ondata);
18371     cleanedUp = true;
18373     // if the reader is waiting for a drain event from this
18374     // specific writer, then it would cause it to never start
18375     // flowing again.
18376     // So, if this is awaiting a drain, then we just call it now.
18377     // If we don't know, then assume that we are waiting for one.
18378     if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
18379   }
18381   // If the user pushes more data while we're writing to dest then we'll end up
18382   // in ondata again. However, we only want to increase awaitDrain once because
18383   // dest will only emit one 'drain' event for the multiple writes.
18384   // => Introduce a guard on increasing awaitDrain.
18385   var increasedAwaitDrain = false;
18386   src.on('data', ondata);
18387   function ondata(chunk) {
18388     debug('ondata');
18389     increasedAwaitDrain = false;
18390     var ret = dest.write(chunk);
18391     if (false === ret && !increasedAwaitDrain) {
18392       // If the user unpiped during `dest.write()`, it is possible
18393       // to get stuck in a permanently paused state if that write
18394       // also returned false.
18395       // => Check whether `dest` is still a piping destination.
18396       if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
18397         debug('false write response, pause', src._readableState.awaitDrain);
18398         src._readableState.awaitDrain++;
18399         increasedAwaitDrain = true;
18400       }
18401       src.pause();
18402     }
18403   }
18405   // if the dest has an error, then stop piping into it.
18406   // however, don't suppress the throwing behavior for this.
18407   function onerror(er) {
18408     debug('onerror', er);
18409     unpipe();
18410     dest.removeListener('error', onerror);
18411     if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
18412   }
18414   // Make sure our error handler is attached before userland ones.
18415   prependListener(dest, 'error', onerror);
18417   // Both close and finish should trigger unpipe, but only once.
18418   function onclose() {
18419     dest.removeListener('finish', onfinish);
18420     unpipe();
18421   }
18422   dest.once('close', onclose);
18423   function onfinish() {
18424     debug('onfinish');
18425     dest.removeListener('close', onclose);
18426     unpipe();
18427   }
18428   dest.once('finish', onfinish);
18430   function unpipe() {
18431     debug('unpipe');
18432     src.unpipe(dest);
18433   }
18435   // tell the dest that it's being piped to
18436   dest.emit('pipe', src);
18438   // start the flow if it hasn't been started already.
18439   if (!state.flowing) {
18440     debug('pipe resume');
18441     src.resume();
18442   }
18444   return dest;
18447 function pipeOnDrain(src) {
18448   return function () {
18449     var state = src._readableState;
18450     debug('pipeOnDrain', state.awaitDrain);
18451     if (state.awaitDrain) state.awaitDrain--;
18452     if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
18453       state.flowing = true;
18454       flow(src);
18455     }
18456   };
18459 Readable.prototype.unpipe = function (dest) {
18460   var state = this._readableState;
18461   var unpipeInfo = { hasUnpiped: false };
18463   // if we're not piping anywhere, then do nothing.
18464   if (state.pipesCount === 0) return this;
18466   // just one destination.  most common case.
18467   if (state.pipesCount === 1) {
18468     // passed in one, but it's not the right one.
18469     if (dest && dest !== state.pipes) return this;
18471     if (!dest) dest = state.pipes;
18473     // got a match.
18474     state.pipes = null;
18475     state.pipesCount = 0;
18476     state.flowing = false;
18477     if (dest) dest.emit('unpipe', this, unpipeInfo);
18478     return this;
18479   }
18481   // slow case. multiple pipe destinations.
18483   if (!dest) {
18484     // remove all.
18485     var dests = state.pipes;
18486     var len = state.pipesCount;
18487     state.pipes = null;
18488     state.pipesCount = 0;
18489     state.flowing = false;
18491     for (var i = 0; i < len; i++) {
18492       dests[i].emit('unpipe', this, unpipeInfo);
18493     }return this;
18494   }
18496   // try to find the right one.
18497   var index = indexOf(state.pipes, dest);
18498   if (index === -1) return this;
18500   state.pipes.splice(index, 1);
18501   state.pipesCount -= 1;
18502   if (state.pipesCount === 1) state.pipes = state.pipes[0];
18504   dest.emit('unpipe', this, unpipeInfo);
18506   return this;
18509 // set up data events if they are asked for
18510 // Ensure readable listeners eventually get something
18511 Readable.prototype.on = function (ev, fn) {
18512   var res = Stream.prototype.on.call(this, ev, fn);
18514   if (ev === 'data') {
18515     // Start flowing on next tick if stream isn't explicitly paused
18516     if (this._readableState.flowing !== false) this.resume();
18517   } else if (ev === 'readable') {
18518     var state = this._readableState;
18519     if (!state.endEmitted && !state.readableListening) {
18520       state.readableListening = state.needReadable = true;
18521       state.emittedReadable = false;
18522       if (!state.reading) {
18523         processNextTick(nReadingNextTick, this);
18524       } else if (state.length) {
18525         emitReadable(this);
18526       }
18527     }
18528   }
18530   return res;
18532 Readable.prototype.addListener = Readable.prototype.on;
18534 function nReadingNextTick(self) {
18535   debug('readable nexttick read 0');
18536   self.read(0);
18539 // pause() and resume() are remnants of the legacy readable stream API
18540 // If the user uses them, then switch into old mode.
18541 Readable.prototype.resume = function () {
18542   var state = this._readableState;
18543   if (!state.flowing) {
18544     debug('resume');
18545     state.flowing = true;
18546     resume(this, state);
18547   }
18548   return this;
18551 function resume(stream, state) {
18552   if (!state.resumeScheduled) {
18553     state.resumeScheduled = true;
18554     processNextTick(resume_, stream, state);
18555   }
18558 function resume_(stream, state) {
18559   if (!state.reading) {
18560     debug('resume read 0');
18561     stream.read(0);
18562   }
18564   state.resumeScheduled = false;
18565   state.awaitDrain = 0;
18566   stream.emit('resume');
18567   flow(stream);
18568   if (state.flowing && !state.reading) stream.read(0);
18571 Readable.prototype.pause = function () {
18572   debug('call pause flowing=%j', this._readableState.flowing);
18573   if (false !== this._readableState.flowing) {
18574     debug('pause');
18575     this._readableState.flowing = false;
18576     this.emit('pause');
18577   }
18578   return this;
18581 function flow(stream) {
18582   var state = stream._readableState;
18583   debug('flow', state.flowing);
18584   while (state.flowing && stream.read() !== null) {}
18587 // wrap an old-style stream as the async data source.
18588 // This is *not* part of the readable stream interface.
18589 // It is an ugly unfortunate mess of history.
18590 Readable.prototype.wrap = function (stream) {
18591   var _this = this;
18593   var state = this._readableState;
18594   var paused = false;
18596   stream.on('end', function () {
18597     debug('wrapped end');
18598     if (state.decoder && !state.ended) {
18599       var chunk = state.decoder.end();
18600       if (chunk && chunk.length) _this.push(chunk);
18601     }
18603     _this.push(null);
18604   });
18606   stream.on('data', function (chunk) {
18607     debug('wrapped data');
18608     if (state.decoder) chunk = state.decoder.write(chunk);
18610     // don't skip over falsy values in objectMode
18611     if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
18613     var ret = _this.push(chunk);
18614     if (!ret) {
18615       paused = true;
18616       stream.pause();
18617     }
18618   });
18620   // proxy all the other methods.
18621   // important when wrapping filters and duplexes.
18622   for (var i in stream) {
18623     if (this[i] === undefined && typeof stream[i] === 'function') {
18624       this[i] = function (method) {
18625         return function () {
18626           return stream[method].apply(stream, arguments);
18627         };
18628       }(i);
18629     }
18630   }
18632   // proxy certain important events.
18633   for (var n = 0; n < kProxyEvents.length; n++) {
18634     stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
18635   }
18637   // when we try to consume some more bytes, simply unpause the
18638   // underlying stream.
18639   this._read = function (n) {
18640     debug('wrapped _read', n);
18641     if (paused) {
18642       paused = false;
18643       stream.resume();
18644     }
18645   };
18647   return this;
18650 // exposed for testing purposes only.
18651 Readable._fromList = fromList;
18653 // Pluck off n bytes from an array of buffers.
18654 // Length is the combined lengths of all the buffers in the list.
18655 // This function is designed to be inlinable, so please take care when making
18656 // changes to the function body.
18657 function fromList(n, state) {
18658   // nothing buffered
18659   if (state.length === 0) return null;
18661   var ret;
18662   if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
18663     // read it all, truncate the list
18664     if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
18665     state.buffer.clear();
18666   } else {
18667     // read part of list
18668     ret = fromListPartial(n, state.buffer, state.decoder);
18669   }
18671   return ret;
18674 // Extracts only enough buffered data to satisfy the amount requested.
18675 // This function is designed to be inlinable, so please take care when making
18676 // changes to the function body.
18677 function fromListPartial(n, list, hasStrings) {
18678   var ret;
18679   if (n < list.head.data.length) {
18680     // slice is the same for buffers and strings
18681     ret = list.head.data.slice(0, n);
18682     list.head.data = list.head.data.slice(n);
18683   } else if (n === list.head.data.length) {
18684     // first chunk is a perfect match
18685     ret = list.shift();
18686   } else {
18687     // result spans more than one buffer
18688     ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
18689   }
18690   return ret;
18693 // Copies a specified amount of characters from the list of buffered data
18694 // chunks.
18695 // This function is designed to be inlinable, so please take care when making
18696 // changes to the function body.
18697 function copyFromBufferString(n, list) {
18698   var p = list.head;
18699   var c = 1;
18700   var ret = p.data;
18701   n -= ret.length;
18702   while (p = p.next) {
18703     var str = p.data;
18704     var nb = n > str.length ? str.length : n;
18705     if (nb === str.length) ret += str;else ret += str.slice(0, n);
18706     n -= nb;
18707     if (n === 0) {
18708       if (nb === str.length) {
18709         ++c;
18710         if (p.next) list.head = p.next;else list.head = list.tail = null;
18711       } else {
18712         list.head = p;
18713         p.data = str.slice(nb);
18714       }
18715       break;
18716     }
18717     ++c;
18718   }
18719   list.length -= c;
18720   return ret;
18723 // Copies a specified amount of bytes from the list of buffered data chunks.
18724 // This function is designed to be inlinable, so please take care when making
18725 // changes to the function body.
18726 function copyFromBuffer(n, list) {
18727   var ret = Buffer.allocUnsafe(n);
18728   var p = list.head;
18729   var c = 1;
18730   p.data.copy(ret);
18731   n -= p.data.length;
18732   while (p = p.next) {
18733     var buf = p.data;
18734     var nb = n > buf.length ? buf.length : n;
18735     buf.copy(ret, ret.length - n, 0, nb);
18736     n -= nb;
18737     if (n === 0) {
18738       if (nb === buf.length) {
18739         ++c;
18740         if (p.next) list.head = p.next;else list.head = list.tail = null;
18741       } else {
18742         list.head = p;
18743         p.data = buf.slice(nb);
18744       }
18745       break;
18746     }
18747     ++c;
18748   }
18749   list.length -= c;
18750   return ret;
18753 function endReadable(stream) {
18754   var state = stream._readableState;
18756   // If we get here before consuming all the bytes, then that is a
18757   // bug in node.  Should never happen.
18758   if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
18760   if (!state.endEmitted) {
18761     state.ended = true;
18762     processNextTick(endReadableNT, state, stream);
18763   }
18766 function endReadableNT(state, stream) {
18767   // Check that we didn't get one last unshift.
18768   if (!state.endEmitted && state.length === 0) {
18769     state.endEmitted = true;
18770     stream.readable = false;
18771     stream.emit('end');
18772   }
18775 function forEach(xs, f) {
18776   for (var i = 0, l = xs.length; i < l; i++) {
18777     f(xs[i], i);
18778   }
18781 function indexOf(xs, x) {
18782   for (var i = 0, l = xs.length; i < l; i++) {
18783     if (xs[i] === x) return i;
18784   }
18785   return -1;
18787 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7), __webpack_require__(11)))
18789 /***/ }),
18790 /* 84 */
18791 /***/ (function(module, exports, __webpack_require__) {
18793 module.exports = __webpack_require__(31).EventEmitter;
18796 /***/ }),
18797 /* 85 */
18798 /***/ (function(module, exports, __webpack_require__) {
18800 "use strict";
18803 /*<replacement>*/
18805 var processNextTick = __webpack_require__(32).nextTick;
18806 /*</replacement>*/
18808 // undocumented cb() API, needed for core, not for public API
18809 function destroy(err, cb) {
18810   var _this = this;
18812   var readableDestroyed = this._readableState && this._readableState.destroyed;
18813   var writableDestroyed = this._writableState && this._writableState.destroyed;
18815   if (readableDestroyed || writableDestroyed) {
18816     if (cb) {
18817       cb(err);
18818     } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {
18819       processNextTick(emitErrorNT, this, err);
18820     }
18821     return this;
18822   }
18824   // we set destroyed to true before firing error callbacks in order
18825   // to make it re-entrance safe in case destroy() is called within callbacks
18827   if (this._readableState) {
18828     this._readableState.destroyed = true;
18829   }
18831   // if this is a duplex stream mark the writable part as destroyed as well
18832   if (this._writableState) {
18833     this._writableState.destroyed = true;
18834   }
18836   this._destroy(err || null, function (err) {
18837     if (!cb && err) {
18838       processNextTick(emitErrorNT, _this, err);
18839       if (_this._writableState) {
18840         _this._writableState.errorEmitted = true;
18841       }
18842     } else if (cb) {
18843       cb(err);
18844     }
18845   });
18847   return this;
18850 function undestroy() {
18851   if (this._readableState) {
18852     this._readableState.destroyed = false;
18853     this._readableState.reading = false;
18854     this._readableState.ended = false;
18855     this._readableState.endEmitted = false;
18856   }
18858   if (this._writableState) {
18859     this._writableState.destroyed = false;
18860     this._writableState.ended = false;
18861     this._writableState.ending = false;
18862     this._writableState.finished = false;
18863     this._writableState.errorEmitted = false;
18864   }
18867 function emitErrorNT(self, err) {
18868   self.emit('error', err);
18871 module.exports = {
18872   destroy: destroy,
18873   undestroy: undestroy
18876 /***/ }),
18877 /* 86 */
18878 /***/ (function(module, exports, __webpack_require__) {
18880 "use strict";
18881 // Copyright Joyent, Inc. and other Node contributors.
18883 // Permission is hereby granted, free of charge, to any person obtaining a
18884 // copy of this software and associated documentation files (the
18885 // "Software"), to deal in the Software without restriction, including
18886 // without limitation the rights to use, copy, modify, merge, publish,
18887 // distribute, sublicense, and/or sell copies of the Software, and to permit
18888 // persons to whom the Software is furnished to do so, subject to the
18889 // following conditions:
18891 // The above copyright notice and this permission notice shall be included
18892 // in all copies or substantial portions of the Software.
18894 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18895 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18896 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
18897 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18898 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
18899 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
18900 // USE OR OTHER DEALINGS IN THE SOFTWARE.
18902 // a transform stream is a readable/writable stream where you do
18903 // something with the data.  Sometimes it's called a "filter",
18904 // but that's not a great name for it, since that implies a thing where
18905 // some bits pass through, and others are simply ignored.  (That would
18906 // be a valid example of a transform, of course.)
18908 // While the output is causally related to the input, it's not a
18909 // necessarily symmetric or synchronous transformation.  For example,
18910 // a zlib stream might take multiple plain-text writes(), and then
18911 // emit a single compressed chunk some time in the future.
18913 // Here's how this works:
18915 // The Transform stream has all the aspects of the readable and writable
18916 // stream classes.  When you write(chunk), that calls _write(chunk,cb)
18917 // internally, and returns false if there's a lot of pending writes
18918 // buffered up.  When you call read(), that calls _read(n) until
18919 // there's enough pending readable data buffered up.
18921 // In a transform stream, the written data is placed in a buffer.  When
18922 // _read(n) is called, it transforms the queued up data, calling the
18923 // buffered _write cb's as it consumes chunks.  If consuming a single
18924 // written chunk would result in multiple output chunks, then the first
18925 // outputted bit calls the readcb, and subsequent chunks just go into
18926 // the read buffer, and will cause it to emit 'readable' if necessary.
18928 // This way, back-pressure is actually determined by the reading side,
18929 // since _read has to be called to start processing a new chunk.  However,
18930 // a pathological inflate type of transform can cause excessive buffering
18931 // here.  For example, imagine a stream where every byte of input is
18932 // interpreted as an integer from 0-255, and then results in that many
18933 // bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
18934 // 1kb of data being output.  In this case, you could write a very small
18935 // amount of input, and end up with a very large amount of output.  In
18936 // such a pathological inflating mechanism, there'd be no way to tell
18937 // the system to stop doing the transform.  A single 4MB write could
18938 // cause the system to run out of memory.
18940 // However, even in such a pathological case, only a single written chunk
18941 // would be consumed, and then the rest would wait (un-transformed) until
18942 // the results of the previous transformed chunk were consumed.
18946 module.exports = Transform;
18948 var Duplex = __webpack_require__(16);
18950 /*<replacement>*/
18951 var util = __webpack_require__(25);
18952 util.inherits = __webpack_require__(21);
18953 /*</replacement>*/
18955 util.inherits(Transform, Duplex);
18957 function afterTransform(er, data) {
18958   var ts = this._transformState;
18959   ts.transforming = false;
18961   var cb = ts.writecb;
18963   if (!cb) {
18964     return this.emit('error', new Error('write callback called multiple times'));
18965   }
18967   ts.writechunk = null;
18968   ts.writecb = null;
18970   if (data != null) // single equals check for both `null` and `undefined`
18971     this.push(data);
18973   cb(er);
18975   var rs = this._readableState;
18976   rs.reading = false;
18977   if (rs.needReadable || rs.length < rs.highWaterMark) {
18978     this._read(rs.highWaterMark);
18979   }
18982 function Transform(options) {
18983   if (!(this instanceof Transform)) return new Transform(options);
18985   Duplex.call(this, options);
18987   this._transformState = {
18988     afterTransform: afterTransform.bind(this),
18989     needTransform: false,
18990     transforming: false,
18991     writecb: null,
18992     writechunk: null,
18993     writeencoding: null
18994   };
18996   // start out asking for a readable event once data is transformed.
18997   this._readableState.needReadable = true;
18999   // we have implemented the _read method, and done the other things
19000   // that Readable wants before the first _read call, so unset the
19001   // sync guard flag.
19002   this._readableState.sync = false;
19004   if (options) {
19005     if (typeof options.transform === 'function') this._transform = options.transform;
19007     if (typeof options.flush === 'function') this._flush = options.flush;
19008   }
19010   // When the writable side finishes, then flush out anything remaining.
19011   this.on('prefinish', prefinish);
19014 function prefinish() {
19015   var _this = this;
19017   if (typeof this._flush === 'function') {
19018     this._flush(function (er, data) {
19019       done(_this, er, data);
19020     });
19021   } else {
19022     done(this, null, null);
19023   }
19026 Transform.prototype.push = function (chunk, encoding) {
19027   this._transformState.needTransform = false;
19028   return Duplex.prototype.push.call(this, chunk, encoding);
19031 // This is the part where you do stuff!
19032 // override this function in implementation classes.
19033 // 'chunk' is an input chunk.
19035 // Call `push(newChunk)` to pass along transformed output
19036 // to the readable side.  You may call 'push' zero or more times.
19038 // Call `cb(err)` when you are done with this chunk.  If you pass
19039 // an error, then that'll put the hurt on the whole operation.  If you
19040 // never call cb(), then you'll never get another chunk.
19041 Transform.prototype._transform = function (chunk, encoding, cb) {
19042   throw new Error('_transform() is not implemented');
19045 Transform.prototype._write = function (chunk, encoding, cb) {
19046   var ts = this._transformState;
19047   ts.writecb = cb;
19048   ts.writechunk = chunk;
19049   ts.writeencoding = encoding;
19050   if (!ts.transforming) {
19051     var rs = this._readableState;
19052     if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
19053   }
19056 // Doesn't matter what the args are here.
19057 // _transform does all the work.
19058 // That we got here means that the readable side wants more data.
19059 Transform.prototype._read = function (n) {
19060   var ts = this._transformState;
19062   if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
19063     ts.transforming = true;
19064     this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
19065   } else {
19066     // mark that we need a transform, so that any data that comes in
19067     // will get processed, now that we've asked for it.
19068     ts.needTransform = true;
19069   }
19072 Transform.prototype._destroy = function (err, cb) {
19073   var _this2 = this;
19075   Duplex.prototype._destroy.call(this, err, function (err2) {
19076     cb(err2);
19077     _this2.emit('close');
19078   });
19081 function done(stream, er, data) {
19082   if (er) return stream.emit('error', er);
19084   if (data != null) // single equals check for both `null` and `undefined`
19085     stream.push(data);
19087   // if there's nothing in the write buffer, then that means
19088   // that nothing more will ever be provided
19089   if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');
19091   if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');
19093   return stream.push(null);
19096 /***/ }),
19097 /* 87 */
19098 /***/ (function(module, exports, __webpack_require__) {
19100 /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.12.6
19103 PDFReference - represents a reference to another object in the PDF object heirarchy
19104 By Devon Govett
19105  */
19107 (function() {
19108   var PDFObject, PDFReference, stream, zlib,
19109     bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
19110     extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
19111     hasProp = {}.hasOwnProperty;
19113   zlib = __webpack_require__(48);
19115   stream = __webpack_require__(15);
19117   PDFReference = (function(superClass) {
19118     extend(PDFReference, superClass);
19120     function PDFReference(document, id, data) {
19121       this.document = document;
19122       this.id = id;
19123       this.data = data != null ? data : {};
19124       this.finalize = bind(this.finalize, this);
19125       PDFReference.__super__.constructor.call(this, {
19126         decodeStrings: false
19127       });
19128       this.gen = 0;
19129       this.deflate = null;
19130       this.compress = this.document.compress && !this.data.Filter;
19131       this.uncompressedLength = 0;
19132       this.chunks = [];
19133     }
19135     PDFReference.prototype.initDeflate = function() {
19136       this.data.Filter = 'FlateDecode';
19137       this.deflate = zlib.createDeflate();
19138       this.deflate.on('data', (function(_this) {
19139         return function(chunk) {
19140           _this.chunks.push(chunk);
19141           return _this.data.Length += chunk.length;
19142         };
19143       })(this));
19144       return this.deflate.on('end', this.finalize);
19145     };
19147     PDFReference.prototype._write = function(chunk, encoding, callback) {
19148       var base;
19149       if (!Buffer.isBuffer(chunk)) {
19150         chunk = new Buffer(chunk + '\n', 'binary');
19151       }
19152       this.uncompressedLength += chunk.length;
19153       if ((base = this.data).Length == null) {
19154         base.Length = 0;
19155       }
19156       if (this.compress) {
19157         if (!this.deflate) {
19158           this.initDeflate();
19159         }
19160         this.deflate.write(chunk);
19161       } else {
19162         this.chunks.push(chunk);
19163         this.data.Length += chunk.length;
19164       }
19165       return callback();
19166     };
19168     PDFReference.prototype.end = function(chunk) {
19169       PDFReference.__super__.end.apply(this, arguments);
19170       if (this.deflate) {
19171         return this.deflate.end();
19172       } else {
19173         return this.finalize();
19174       }
19175     };
19177     PDFReference.prototype.finalize = function() {
19178       var chunk, i, len, ref;
19179       this.offset = this.document._offset;
19180       this.document._write(this.id + " " + this.gen + " obj");
19181       this.document._write(PDFObject.convert(this.data));
19182       if (this.chunks.length) {
19183         this.document._write('stream');
19184         ref = this.chunks;
19185         for (i = 0, len = ref.length; i < len; i++) {
19186           chunk = ref[i];
19187           this.document._write(chunk);
19188         }
19189         this.chunks.length = 0;
19190         this.document._write('\nendstream');
19191       }
19192       this.document._write('endobj');
19193       return this.document._refEnd(this);
19194     };
19196     PDFReference.prototype.toString = function() {
19197       return this.id + " " + this.gen + " R";
19198     };
19200     return PDFReference;
19202   })(stream.Writable);
19204   module.exports = PDFReference;
19206   PDFObject = __webpack_require__(26);
19208 }).call(this);
19210 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
19212 /***/ }),
19213 /* 88 */
19214 /***/ (function(module, exports, __webpack_require__) {
19216 "use strict";
19217 /* WEBPACK VAR INJECTION */(function(global) {
19219 // compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js
19220 // original notice:
19223  * The buffer module from node.js, for the browser.
19225  * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
19226  * @license  MIT
19227  */
19228 function compare(a, b) {
19229   if (a === b) {
19230     return 0;
19231   }
19233   var x = a.length;
19234   var y = b.length;
19236   for (var i = 0, len = Math.min(x, y); i < len; ++i) {
19237     if (a[i] !== b[i]) {
19238       x = a[i];
19239       y = b[i];
19240       break;
19241     }
19242   }
19244   if (x < y) {
19245     return -1;
19246   }
19247   if (y < x) {
19248     return 1;
19249   }
19250   return 0;
19252 function isBuffer(b) {
19253   if (global.Buffer && typeof global.Buffer.isBuffer === 'function') {
19254     return global.Buffer.isBuffer(b);
19255   }
19256   return !!(b != null && b._isBuffer);
19259 // based on node assert, original notice:
19261 // http://wiki.commonjs.org/wiki/Unit_Testing/1.0
19263 // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
19265 // Originally from narwhal.js (http://narwhaljs.org)
19266 // Copyright (c) 2009 Thomas Robinson <280north.com>
19268 // Permission is hereby granted, free of charge, to any person obtaining a copy
19269 // of this software and associated documentation files (the 'Software'), to
19270 // deal in the Software without restriction, including without limitation the
19271 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
19272 // sell copies of the Software, and to permit persons to whom the Software is
19273 // furnished to do so, subject to the following conditions:
19275 // The above copyright notice and this permission notice shall be included in
19276 // all copies or substantial portions of the Software.
19278 // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19279 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19280 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19281 // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19282 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
19283 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19285 var util = __webpack_require__(49);
19286 var hasOwn = Object.prototype.hasOwnProperty;
19287 var pSlice = Array.prototype.slice;
19288 var functionsHaveNames = (function () {
19289   return function foo() {}.name === 'foo';
19290 }());
19291 function pToString (obj) {
19292   return Object.prototype.toString.call(obj);
19294 function isView(arrbuf) {
19295   if (isBuffer(arrbuf)) {
19296     return false;
19297   }
19298   if (typeof global.ArrayBuffer !== 'function') {
19299     return false;
19300   }
19301   if (typeof ArrayBuffer.isView === 'function') {
19302     return ArrayBuffer.isView(arrbuf);
19303   }
19304   if (!arrbuf) {
19305     return false;
19306   }
19307   if (arrbuf instanceof DataView) {
19308     return true;
19309   }
19310   if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) {
19311     return true;
19312   }
19313   return false;
19315 // 1. The assert module provides functions that throw
19316 // AssertionError's when particular conditions are not met. The
19317 // assert module must conform to the following interface.
19319 var assert = module.exports = ok;
19321 // 2. The AssertionError is defined in assert.
19322 // new assert.AssertionError({ message: message,
19323 //                             actual: actual,
19324 //                             expected: expected })
19326 var regex = /\s*function\s+([^\(\s]*)\s*/;
19327 // based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js
19328 function getName(func) {
19329   if (!util.isFunction(func)) {
19330     return;
19331   }
19332   if (functionsHaveNames) {
19333     return func.name;
19334   }
19335   var str = func.toString();
19336   var match = str.match(regex);
19337   return match && match[1];
19339 assert.AssertionError = function AssertionError(options) {
19340   this.name = 'AssertionError';
19341   this.actual = options.actual;
19342   this.expected = options.expected;
19343   this.operator = options.operator;
19344   if (options.message) {
19345     this.message = options.message;
19346     this.generatedMessage = false;
19347   } else {
19348     this.message = getMessage(this);
19349     this.generatedMessage = true;
19350   }
19351   var stackStartFunction = options.stackStartFunction || fail;
19352   if (Error.captureStackTrace) {
19353     Error.captureStackTrace(this, stackStartFunction);
19354   } else {
19355     // non v8 browsers so we can have a stacktrace
19356     var err = new Error();
19357     if (err.stack) {
19358       var out = err.stack;
19360       // try to strip useless frames
19361       var fn_name = getName(stackStartFunction);
19362       var idx = out.indexOf('\n' + fn_name);
19363       if (idx >= 0) {
19364         // once we have located the function frame
19365         // we need to strip out everything before it (and its line)
19366         var next_line = out.indexOf('\n', idx + 1);
19367         out = out.substring(next_line + 1);
19368       }
19370       this.stack = out;
19371     }
19372   }
19375 // assert.AssertionError instanceof Error
19376 util.inherits(assert.AssertionError, Error);
19378 function truncate(s, n) {
19379   if (typeof s === 'string') {
19380     return s.length < n ? s : s.slice(0, n);
19381   } else {
19382     return s;
19383   }
19385 function inspect(something) {
19386   if (functionsHaveNames || !util.isFunction(something)) {
19387     return util.inspect(something);
19388   }
19389   var rawname = getName(something);
19390   var name = rawname ? ': ' + rawname : '';
19391   return '[Function' +  name + ']';
19393 function getMessage(self) {
19394   return truncate(inspect(self.actual), 128) + ' ' +
19395          self.operator + ' ' +
19396          truncate(inspect(self.expected), 128);
19399 // At present only the three keys mentioned above are used and
19400 // understood by the spec. Implementations or sub modules can pass
19401 // other keys to the AssertionError's constructor - they will be
19402 // ignored.
19404 // 3. All of the following functions must throw an AssertionError
19405 // when a corresponding condition is not met, with a message that
19406 // may be undefined if not provided.  All assertion methods provide
19407 // both the actual and expected values to the assertion error for
19408 // display purposes.
19410 function fail(actual, expected, message, operator, stackStartFunction) {
19411   throw new assert.AssertionError({
19412     message: message,
19413     actual: actual,
19414     expected: expected,
19415     operator: operator,
19416     stackStartFunction: stackStartFunction
19417   });
19420 // EXTENSION! allows for well behaved errors defined elsewhere.
19421 assert.fail = fail;
19423 // 4. Pure assertion tests whether a value is truthy, as determined
19424 // by !!guard.
19425 // assert.ok(guard, message_opt);
19426 // This statement is equivalent to assert.equal(true, !!guard,
19427 // message_opt);. To test strictly for the value true, use
19428 // assert.strictEqual(true, guard, message_opt);.
19430 function ok(value, message) {
19431   if (!value) fail(value, true, message, '==', assert.ok);
19433 assert.ok = ok;
19435 // 5. The equality assertion tests shallow, coercive equality with
19436 // ==.
19437 // assert.equal(actual, expected, message_opt);
19439 assert.equal = function equal(actual, expected, message) {
19440   if (actual != expected) fail(actual, expected, message, '==', assert.equal);
19443 // 6. The non-equality assertion tests for whether two objects are not equal
19444 // with != assert.notEqual(actual, expected, message_opt);
19446 assert.notEqual = function notEqual(actual, expected, message) {
19447   if (actual == expected) {
19448     fail(actual, expected, message, '!=', assert.notEqual);
19449   }
19452 // 7. The equivalence assertion tests a deep equality relation.
19453 // assert.deepEqual(actual, expected, message_opt);
19455 assert.deepEqual = function deepEqual(actual, expected, message) {
19456   if (!_deepEqual(actual, expected, false)) {
19457     fail(actual, expected, message, 'deepEqual', assert.deepEqual);
19458   }
19461 assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {
19462   if (!_deepEqual(actual, expected, true)) {
19463     fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual);
19464   }
19467 function _deepEqual(actual, expected, strict, memos) {
19468   // 7.1. All identical values are equivalent, as determined by ===.
19469   if (actual === expected) {
19470     return true;
19471   } else if (isBuffer(actual) && isBuffer(expected)) {
19472     return compare(actual, expected) === 0;
19474   // 7.2. If the expected value is a Date object, the actual value is
19475   // equivalent if it is also a Date object that refers to the same time.
19476   } else if (util.isDate(actual) && util.isDate(expected)) {
19477     return actual.getTime() === expected.getTime();
19479   // 7.3 If the expected value is a RegExp object, the actual value is
19480   // equivalent if it is also a RegExp object with the same source and
19481   // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
19482   } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
19483     return actual.source === expected.source &&
19484            actual.global === expected.global &&
19485            actual.multiline === expected.multiline &&
19486            actual.lastIndex === expected.lastIndex &&
19487            actual.ignoreCase === expected.ignoreCase;
19489   // 7.4. Other pairs that do not both pass typeof value == 'object',
19490   // equivalence is determined by ==.
19491   } else if ((actual === null || typeof actual !== 'object') &&
19492              (expected === null || typeof expected !== 'object')) {
19493     return strict ? actual === expected : actual == expected;
19495   // If both values are instances of typed arrays, wrap their underlying
19496   // ArrayBuffers in a Buffer each to increase performance
19497   // This optimization requires the arrays to have the same type as checked by
19498   // Object.prototype.toString (aka pToString). Never perform binary
19499   // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their
19500   // bit patterns are not identical.
19501   } else if (isView(actual) && isView(expected) &&
19502              pToString(actual) === pToString(expected) &&
19503              !(actual instanceof Float32Array ||
19504                actual instanceof Float64Array)) {
19505     return compare(new Uint8Array(actual.buffer),
19506                    new Uint8Array(expected.buffer)) === 0;
19508   // 7.5 For all other Object pairs, including Array objects, equivalence is
19509   // determined by having the same number of owned properties (as verified
19510   // with Object.prototype.hasOwnProperty.call), the same set of keys
19511   // (although not necessarily the same order), equivalent values for every
19512   // corresponding key, and an identical 'prototype' property. Note: this
19513   // accounts for both named and indexed properties on Arrays.
19514   } else if (isBuffer(actual) !== isBuffer(expected)) {
19515     return false;
19516   } else {
19517     memos = memos || {actual: [], expected: []};
19519     var actualIndex = memos.actual.indexOf(actual);
19520     if (actualIndex !== -1) {
19521       if (actualIndex === memos.expected.indexOf(expected)) {
19522         return true;
19523       }
19524     }
19526     memos.actual.push(actual);
19527     memos.expected.push(expected);
19529     return objEquiv(actual, expected, strict, memos);
19530   }
19533 function isArguments(object) {
19534   return Object.prototype.toString.call(object) == '[object Arguments]';
19537 function objEquiv(a, b, strict, actualVisitedObjects) {
19538   if (a === null || a === undefined || b === null || b === undefined)
19539     return false;
19540   // if one is a primitive, the other must be same
19541   if (util.isPrimitive(a) || util.isPrimitive(b))
19542     return a === b;
19543   if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))
19544     return false;
19545   var aIsArgs = isArguments(a);
19546   var bIsArgs = isArguments(b);
19547   if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
19548     return false;
19549   if (aIsArgs) {
19550     a = pSlice.call(a);
19551     b = pSlice.call(b);
19552     return _deepEqual(a, b, strict);
19553   }
19554   var ka = objectKeys(a);
19555   var kb = objectKeys(b);
19556   var key, i;
19557   // having the same number of owned properties (keys incorporates
19558   // hasOwnProperty)
19559   if (ka.length !== kb.length)
19560     return false;
19561   //the same set of keys (although not necessarily the same order),
19562   ka.sort();
19563   kb.sort();
19564   //~~~cheap key test
19565   for (i = ka.length - 1; i >= 0; i--) {
19566     if (ka[i] !== kb[i])
19567       return false;
19568   }
19569   //equivalent values for every corresponding key, and
19570   //~~~possibly expensive deep test
19571   for (i = ka.length - 1; i >= 0; i--) {
19572     key = ka[i];
19573     if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects))
19574       return false;
19575   }
19576   return true;
19579 // 8. The non-equivalence assertion tests for any deep inequality.
19580 // assert.notDeepEqual(actual, expected, message_opt);
19582 assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
19583   if (_deepEqual(actual, expected, false)) {
19584     fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
19585   }
19588 assert.notDeepStrictEqual = notDeepStrictEqual;
19589 function notDeepStrictEqual(actual, expected, message) {
19590   if (_deepEqual(actual, expected, true)) {
19591     fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual);
19592   }
19596 // 9. The strict equality assertion tests strict equality, as determined by ===.
19597 // assert.strictEqual(actual, expected, message_opt);
19599 assert.strictEqual = function strictEqual(actual, expected, message) {
19600   if (actual !== expected) {
19601     fail(actual, expected, message, '===', assert.strictEqual);
19602   }
19605 // 10. The strict non-equality assertion tests for strict inequality, as
19606 // determined by !==.  assert.notStrictEqual(actual, expected, message_opt);
19608 assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
19609   if (actual === expected) {
19610     fail(actual, expected, message, '!==', assert.notStrictEqual);
19611   }
19614 function expectedException(actual, expected) {
19615   if (!actual || !expected) {
19616     return false;
19617   }
19619   if (Object.prototype.toString.call(expected) == '[object RegExp]') {
19620     return expected.test(actual);
19621   }
19623   try {
19624     if (actual instanceof expected) {
19625       return true;
19626     }
19627   } catch (e) {
19628     // Ignore.  The instanceof check doesn't work for arrow functions.
19629   }
19631   if (Error.isPrototypeOf(expected)) {
19632     return false;
19633   }
19635   return expected.call({}, actual) === true;
19638 function _tryBlock(block) {
19639   var error;
19640   try {
19641     block();
19642   } catch (e) {
19643     error = e;
19644   }
19645   return error;
19648 function _throws(shouldThrow, block, expected, message) {
19649   var actual;
19651   if (typeof block !== 'function') {
19652     throw new TypeError('"block" argument must be a function');
19653   }
19655   if (typeof expected === 'string') {
19656     message = expected;
19657     expected = null;
19658   }
19660   actual = _tryBlock(block);
19662   message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
19663             (message ? ' ' + message : '.');
19665   if (shouldThrow && !actual) {
19666     fail(actual, expected, 'Missing expected exception' + message);
19667   }
19669   var userProvidedMessage = typeof message === 'string';
19670   var isUnwantedException = !shouldThrow && util.isError(actual);
19671   var isUnexpectedException = !shouldThrow && actual && !expected;
19673   if ((isUnwantedException &&
19674       userProvidedMessage &&
19675       expectedException(actual, expected)) ||
19676       isUnexpectedException) {
19677     fail(actual, expected, 'Got unwanted exception' + message);
19678   }
19680   if ((shouldThrow && actual && expected &&
19681       !expectedException(actual, expected)) || (!shouldThrow && actual)) {
19682     throw actual;
19683   }
19686 // 11. Expected to throw an error:
19687 // assert.throws(block, Error_opt, message_opt);
19689 assert.throws = function(block, /*optional*/error, /*optional*/message) {
19690   _throws(true, block, error, message);
19693 // EXTENSION! This is annoying to write outside this module.
19694 assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {
19695   _throws(false, block, error, message);
19698 assert.ifError = function(err) { if (err) throw err; };
19700 var objectKeys = Object.keys || function (obj) {
19701   var keys = [];
19702   for (var key in obj) {
19703     if (hasOwn.call(obj, key)) keys.push(key);
19704   }
19705   return keys;
19708 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7)))
19710 /***/ }),
19711 /* 89 */
19712 /***/ (function(module, exports, __webpack_require__) {
19714 "use strict";
19717 // Note: adler32 takes 12% for level 0 and 2% for level 6.
19718 // It isn't worth it to make additional optimizations as in original.
19719 // Small size is preferable.
19721 // (C) 1995-2013 Jean-loup Gailly and Mark Adler
19722 // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
19724 // This software is provided 'as-is', without any express or implied
19725 // warranty. In no event will the authors be held liable for any damages
19726 // arising from the use of this software.
19728 // Permission is granted to anyone to use this software for any purpose,
19729 // including commercial applications, and to alter it and redistribute it
19730 // freely, subject to the following restrictions:
19732 // 1. The origin of this software must not be misrepresented; you must not
19733 //   claim that you wrote the original software. If you use this software
19734 //   in a product, an acknowledgment in the product documentation would be
19735 //   appreciated but is not required.
19736 // 2. Altered source versions must be plainly marked as such, and must not be
19737 //   misrepresented as being the original software.
19738 // 3. This notice may not be removed or altered from any source distribution.
19740 function adler32(adler, buf, len, pos) {
19741   var s1 = (adler & 0xffff) |0,
19742       s2 = ((adler >>> 16) & 0xffff) |0,
19743       n = 0;
19745   while (len !== 0) {
19746     // Set limit ~ twice less than 5552, to keep
19747     // s2 in 31-bits, because we force signed ints.
19748     // in other case %= will fail.
19749     n = len > 2000 ? 2000 : len;
19750     len -= n;
19752     do {
19753       s1 = (s1 + buf[pos++]) |0;
19754       s2 = (s2 + s1) |0;
19755     } while (--n);
19757     s1 %= 65521;
19758     s2 %= 65521;
19759   }
19761   return (s1 | (s2 << 16)) |0;
19765 module.exports = adler32;
19768 /***/ }),
19769 /* 90 */
19770 /***/ (function(module, exports, __webpack_require__) {
19772 "use strict";
19775 // Note: we can't get significant speed boost here.
19776 // So write code to minimize size - no pregenerated tables
19777 // and array tools dependencies.
19779 // (C) 1995-2013 Jean-loup Gailly and Mark Adler
19780 // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
19782 // This software is provided 'as-is', without any express or implied
19783 // warranty. In no event will the authors be held liable for any damages
19784 // arising from the use of this software.
19786 // Permission is granted to anyone to use this software for any purpose,
19787 // including commercial applications, and to alter it and redistribute it
19788 // freely, subject to the following restrictions:
19790 // 1. The origin of this software must not be misrepresented; you must not
19791 //   claim that you wrote the original software. If you use this software
19792 //   in a product, an acknowledgment in the product documentation would be
19793 //   appreciated but is not required.
19794 // 2. Altered source versions must be plainly marked as such, and must not be
19795 //   misrepresented as being the original software.
19796 // 3. This notice may not be removed or altered from any source distribution.
19798 // Use ordinary array, since untyped makes no boost here
19799 function makeTable() {
19800   var c, table = [];
19802   for (var n = 0; n < 256; n++) {
19803     c = n;
19804     for (var k = 0; k < 8; k++) {
19805       c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
19806     }
19807     table[n] = c;
19808   }
19810   return table;
19813 // Create table on load. Just 255 signed longs. Not a problem.
19814 var crcTable = makeTable();
19817 function crc32(crc, buf, len, pos) {
19818   var t = crcTable,
19819       end = pos + len;
19821   crc ^= -1;
19823   for (var i = pos; i < end; i++) {
19824     crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
19825   }
19827   return (crc ^ (-1)); // >>> 0;
19831 module.exports = crc32;
19834 /***/ }),
19835 /* 91 */
19836 /***/ (function(module, exports) {
19838 module.exports = [["a140","",62],["a180","",32],["a240","",62],["a280","",32],["a2ab","",5],["a2e3","€"],["a2ef",""],["a2fd",""],["a340","",62],["a380","",31," "],["a440","",62],["a480","",32],["a4f4","",10],["a540","",62],["a580","",32],["a5f7","",7],["a640","",62],["a680","",32],["a6b9","",7],["a6d9","",6],["a6ec",""],["a6f3",""],["a6f6","",8],["a740","",62],["a780","",32],["a7c2","",14],["a7f2","",12],["a896","",10],["a8bc",""],["a8bf","ǹ"],["a8c1",""],["a8ea","",20],["a958",""],["a95b",""],["a95d",""],["a989","〾⿰",11],["a997","",12],["a9f0","",14],["aaa1","",93],["aba1","",93],["aca1","",93],["ada1","",93],["aea1","",93],["afa1","",93],["d7fa","",4],["f8a1","",93],["f9a1","",93],["faa1","",93],["fba1","",93],["fca1","",93],["fda1","",93],["fe50","⺁⺄㑳㑇⺈⺋㖞㘚㘎⺌⺗㥮㤘㧏㧟㩳㧐㭎㱮㳠⺧⺪䁖䅟⺮䌷⺳⺶⺷䎱䎬⺻䏝䓖䙡䙌"],["fe80","䜣䜩䝼䞍⻊䥇䥺䥽䦂䦃䦅䦆䦟䦛䦷䦶䲣䲟䲠䲡䱷䲢䴓",6,"䶮",93]]
19840 /***/ }),
19841 /* 92 */
19842 /***/ (function(module, exports) {
19844 module.exports = [["0","\u0000",127],["a140"," ,、。.‧;:?!︰…‥﹐﹑﹒·﹔﹕﹖﹗|–︱—︳╴︴﹏()︵︶{}︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚"],["a1a1","﹛﹜﹝﹞‘’“”〝〞‵′#&*※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯ ̄_ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡+-×÷±√<>=≦≧≠∞≒≡﹢",4,"~∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣/"],["a240","\∕﹨$¥〒¢£%@℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁",7,"▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭"],["a2a1","╮╰╯═╞╪╡◢◣◥◤╱╲╳0",9,"Ⅰ",9,"〡",8,"十卄卅A",25,"a",21],["a340","wxyzΑ",16,"Σ",6,"α",16,"σ",6,"ㄅ",10],["a3a1","ㄐ",25,"˙ˉˊˇˋ"],["a3e1","€"],["a440","一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才"],["a4a1","丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙"],["a540","世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外"],["a5a1","央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全"],["a640","共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年"],["a6a1","式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣"],["a740","作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍"],["a7a1","均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠"],["a840","杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒"],["a8a1","芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵"],["a940","咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居"],["a9a1","屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊"],["aa40","昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠"],["aaa1","炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附"],["ab40","陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品"],["aba1","哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷"],["ac40","拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗"],["aca1","活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄"],["ad40","耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥"],["ada1","迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪"],["ae40","哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙"],["aea1","恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓"],["af40","浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷"],["afa1","砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃"],["b040","虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡"],["b0a1","陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀"],["b140","娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽"],["b1a1","情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺"],["b240","毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶"],["b2a1","瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼"],["b340","莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途"],["b3a1","部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠"],["b440","婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍"],["b4a1","插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋"],["b540","溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘"],["b5a1","窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁"],["b640","詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑"],["b6a1","間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼"],["b740","媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業"],["b7a1","楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督"],["b840","睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫"],["b8a1","腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊"],["b940","辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴"],["b9a1","飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇"],["ba40","愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢"],["baa1","滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬"],["bb40","罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤"],["bba1","說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜"],["bc40","劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂"],["bca1","慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃"],["bd40","瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯"],["bda1","翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞"],["be40","輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉"],["bea1","鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡"],["bf40","濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊"],["bfa1","縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚"],["c040","錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇"],["c0a1","嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬"],["c140","瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪"],["c1a1","薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁"],["c240","駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘"],["c2a1","癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦"],["c340","鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸"],["c3a1","獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類"],["c440","願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼"],["c4a1","纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴"],["c540","護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬"],["c5a1","禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒"],["c640","讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲"],["c940","乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕"],["c9a1","氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋"],["ca40","汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘"],["caa1","吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇"],["cb40","杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓"],["cba1","芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢"],["cc40","坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋"],["cca1","怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲"],["cd40","泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺"],["cda1","矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏"],["ce40","哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛"],["cea1","峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺"],["cf40","柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂"],["cfa1","洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀"],["d040","穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪"],["d0a1","苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱"],["d140","唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧"],["d1a1","恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤"],["d240","毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸"],["d2a1","牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐"],["d340","笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢"],["d3a1","荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐"],["d440","酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅"],["d4a1","唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏"],["d540","崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟"],["d5a1","捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉"],["d640","淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏"],["d6a1","痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟"],["d740","耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷"],["d7a1","蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪"],["d840","釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷"],["d8a1","堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔"],["d940","惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒"],["d9a1","晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞"],["da40","湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖"],["daa1","琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥"],["db40","罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳"],["dba1","菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺"],["dc40","軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈"],["dca1","隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆"],["dd40","媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤"],["dda1","搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼"],["de40","毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓"],["dea1","煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓"],["df40","稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯"],["dfa1","腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤"],["e040","觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿"],["e0a1","遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠"],["e140","凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠"],["e1a1","寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉"],["e240","榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊"],["e2a1","漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓"],["e340","禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞"],["e3a1","耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻"],["e440","裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍"],["e4a1","銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘"],["e540","噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉"],["e5a1","憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒"],["e640","澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙"],["e6a1","獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟"],["e740","膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢"],["e7a1","蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧"],["e840","踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓"],["e8a1","銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮"],["e940","噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺"],["e9a1","憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸"],["ea40","澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙"],["eaa1","瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘"],["eb40","蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠"],["eba1","諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌"],["ec40","錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕"],["eca1","魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎"],["ed40","檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶"],["eda1","瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞"],["ee40","蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞"],["eea1","謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜"],["ef40","鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰"],["efa1","鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶"],["f040","璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒"],["f0a1","臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧"],["f140","蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪"],["f1a1","鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰"],["f240","徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛"],["f2a1","礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕"],["f340","譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦"],["f3a1","鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲"],["f440","嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩"],["f4a1","禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿"],["f540","鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛"],["f5a1","鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥"],["f640","蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺"],["f6a1","騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚"],["f740","糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊"],["f7a1","驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾"],["f840","讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏"],["f8a1","齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚"],["f940","纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊"],["f9a1","龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓"]]
19846 /***/ }),
19847 /* 93 */
19848 /***/ (function(module, exports, __webpack_require__) {
19850 // Generated by CoffeeScript 1.7.1
19851 (function() {
19852   var ArrayT, NumberT, utils;
19854   NumberT = __webpack_require__(22).Number;
19856   utils = __webpack_require__(12);
19858   ArrayT = (function() {
19859     function ArrayT(type, length, lengthType) {
19860       this.type = type;
19861       this.length = length;
19862       this.lengthType = lengthType != null ? lengthType : 'count';
19863     }
19865     ArrayT.prototype.decode = function(stream, parent) {
19866       var ctx, i, length, pos, res, target, _i;
19867       pos = stream.pos;
19868       res = [];
19869       ctx = parent;
19870       if (this.length != null) {
19871         length = utils.resolveLength(this.length, stream, parent);
19872       }
19873       if (this.length instanceof NumberT) {
19874         Object.defineProperties(res, {
19875           parent: {
19876             value: parent
19877           },
19878           _startOffset: {
19879             value: pos
19880           },
19881           _currentOffset: {
19882             value: 0,
19883             writable: true
19884           },
19885           _length: {
19886             value: length
19887           }
19888         });
19889         ctx = res;
19890       }
19891       if ((length == null) || this.lengthType === 'bytes') {
19892         target = length != null ? stream.pos + length : (parent != null ? parent._length : void 0) ? parent._startOffset + parent._length : stream.length;
19893         while (stream.pos < target) {
19894           res.push(this.type.decode(stream, ctx));
19895         }
19896       } else {
19897         for (i = _i = 0; _i < length; i = _i += 1) {
19898           res.push(this.type.decode(stream, ctx));
19899         }
19900       }
19901       return res;
19902     };
19904     ArrayT.prototype.size = function(array, ctx) {
19905       var item, size, _i, _len;
19906       if (!array) {
19907         return this.type.size(null, ctx) * utils.resolveLength(this.length, null, ctx);
19908       }
19909       size = 0;
19910       if (this.length instanceof NumberT) {
19911         size += this.length.size();
19912         ctx = {
19913           parent: ctx
19914         };
19915       }
19916       for (_i = 0, _len = array.length; _i < _len; _i++) {
19917         item = array[_i];
19918         size += this.type.size(item, ctx);
19919       }
19920       return size;
19921     };
19923     ArrayT.prototype.encode = function(stream, array, parent) {
19924       var ctx, i, item, ptr, _i, _len;
19925       ctx = parent;
19926       if (this.length instanceof NumberT) {
19927         ctx = {
19928           pointers: [],
19929           startOffset: stream.pos,
19930           parent: parent
19931         };
19932         ctx.pointerOffset = stream.pos + this.size(array, ctx);
19933         this.length.encode(stream, array.length);
19934       }
19935       for (_i = 0, _len = array.length; _i < _len; _i++) {
19936         item = array[_i];
19937         this.type.encode(stream, item, ctx);
19938       }
19939       if (this.length instanceof NumberT) {
19940         i = 0;
19941         while (i < ctx.pointers.length) {
19942           ptr = ctx.pointers[i++];
19943           ptr.type.encode(stream, ptr.val);
19944         }
19945       }
19946     };
19948     return ArrayT;
19950   })();
19952   module.exports = ArrayT;
19954 }).call(this);
19957 /***/ }),
19958 /* 94 */
19959 /***/ (function(module, exports, __webpack_require__) {
19961 // Generated by CoffeeScript 1.7.1
19962 (function() {
19963   var Struct, utils;
19965   utils = __webpack_require__(12);
19967   Struct = (function() {
19968     function Struct(fields) {
19969       this.fields = fields != null ? fields : {};
19970     }
19972     Struct.prototype.decode = function(stream, parent, length) {
19973       var res, _ref;
19974       if (length == null) {
19975         length = 0;
19976       }
19977       res = this._setup(stream, parent, length);
19978       this._parseFields(stream, res, this.fields);
19979       if ((_ref = this.process) != null) {
19980         _ref.call(res, stream);
19981       }
19982       return res;
19983     };
19985     Struct.prototype._setup = function(stream, parent, length) {
19986       var res;
19987       res = {};
19988       Object.defineProperties(res, {
19989         parent: {
19990           value: parent
19991         },
19992         _startOffset: {
19993           value: stream.pos
19994         },
19995         _currentOffset: {
19996           value: 0,
19997           writable: true
19998         },
19999         _length: {
20000           value: length
20001         }
20002       });
20003       return res;
20004     };
20006     Struct.prototype._parseFields = function(stream, res, fields) {
20007       var key, type, val;
20008       for (key in fields) {
20009         type = fields[key];
20010         if (typeof type === 'function') {
20011           val = type.call(res, res);
20012         } else {
20013           val = type.decode(stream, res);
20014         }
20015         if (val !== void 0) {
20016           if (val instanceof utils.PropertyDescriptor) {
20017             Object.defineProperty(res, key, val);
20018           } else {
20019             res[key] = val;
20020           }
20021         }
20022         res._currentOffset = stream.pos - res._startOffset;
20023       }
20024     };
20026     Struct.prototype.size = function(val, parent, includePointers) {
20027       var ctx, key, size, type, _ref;
20028       if (val == null) {
20029         val = {};
20030       }
20031       if (includePointers == null) {
20032         includePointers = true;
20033       }
20034       ctx = {
20035         parent: parent,
20036         val: val,
20037         pointerSize: 0
20038       };
20039       size = 0;
20040       _ref = this.fields;
20041       for (key in _ref) {
20042         type = _ref[key];
20043         if (type.size != null) {
20044           size += type.size(val[key], ctx);
20045         }
20046       }
20047       if (includePointers) {
20048         size += ctx.pointerSize;
20049       }
20050       return size;
20051     };
20053     Struct.prototype.encode = function(stream, val, parent) {
20054       var ctx, i, key, ptr, type, _ref, _ref1;
20055       if ((_ref = this.preEncode) != null) {
20056         _ref.call(val, stream);
20057       }
20058       ctx = {
20059         pointers: [],
20060         startOffset: stream.pos,
20061         parent: parent,
20062         val: val,
20063         pointerSize: 0
20064       };
20065       ctx.pointerOffset = stream.pos + this.size(val, ctx, false);
20066       _ref1 = this.fields;
20067       for (key in _ref1) {
20068         type = _ref1[key];
20069         if (type.encode != null) {
20070           type.encode(stream, val[key], ctx);
20071         }
20072       }
20073       i = 0;
20074       while (i < ctx.pointers.length) {
20075         ptr = ctx.pointers[i++];
20076         ptr.type.encode(stream, ptr.val, ptr.parent);
20077       }
20078     };
20080     return Struct;
20082   })();
20084   module.exports = Struct;
20086 }).call(this);
20089 /***/ }),
20090 /* 95 */
20091 /***/ (function(module, exports, __webpack_require__) {
20093 module.exports = !__webpack_require__(5) && !__webpack_require__(19)(function () {
20094   return Object.defineProperty(__webpack_require__(96)('div'), 'a', { get: function () { return 7; } }).a != 7;
20098 /***/ }),
20099 /* 96 */
20100 /***/ (function(module, exports, __webpack_require__) {
20102 var isObject = __webpack_require__(9);
20103 var document = __webpack_require__(10).document;
20104 // typeof document.createElement is 'object' in old IE
20105 var is = isObject(document) && isObject(document.createElement);
20106 module.exports = function (it) {
20107   return is ? document.createElement(it) : {};
20111 /***/ }),
20112 /* 97 */
20113 /***/ (function(module, exports) {
20115 module.exports = function (it) {
20116   if (typeof it != 'function') throw TypeError(it + ' is not a function!');
20117   return it;
20121 /***/ }),
20122 /* 98 */
20123 /***/ (function(module, exports) {
20125 module.exports = function (done, value) {
20126   return { value: value, done: !!done };
20130 /***/ }),
20131 /* 99 */
20132 /***/ (function(module, exports, __webpack_require__) {
20134 module.exports = __webpack_require__(13);
20137 /***/ }),
20138 /* 100 */
20139 /***/ (function(module, exports, __webpack_require__) {
20141 var dP = __webpack_require__(6);
20142 var anObject = __webpack_require__(14);
20143 var getKeys = __webpack_require__(29);
20145 module.exports = __webpack_require__(5) ? Object.defineProperties : function defineProperties(O, Properties) {
20146   anObject(O);
20147   var keys = getKeys(Properties);
20148   var length = keys.length;
20149   var i = 0;
20150   var P;
20151   while (length > i) dP.f(O, P = keys[i++], Properties[P]);
20152   return O;
20156 /***/ }),
20157 /* 101 */
20158 /***/ (function(module, exports, __webpack_require__) {
20160 var has = __webpack_require__(18);
20161 var toIObject = __webpack_require__(17);
20162 var arrayIndexOf = __webpack_require__(204)(false);
20163 var IE_PROTO = __webpack_require__(64)('IE_PROTO');
20165 module.exports = function (object, names) {
20166   var O = toIObject(object);
20167   var i = 0;
20168   var result = [];
20169   var key;
20170   for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
20171   // Don't enum bug & hidden keys
20172   while (names.length > i) if (has(O, key = names[i++])) {
20173     ~arrayIndexOf(result, key) || result.push(key);
20174   }
20175   return result;
20179 /***/ }),
20180 /* 102 */
20181 /***/ (function(module, exports, __webpack_require__) {
20183 var toInteger = __webpack_require__(63);
20184 var max = Math.max;
20185 var min = Math.min;
20186 module.exports = function (index, length) {
20187   index = toInteger(index);
20188   return index < 0 ? max(index + length, 0) : min(index, length);
20192 /***/ }),
20193 /* 103 */
20194 /***/ (function(module, exports, __webpack_require__) {
20196 module.exports = { "default": __webpack_require__(215), __esModule: true };
20198 /***/ }),
20199 /* 104 */
20200 /***/ (function(module, exports, __webpack_require__) {
20202 // 7.2.2 IsArray(argument)
20203 var cof = __webpack_require__(55);
20204 module.exports = Array.isArray || function isArray(arg) {
20205   return cof(arg) == 'Array';
20209 /***/ }),
20210 /* 105 */
20211 /***/ (function(module, exports, __webpack_require__) {
20213 // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
20214 var $keys = __webpack_require__(101);
20215 var hiddenKeys = __webpack_require__(66).concat('length', 'prototype');
20217 exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
20218   return $keys(O, hiddenKeys);
20222 /***/ }),
20223 /* 106 */
20224 /***/ (function(module, exports, __webpack_require__) {
20226 "use strict";
20229 exports.__esModule = true;
20231 exports.default = function (instance, Constructor) {
20232   if (!(instance instanceof Constructor)) {
20233     throw new TypeError("Cannot call a class as a function");
20234   }
20237 /***/ }),
20238 /* 107 */
20239 /***/ (function(module, exports, __webpack_require__) {
20241 "use strict";
20244 exports.__esModule = true;
20246 var _defineProperty = __webpack_require__(74);
20248 var _defineProperty2 = _interopRequireDefault(_defineProperty);
20250 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20252 exports.default = function () {
20253   function defineProperties(target, props) {
20254     for (var i = 0; i < props.length; i++) {
20255       var descriptor = props[i];
20256       descriptor.enumerable = descriptor.enumerable || false;
20257       descriptor.configurable = true;
20258       if ("value" in descriptor) descriptor.writable = true;
20259       (0, _defineProperty2.default)(target, descriptor.key, descriptor);
20260     }
20261   }
20263   return function (Constructor, protoProps, staticProps) {
20264     if (protoProps) defineProperties(Constructor.prototype, protoProps);
20265     if (staticProps) defineProperties(Constructor, staticProps);
20266     return Constructor;
20267   };
20268 }();
20270 /***/ }),
20271 /* 108 */
20272 /***/ (function(module, exports, __webpack_require__) {
20274 "use strict";
20276 var dP = __webpack_require__(6).f;
20277 var create = __webpack_require__(36);
20278 var redefineAll = __webpack_require__(109);
20279 var ctx = __webpack_require__(20);
20280 var anInstance = __webpack_require__(110);
20281 var forOf = __webpack_require__(41);
20282 var $iterDefine = __webpack_require__(61);
20283 var step = __webpack_require__(98);
20284 var setSpecies = __webpack_require__(228);
20285 var DESCRIPTORS = __webpack_require__(5);
20286 var fastKey = __webpack_require__(40).fastKey;
20287 var validate = __webpack_require__(75);
20288 var SIZE = DESCRIPTORS ? '_s' : 'size';
20290 var getEntry = function (that, key) {
20291   // fast case
20292   var index = fastKey(key);
20293   var entry;
20294   if (index !== 'F') return that._i[index];
20295   // frozen object case
20296   for (entry = that._f; entry; entry = entry.n) {
20297     if (entry.k == key) return entry;
20298   }
20301 module.exports = {
20302   getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {
20303     var C = wrapper(function (that, iterable) {
20304       anInstance(that, C, NAME, '_i');
20305       that._t = NAME;         // collection type
20306       that._i = create(null); // index
20307       that._f = undefined;    // first entry
20308       that._l = undefined;    // last entry
20309       that[SIZE] = 0;         // size
20310       if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
20311     });
20312     redefineAll(C.prototype, {
20313       // 23.1.3.1 Map.prototype.clear()
20314       // 23.2.3.2 Set.prototype.clear()
20315       clear: function clear() {
20316         for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {
20317           entry.r = true;
20318           if (entry.p) entry.p = entry.p.n = undefined;
20319           delete data[entry.i];
20320         }
20321         that._f = that._l = undefined;
20322         that[SIZE] = 0;
20323       },
20324       // 23.1.3.3 Map.prototype.delete(key)
20325       // 23.2.3.4 Set.prototype.delete(value)
20326       'delete': function (key) {
20327         var that = validate(this, NAME);
20328         var entry = getEntry(that, key);
20329         if (entry) {
20330           var next = entry.n;
20331           var prev = entry.p;
20332           delete that._i[entry.i];
20333           entry.r = true;
20334           if (prev) prev.n = next;
20335           if (next) next.p = prev;
20336           if (that._f == entry) that._f = next;
20337           if (that._l == entry) that._l = prev;
20338           that[SIZE]--;
20339         } return !!entry;
20340       },
20341       // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
20342       // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
20343       forEach: function forEach(callbackfn /* , that = undefined */) {
20344         validate(this, NAME);
20345         var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
20346         var entry;
20347         while (entry = entry ? entry.n : this._f) {
20348           f(entry.v, entry.k, this);
20349           // revert to the last existing entry
20350           while (entry && entry.r) entry = entry.p;
20351         }
20352       },
20353       // 23.1.3.7 Map.prototype.has(key)
20354       // 23.2.3.7 Set.prototype.has(value)
20355       has: function has(key) {
20356         return !!getEntry(validate(this, NAME), key);
20357       }
20358     });
20359     if (DESCRIPTORS) dP(C.prototype, 'size', {
20360       get: function () {
20361         return validate(this, NAME)[SIZE];
20362       }
20363     });
20364     return C;
20365   },
20366   def: function (that, key, value) {
20367     var entry = getEntry(that, key);
20368     var prev, index;
20369     // change existing entry
20370     if (entry) {
20371       entry.v = value;
20372     // create new entry
20373     } else {
20374       that._l = entry = {
20375         i: index = fastKey(key, true), // <- index
20376         k: key,                        // <- key
20377         v: value,                      // <- value
20378         p: prev = that._l,             // <- previous entry
20379         n: undefined,                  // <- next entry
20380         r: false                       // <- removed
20381       };
20382       if (!that._f) that._f = entry;
20383       if (prev) prev.n = entry;
20384       that[SIZE]++;
20385       // add to index
20386       if (index !== 'F') that._i[index] = entry;
20387     } return that;
20388   },
20389   getEntry: getEntry,
20390   setStrong: function (C, NAME, IS_MAP) {
20391     // add .keys, .values, .entries, [@@iterator]
20392     // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
20393     $iterDefine(C, NAME, function (iterated, kind) {
20394       this._t = validate(iterated, NAME); // target
20395       this._k = kind;                     // kind
20396       this._l = undefined;                // previous
20397     }, function () {
20398       var that = this;
20399       var kind = that._k;
20400       var entry = that._l;
20401       // revert to the last existing entry
20402       while (entry && entry.r) entry = entry.p;
20403       // get next entry
20404       if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {
20405         // or finish the iteration
20406         that._t = undefined;
20407         return step(1);
20408       }
20409       // return step by kind
20410       if (kind == 'keys') return step(0, entry.k);
20411       if (kind == 'values') return step(0, entry.v);
20412       return step(0, [entry.k, entry.v]);
20413     }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);
20415     // add [@@species], 23.1.2.2, 23.2.2.2
20416     setSpecies(NAME);
20417   }
20421 /***/ }),
20422 /* 109 */
20423 /***/ (function(module, exports, __webpack_require__) {
20425 var hide = __webpack_require__(13);
20426 module.exports = function (target, src, safe) {
20427   for (var key in src) {
20428     if (safe && target[key]) target[key] = src[key];
20429     else hide(target, key, src[key]);
20430   } return target;
20434 /***/ }),
20435 /* 110 */
20436 /***/ (function(module, exports) {
20438 module.exports = function (it, Constructor, name, forbiddenField) {
20439   if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {
20440     throw TypeError(name + ': incorrect invocation!');
20441   } return it;
20445 /***/ }),
20446 /* 111 */
20447 /***/ (function(module, exports, __webpack_require__) {
20449 // call something on iterator step with safe closing on error
20450 var anObject = __webpack_require__(14);
20451 module.exports = function (iterator, fn, value, entries) {
20452   try {
20453     return entries ? fn(anObject(value)[0], value[1]) : fn(value);
20454   // 7.4.6 IteratorClose(iterator, completion)
20455   } catch (e) {
20456     var ret = iterator['return'];
20457     if (ret !== undefined) anObject(ret.call(iterator));
20458     throw e;
20459   }
20463 /***/ }),
20464 /* 112 */
20465 /***/ (function(module, exports, __webpack_require__) {
20467 // check on default Array iterator
20468 var Iterators = __webpack_require__(23);
20469 var ITERATOR = __webpack_require__(4)('iterator');
20470 var ArrayProto = Array.prototype;
20472 module.exports = function (it) {
20473   return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
20477 /***/ }),
20478 /* 113 */
20479 /***/ (function(module, exports, __webpack_require__) {
20481 "use strict";
20483 var global = __webpack_require__(10);
20484 var $export = __webpack_require__(3);
20485 var meta = __webpack_require__(40);
20486 var fails = __webpack_require__(19);
20487 var hide = __webpack_require__(13);
20488 var redefineAll = __webpack_require__(109);
20489 var forOf = __webpack_require__(41);
20490 var anInstance = __webpack_require__(110);
20491 var isObject = __webpack_require__(9);
20492 var setToStringTag = __webpack_require__(39);
20493 var dP = __webpack_require__(6).f;
20494 var each = __webpack_require__(229)(0);
20495 var DESCRIPTORS = __webpack_require__(5);
20497 module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
20498   var Base = global[NAME];
20499   var C = Base;
20500   var ADDER = IS_MAP ? 'set' : 'add';
20501   var proto = C && C.prototype;
20502   var O = {};
20503   if (!DESCRIPTORS || typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {
20504     new C().entries().next();
20505   }))) {
20506     // create collection constructor
20507     C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
20508     redefineAll(C.prototype, methods);
20509     meta.NEED = true;
20510   } else {
20511     C = wrapper(function (target, iterable) {
20512       anInstance(target, C, NAME, '_c');
20513       target._c = new Base();
20514       if (iterable != undefined) forOf(iterable, IS_MAP, target[ADDER], target);
20515     });
20516     each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','), function (KEY) {
20517       var IS_ADDER = KEY == 'add' || KEY == 'set';
20518       if (KEY in proto && !(IS_WEAK && KEY == 'clear')) hide(C.prototype, KEY, function (a, b) {
20519         anInstance(this, C, KEY);
20520         if (!IS_ADDER && IS_WEAK && !isObject(a)) return KEY == 'get' ? undefined : false;
20521         var result = this._c[KEY](a === 0 ? 0 : a, b);
20522         return IS_ADDER ? this : result;
20523       });
20524     });
20525     IS_WEAK || dP(C.prototype, 'size', {
20526       get: function () {
20527         return this._c.size;
20528       }
20529     });
20530   }
20532   setToStringTag(C, NAME);
20534   O[NAME] = C;
20535   $export($export.G + $export.W + $export.F, O);
20537   if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);
20539   return C;
20543 /***/ }),
20544 /* 114 */
20545 /***/ (function(module, exports, __webpack_require__) {
20547 // https://github.com/DavidBruant/Map-Set.prototype.toJSON
20548 var classof = __webpack_require__(68);
20549 var from = __webpack_require__(233);
20550 module.exports = function (NAME) {
20551   return function toJSON() {
20552     if (classof(this) != NAME) throw TypeError(NAME + "#toJSON isn't generic");
20553     return from(this);
20554   };
20558 /***/ }),
20559 /* 115 */
20560 /***/ (function(module, exports, __webpack_require__) {
20562 "use strict";
20564 // https://tc39.github.io/proposal-setmap-offrom/
20565 var $export = __webpack_require__(3);
20567 module.exports = function (COLLECTION) {
20568   $export($export.S, COLLECTION, { of: function of() {
20569     var length = arguments.length;
20570     var A = new Array(length);
20571     while (length--) A[length] = arguments[length];
20572     return new this(A);
20573   } });
20577 /***/ }),
20578 /* 116 */
20579 /***/ (function(module, exports, __webpack_require__) {
20581 "use strict";
20583 // https://tc39.github.io/proposal-setmap-offrom/
20584 var $export = __webpack_require__(3);
20585 var aFunction = __webpack_require__(97);
20586 var ctx = __webpack_require__(20);
20587 var forOf = __webpack_require__(41);
20589 module.exports = function (COLLECTION) {
20590   $export($export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) {
20591     var mapFn = arguments[1];
20592     var mapping, A, n, cb;
20593     aFunction(this);
20594     mapping = mapFn !== undefined;
20595     if (mapping) aFunction(mapFn);
20596     if (source == undefined) return new this();
20597     A = [];
20598     if (mapping) {
20599       n = 0;
20600       cb = ctx(mapFn, arguments[2], 2);
20601       forOf(source, false, function (nextItem) {
20602         A.push(cb(nextItem, n++));
20603       });
20604     } else {
20605       forOf(source, false, A.push, A);
20606     }
20607     return new this(A);
20608   } });
20612 /***/ }),
20613 /* 117 */
20614 /***/ (function(module, exports, __webpack_require__) {
20616 /* Copyright 2013 Google Inc. All Rights Reserved.
20618    Licensed under the Apache License, Version 2.0 (the "License");
20619    you may not use this file except in compliance with the License.
20620    You may obtain a copy of the License at
20622    http://www.apache.org/licenses/LICENSE-2.0
20624    Unless required by applicable law or agreed to in writing, software
20625    distributed under the License is distributed on an "AS IS" BASIS,
20626    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20627    See the License for the specific language governing permissions and
20628    limitations under the License.
20631 var BrotliInput = __webpack_require__(118).BrotliInput;
20632 var BrotliOutput = __webpack_require__(118).BrotliOutput;
20633 var BrotliBitReader = __webpack_require__(285);
20634 var BrotliDictionary = __webpack_require__(119);
20635 var HuffmanCode = __webpack_require__(120).HuffmanCode;
20636 var BrotliBuildHuffmanTable = __webpack_require__(120).BrotliBuildHuffmanTable;
20637 var Context = __webpack_require__(289);
20638 var Prefix = __webpack_require__(290);
20639 var Transform = __webpack_require__(291);
20641 var kDefaultCodeLength = 8;
20642 var kCodeLengthRepeatCode = 16;
20643 var kNumLiteralCodes = 256;
20644 var kNumInsertAndCopyCodes = 704;
20645 var kNumBlockLengthCodes = 26;
20646 var kLiteralContextBits = 6;
20647 var kDistanceContextBits = 2;
20649 var HUFFMAN_TABLE_BITS = 8;
20650 var HUFFMAN_TABLE_MASK = 0xff;
20651 /* Maximum possible Huffman table size for an alphabet size of 704, max code
20652  * length 15 and root table bits 8. */
20653 var HUFFMAN_MAX_TABLE_SIZE = 1080;
20655 var CODE_LENGTH_CODES = 18;
20656 var kCodeLengthCodeOrder = new Uint8Array([
20657   1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,
20660 var NUM_DISTANCE_SHORT_CODES = 16;
20661 var kDistanceShortCodeIndexOffset = new Uint8Array([
20662   3, 2, 1, 0, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2
20665 var kDistanceShortCodeValueOffset = new Int8Array([
20666   0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3
20669 var kMaxHuffmanTableSize = new Uint16Array([
20670   256, 402, 436, 468, 500, 534, 566, 598, 630, 662, 694, 726, 758, 790, 822,
20671   854, 886, 920, 952, 984, 1016, 1048, 1080
20674 function DecodeWindowBits(br) {
20675   var n;
20676   if (br.readBits(1) === 0) {
20677     return 16;
20678   }
20680   n = br.readBits(3);
20681   if (n > 0) {
20682     return 17 + n;
20683   }
20685   n = br.readBits(3);
20686   if (n > 0) {
20687     return 8 + n;
20688   }
20690   return 17;
20693 /* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
20694 function DecodeVarLenUint8(br) {
20695   if (br.readBits(1)) {
20696     var nbits = br.readBits(3);
20697     if (nbits === 0) {
20698       return 1;
20699     } else {
20700       return br.readBits(nbits) + (1 << nbits);
20701     }
20702   }
20703   return 0;
20706 function MetaBlockLength() {
20707   this.meta_block_length = 0;
20708   this.input_end = 0;
20709   this.is_uncompressed = 0;
20710   this.is_metadata = false;
20713 function DecodeMetaBlockLength(br) {
20714   var out = new MetaBlockLength;
20715   var size_nibbles;
20716   var size_bytes;
20717   var i;
20719   out.input_end = br.readBits(1);
20720   if (out.input_end && br.readBits(1)) {
20721     return out;
20722   }
20724   size_nibbles = br.readBits(2) + 4;
20725   if (size_nibbles === 7) {
20726     out.is_metadata = true;
20728     if (br.readBits(1) !== 0)
20729       throw new Error('Invalid reserved bit');
20731     size_bytes = br.readBits(2);
20732     if (size_bytes === 0)
20733       return out;
20735     for (i = 0; i < size_bytes; i++) {
20736       var next_byte = br.readBits(8);
20737       if (i + 1 === size_bytes && size_bytes > 1 && next_byte === 0)
20738         throw new Error('Invalid size byte');
20740       out.meta_block_length |= next_byte << (i * 8);
20741     }
20742   } else {
20743     for (i = 0; i < size_nibbles; ++i) {
20744       var next_nibble = br.readBits(4);
20745       if (i + 1 === size_nibbles && size_nibbles > 4 && next_nibble === 0)
20746         throw new Error('Invalid size nibble');
20748       out.meta_block_length |= next_nibble << (i * 4);
20749     }
20750   }
20752   ++out.meta_block_length;
20754   if (!out.input_end && !out.is_metadata) {
20755     out.is_uncompressed = br.readBits(1);
20756   }
20758   return out;
20761 /* Decodes the next Huffman code from bit-stream. */
20762 function ReadSymbol(table, index, br) {
20763   var start_index = index;
20765   var nbits;
20766   br.fillBitWindow();
20767   index += (br.val_ >>> br.bit_pos_) & HUFFMAN_TABLE_MASK;
20768   nbits = table[index].bits - HUFFMAN_TABLE_BITS;
20769   if (nbits > 0) {
20770     br.bit_pos_ += HUFFMAN_TABLE_BITS;
20771     index += table[index].value;
20772     index += (br.val_ >>> br.bit_pos_) & ((1 << nbits) - 1);
20773   }
20774   br.bit_pos_ += table[index].bits;
20775   return table[index].value;
20778 function ReadHuffmanCodeLengths(code_length_code_lengths, num_symbols, code_lengths, br) {
20779   var symbol = 0;
20780   var prev_code_len = kDefaultCodeLength;
20781   var repeat = 0;
20782   var repeat_code_len = 0;
20783   var space = 32768;
20785   var table = [];
20786   for (var i = 0; i < 32; i++)
20787     table.push(new HuffmanCode(0, 0));
20789   BrotliBuildHuffmanTable(table, 0, 5, code_length_code_lengths, CODE_LENGTH_CODES);
20791   while (symbol < num_symbols && space > 0) {
20792     var p = 0;
20793     var code_len;
20795     br.readMoreInput();
20796     br.fillBitWindow();
20797     p += (br.val_ >>> br.bit_pos_) & 31;
20798     br.bit_pos_ += table[p].bits;
20799     code_len = table[p].value & 0xff;
20800     if (code_len < kCodeLengthRepeatCode) {
20801       repeat = 0;
20802       code_lengths[symbol++] = code_len;
20803       if (code_len !== 0) {
20804         prev_code_len = code_len;
20805         space -= 32768 >> code_len;
20806       }
20807     } else {
20808       var extra_bits = code_len - 14;
20809       var old_repeat;
20810       var repeat_delta;
20811       var new_len = 0;
20812       if (code_len === kCodeLengthRepeatCode) {
20813         new_len = prev_code_len;
20814       }
20815       if (repeat_code_len !== new_len) {
20816         repeat = 0;
20817         repeat_code_len = new_len;
20818       }
20819       old_repeat = repeat;
20820       if (repeat > 0) {
20821         repeat -= 2;
20822         repeat <<= extra_bits;
20823       }
20824       repeat += br.readBits(extra_bits) + 3;
20825       repeat_delta = repeat - old_repeat;
20826       if (symbol + repeat_delta > num_symbols) {
20827         throw new Error('[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols');
20828       }
20830       for (var x = 0; x < repeat_delta; x++)
20831         code_lengths[symbol + x] = repeat_code_len;
20833       symbol += repeat_delta;
20835       if (repeat_code_len !== 0) {
20836         space -= repeat_delta << (15 - repeat_code_len);
20837       }
20838     }
20839   }
20840   if (space !== 0) {
20841     throw new Error("[ReadHuffmanCodeLengths] space = " + space);
20842   }
20844   for (; symbol < num_symbols; symbol++)
20845     code_lengths[symbol] = 0;
20848 function ReadHuffmanCode(alphabet_size, tables, table, br) {
20849   var table_size = 0;
20850   var simple_code_or_skip;
20851   var code_lengths = new Uint8Array(alphabet_size);
20853   br.readMoreInput();
20855   /* simple_code_or_skip is used as follows:
20856      1 for simple code;
20857      0 for no skipping, 2 skips 2 code lengths, 3 skips 3 code lengths */
20858   simple_code_or_skip = br.readBits(2);
20859   if (simple_code_or_skip === 1) {
20860     /* Read symbols, codes & code lengths directly. */
20861     var i;
20862     var max_bits_counter = alphabet_size - 1;
20863     var max_bits = 0;
20864     var symbols = new Int32Array(4);
20865     var num_symbols = br.readBits(2) + 1;
20866     while (max_bits_counter) {
20867       max_bits_counter >>= 1;
20868       ++max_bits;
20869     }
20871     for (i = 0; i < num_symbols; ++i) {
20872       symbols[i] = br.readBits(max_bits) % alphabet_size;
20873       code_lengths[symbols[i]] = 2;
20874     }
20875     code_lengths[symbols[0]] = 1;
20876     switch (num_symbols) {
20877       case 1:
20878         break;
20879       case 3:
20880         if ((symbols[0] === symbols[1]) ||
20881             (symbols[0] === symbols[2]) ||
20882             (symbols[1] === symbols[2])) {
20883           throw new Error('[ReadHuffmanCode] invalid symbols');
20884         }
20885         break;
20886       case 2:
20887         if (symbols[0] === symbols[1]) {
20888           throw new Error('[ReadHuffmanCode] invalid symbols');
20889         }
20891         code_lengths[symbols[1]] = 1;
20892         break;
20893       case 4:
20894         if ((symbols[0] === symbols[1]) ||
20895             (symbols[0] === symbols[2]) ||
20896             (symbols[0] === symbols[3]) ||
20897             (symbols[1] === symbols[2]) ||
20898             (symbols[1] === symbols[3]) ||
20899             (symbols[2] === symbols[3])) {
20900           throw new Error('[ReadHuffmanCode] invalid symbols');
20901         }
20903         if (br.readBits(1)) {
20904           code_lengths[symbols[2]] = 3;
20905           code_lengths[symbols[3]] = 3;
20906         } else {
20907           code_lengths[symbols[0]] = 2;
20908         }
20909         break;
20910     }
20911   } else {  /* Decode Huffman-coded code lengths. */
20912     var i;
20913     var code_length_code_lengths = new Uint8Array(CODE_LENGTH_CODES);
20914     var space = 32;
20915     var num_codes = 0;
20916     /* Static Huffman code for the code length code lengths */
20917     var huff = [
20918       new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(3, 2),
20919       new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(4, 1),
20920       new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(3, 2),
20921       new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(4, 5)
20922     ];
20923     for (i = simple_code_or_skip; i < CODE_LENGTH_CODES && space > 0; ++i) {
20924       var code_len_idx = kCodeLengthCodeOrder[i];
20925       var p = 0;
20926       var v;
20927       br.fillBitWindow();
20928       p += (br.val_ >>> br.bit_pos_) & 15;
20929       br.bit_pos_ += huff[p].bits;
20930       v = huff[p].value;
20931       code_length_code_lengths[code_len_idx] = v;
20932       if (v !== 0) {
20933         space -= (32 >> v);
20934         ++num_codes;
20935       }
20936     }
20938     if (!(num_codes === 1 || space === 0))
20939       throw new Error('[ReadHuffmanCode] invalid num_codes or space');
20941     ReadHuffmanCodeLengths(code_length_code_lengths, alphabet_size, code_lengths, br);
20942   }
20944   table_size = BrotliBuildHuffmanTable(tables, table, HUFFMAN_TABLE_BITS, code_lengths, alphabet_size);
20946   if (table_size === 0) {
20947     throw new Error("[ReadHuffmanCode] BuildHuffmanTable failed: ");
20948   }
20950   return table_size;
20953 function ReadBlockLength(table, index, br) {
20954   var code;
20955   var nbits;
20956   code = ReadSymbol(table, index, br);
20957   nbits = Prefix.kBlockLengthPrefixCode[code].nbits;
20958   return Prefix.kBlockLengthPrefixCode[code].offset + br.readBits(nbits);
20961 function TranslateShortCodes(code, ringbuffer, index) {
20962   var val;
20963   if (code < NUM_DISTANCE_SHORT_CODES) {
20964     index += kDistanceShortCodeIndexOffset[code];
20965     index &= 3;
20966     val = ringbuffer[index] + kDistanceShortCodeValueOffset[code];
20967   } else {
20968     val = code - NUM_DISTANCE_SHORT_CODES + 1;
20969   }
20970   return val;
20973 function MoveToFront(v, index) {
20974   var value = v[index];
20975   var i = index;
20976   for (; i; --i) v[i] = v[i - 1];
20977   v[0] = value;
20980 function InverseMoveToFrontTransform(v, v_len) {
20981   var mtf = new Uint8Array(256);
20982   var i;
20983   for (i = 0; i < 256; ++i) {
20984     mtf[i] = i;
20985   }
20986   for (i = 0; i < v_len; ++i) {
20987     var index = v[i];
20988     v[i] = mtf[index];
20989     if (index) MoveToFront(mtf, index);
20990   }
20993 /* Contains a collection of huffman trees with the same alphabet size. */
20994 function HuffmanTreeGroup(alphabet_size, num_htrees) {
20995   this.alphabet_size = alphabet_size;
20996   this.num_htrees = num_htrees;
20997   this.codes = new Array(num_htrees + num_htrees * kMaxHuffmanTableSize[(alphabet_size + 31) >>> 5]);
20998   this.htrees = new Uint32Array(num_htrees);
21001 HuffmanTreeGroup.prototype.decode = function(br) {
21002   var i;
21003   var table_size;
21004   var next = 0;
21005   for (i = 0; i < this.num_htrees; ++i) {
21006     this.htrees[i] = next;
21007     table_size = ReadHuffmanCode(this.alphabet_size, this.codes, next, br);
21008     next += table_size;
21009   }
21012 function DecodeContextMap(context_map_size, br) {
21013   var out = { num_htrees: null, context_map: null };
21014   var use_rle_for_zeros;
21015   var max_run_length_prefix = 0;
21016   var table;
21017   var i;
21019   br.readMoreInput();
21020   var num_htrees = out.num_htrees = DecodeVarLenUint8(br) + 1;
21022   var context_map = out.context_map = new Uint8Array(context_map_size);
21023   if (num_htrees <= 1) {
21024     return out;
21025   }
21027   use_rle_for_zeros = br.readBits(1);
21028   if (use_rle_for_zeros) {
21029     max_run_length_prefix = br.readBits(4) + 1;
21030   }
21032   table = [];
21033   for (i = 0; i < HUFFMAN_MAX_TABLE_SIZE; i++) {
21034     table[i] = new HuffmanCode(0, 0);
21035   }
21037   ReadHuffmanCode(num_htrees + max_run_length_prefix, table, 0, br);
21039   for (i = 0; i < context_map_size;) {
21040     var code;
21042     br.readMoreInput();
21043     code = ReadSymbol(table, 0, br);
21044     if (code === 0) {
21045       context_map[i] = 0;
21046       ++i;
21047     } else if (code <= max_run_length_prefix) {
21048       var reps = 1 + (1 << code) + br.readBits(code);
21049       while (--reps) {
21050         if (i >= context_map_size) {
21051           throw new Error("[DecodeContextMap] i >= context_map_size");
21052         }
21053         context_map[i] = 0;
21054         ++i;
21055       }
21056     } else {
21057       context_map[i] = code - max_run_length_prefix;
21058       ++i;
21059     }
21060   }
21061   if (br.readBits(1)) {
21062     InverseMoveToFrontTransform(context_map, context_map_size);
21063   }
21065   return out;
21068 function DecodeBlockType(max_block_type, trees, tree_type, block_types, ringbuffers, indexes, br) {
21069   var ringbuffer = tree_type * 2;
21070   var index = tree_type;
21071   var type_code = ReadSymbol(trees, tree_type * HUFFMAN_MAX_TABLE_SIZE, br);
21072   var block_type;
21073   if (type_code === 0) {
21074     block_type = ringbuffers[ringbuffer + (indexes[index] & 1)];
21075   } else if (type_code === 1) {
21076     block_type = ringbuffers[ringbuffer + ((indexes[index] - 1) & 1)] + 1;
21077   } else {
21078     block_type = type_code - 2;
21079   }
21080   if (block_type >= max_block_type) {
21081     block_type -= max_block_type;
21082   }
21083   block_types[tree_type] = block_type;
21084   ringbuffers[ringbuffer + (indexes[index] & 1)] = block_type;
21085   ++indexes[index];
21088 function CopyUncompressedBlockToOutput(output, len, pos, ringbuffer, ringbuffer_mask, br) {
21089   var rb_size = ringbuffer_mask + 1;
21090   var rb_pos = pos & ringbuffer_mask;
21091   var br_pos = br.pos_ & BrotliBitReader.IBUF_MASK;
21092   var nbytes;
21094   /* For short lengths copy byte-by-byte */
21095   if (len < 8 || br.bit_pos_ + (len << 3) < br.bit_end_pos_) {
21096     while (len-- > 0) {
21097       br.readMoreInput();
21098       ringbuffer[rb_pos++] = br.readBits(8);
21099       if (rb_pos === rb_size) {
21100         output.write(ringbuffer, rb_size);
21101         rb_pos = 0;
21102       }
21103     }
21104     return;
21105   }
21107   if (br.bit_end_pos_ < 32) {
21108     throw new Error('[CopyUncompressedBlockToOutput] br.bit_end_pos_ < 32');
21109   }
21111   /* Copy remaining 0-4 bytes from br.val_ to ringbuffer. */
21112   while (br.bit_pos_ < 32) {
21113     ringbuffer[rb_pos] = (br.val_ >>> br.bit_pos_);
21114     br.bit_pos_ += 8;
21115     ++rb_pos;
21116     --len;
21117   }
21119   /* Copy remaining bytes from br.buf_ to ringbuffer. */
21120   nbytes = (br.bit_end_pos_ - br.bit_pos_) >> 3;
21121   if (br_pos + nbytes > BrotliBitReader.IBUF_MASK) {
21122     var tail = BrotliBitReader.IBUF_MASK + 1 - br_pos;
21123     for (var x = 0; x < tail; x++)
21124       ringbuffer[rb_pos + x] = br.buf_[br_pos + x];
21126     nbytes -= tail;
21127     rb_pos += tail;
21128     len -= tail;
21129     br_pos = 0;
21130   }
21132   for (var x = 0; x < nbytes; x++)
21133     ringbuffer[rb_pos + x] = br.buf_[br_pos + x];
21135   rb_pos += nbytes;
21136   len -= nbytes;
21138   /* If we wrote past the logical end of the ringbuffer, copy the tail of the
21139      ringbuffer to its beginning and flush the ringbuffer to the output. */
21140   if (rb_pos >= rb_size) {
21141     output.write(ringbuffer, rb_size);
21142     rb_pos -= rb_size;
21143     for (var x = 0; x < rb_pos; x++)
21144       ringbuffer[x] = ringbuffer[rb_size + x];
21145   }
21147   /* If we have more to copy than the remaining size of the ringbuffer, then we
21148      first fill the ringbuffer from the input and then flush the ringbuffer to
21149      the output */
21150   while (rb_pos + len >= rb_size) {
21151     nbytes = rb_size - rb_pos;
21152     if (br.input_.read(ringbuffer, rb_pos, nbytes) < nbytes) {
21153       throw new Error('[CopyUncompressedBlockToOutput] not enough bytes');
21154     }
21155     output.write(ringbuffer, rb_size);
21156     len -= nbytes;
21157     rb_pos = 0;
21158   }
21160   /* Copy straight from the input onto the ringbuffer. The ringbuffer will be
21161      flushed to the output at a later time. */
21162   if (br.input_.read(ringbuffer, rb_pos, len) < len) {
21163     throw new Error('[CopyUncompressedBlockToOutput] not enough bytes');
21164   }
21166   /* Restore the state of the bit reader. */
21167   br.reset();
21170 /* Advances the bit reader position to the next byte boundary and verifies
21171    that any skipped bits are set to zero. */
21172 function JumpToByteBoundary(br) {
21173   var new_bit_pos = (br.bit_pos_ + 7) & ~7;
21174   var pad_bits = br.readBits(new_bit_pos - br.bit_pos_);
21175   return pad_bits == 0;
21178 function BrotliDecompressedSize(buffer) {
21179   var input = new BrotliInput(buffer);
21180   var br = new BrotliBitReader(input);
21181   DecodeWindowBits(br);
21182   var out = DecodeMetaBlockLength(br);
21183   return out.meta_block_length;
21186 exports.BrotliDecompressedSize = BrotliDecompressedSize;
21188 function BrotliDecompressBuffer(buffer, output_size) {
21189   var input = new BrotliInput(buffer);
21191   if (output_size == null) {
21192     output_size = BrotliDecompressedSize(buffer);
21193   }
21195   var output_buffer = new Uint8Array(output_size);
21196   var output = new BrotliOutput(output_buffer);
21198   BrotliDecompress(input, output);
21200   if (output.pos < output.buffer.length) {
21201     output.buffer = output.buffer.subarray(0, output.pos);
21202   }
21204   return output.buffer;
21207 exports.BrotliDecompressBuffer = BrotliDecompressBuffer;
21209 function BrotliDecompress(input, output) {
21210   var i;
21211   var pos = 0;
21212   var input_end = 0;
21213   var window_bits = 0;
21214   var max_backward_distance;
21215   var max_distance = 0;
21216   var ringbuffer_size;
21217   var ringbuffer_mask;
21218   var ringbuffer;
21219   var ringbuffer_end;
21220   /* This ring buffer holds a few past copy distances that will be used by */
21221   /* some special distance codes. */
21222   var dist_rb = [ 16, 15, 11, 4 ];
21223   var dist_rb_idx = 0;
21224   /* The previous 2 bytes used for context. */
21225   var prev_byte1 = 0;
21226   var prev_byte2 = 0;
21227   var hgroup = [new HuffmanTreeGroup(0, 0), new HuffmanTreeGroup(0, 0), new HuffmanTreeGroup(0, 0)];
21228   var block_type_trees;
21229   var block_len_trees;
21230   var br;
21232   /* We need the slack region for the following reasons:
21233        - always doing two 8-byte copies for fast backward copying
21234        - transforms
21235        - flushing the input ringbuffer when decoding uncompressed blocks */
21236   var kRingBufferWriteAheadSlack = 128 + BrotliBitReader.READ_SIZE;
21238   br = new BrotliBitReader(input);
21240   /* Decode window size. */
21241   window_bits = DecodeWindowBits(br);
21242   max_backward_distance = (1 << window_bits) - 16;
21244   ringbuffer_size = 1 << window_bits;
21245   ringbuffer_mask = ringbuffer_size - 1;
21246   ringbuffer = new Uint8Array(ringbuffer_size + kRingBufferWriteAheadSlack + BrotliDictionary.maxDictionaryWordLength);
21247   ringbuffer_end = ringbuffer_size;
21249   block_type_trees = [];
21250   block_len_trees = [];
21251   for (var x = 0; x < 3 * HUFFMAN_MAX_TABLE_SIZE; x++) {
21252     block_type_trees[x] = new HuffmanCode(0, 0);
21253     block_len_trees[x] = new HuffmanCode(0, 0);
21254   }
21256   while (!input_end) {
21257     var meta_block_remaining_len = 0;
21258     var is_uncompressed;
21259     var block_length = [ 1 << 28, 1 << 28, 1 << 28 ];
21260     var block_type = [ 0 ];
21261     var num_block_types = [ 1, 1, 1 ];
21262     var block_type_rb = [ 0, 1, 0, 1, 0, 1 ];
21263     var block_type_rb_index = [ 0 ];
21264     var distance_postfix_bits;
21265     var num_direct_distance_codes;
21266     var distance_postfix_mask;
21267     var num_distance_codes;
21268     var context_map = null;
21269     var context_modes = null;
21270     var num_literal_htrees;
21271     var dist_context_map = null;
21272     var num_dist_htrees;
21273     var context_offset = 0;
21274     var context_map_slice = null;
21275     var literal_htree_index = 0;
21276     var dist_context_offset = 0;
21277     var dist_context_map_slice = null;
21278     var dist_htree_index = 0;
21279     var context_lookup_offset1 = 0;
21280     var context_lookup_offset2 = 0;
21281     var context_mode;
21282     var htree_command;
21284     for (i = 0; i < 3; ++i) {
21285       hgroup[i].codes = null;
21286       hgroup[i].htrees = null;
21287     }
21289     br.readMoreInput();
21291     var _out = DecodeMetaBlockLength(br);
21292     meta_block_remaining_len = _out.meta_block_length;
21293     if (pos + meta_block_remaining_len > output.buffer.length) {
21294       /* We need to grow the output buffer to fit the additional data. */
21295       var tmp = new Uint8Array( pos + meta_block_remaining_len );
21296       tmp.set( output.buffer );
21297       output.buffer = tmp;
21298     }
21299     input_end = _out.input_end;
21300     is_uncompressed = _out.is_uncompressed;
21302     if (_out.is_metadata) {
21303       JumpToByteBoundary(br);
21305       for (; meta_block_remaining_len > 0; --meta_block_remaining_len) {
21306         br.readMoreInput();
21307         /* Read one byte and ignore it. */
21308         br.readBits(8);
21309       }
21311       continue;
21312     }
21314     if (meta_block_remaining_len === 0) {
21315       continue;
21316     }
21318     if (is_uncompressed) {
21319       br.bit_pos_ = (br.bit_pos_ + 7) & ~7;
21320       CopyUncompressedBlockToOutput(output, meta_block_remaining_len, pos,
21321                                     ringbuffer, ringbuffer_mask, br);
21322       pos += meta_block_remaining_len;
21323       continue;
21324     }
21326     for (i = 0; i < 3; ++i) {
21327       num_block_types[i] = DecodeVarLenUint8(br) + 1;
21328       if (num_block_types[i] >= 2) {
21329         ReadHuffmanCode(num_block_types[i] + 2, block_type_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);
21330         ReadHuffmanCode(kNumBlockLengthCodes, block_len_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);
21331         block_length[i] = ReadBlockLength(block_len_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);
21332         block_type_rb_index[i] = 1;
21333       }
21334     }
21336     br.readMoreInput();
21338     distance_postfix_bits = br.readBits(2);
21339     num_direct_distance_codes = NUM_DISTANCE_SHORT_CODES + (br.readBits(4) << distance_postfix_bits);
21340     distance_postfix_mask = (1 << distance_postfix_bits) - 1;
21341     num_distance_codes = (num_direct_distance_codes + (48 << distance_postfix_bits));
21342     context_modes = new Uint8Array(num_block_types[0]);
21344     for (i = 0; i < num_block_types[0]; ++i) {
21345        br.readMoreInput();
21346        context_modes[i] = (br.readBits(2) << 1);
21347     }
21349     var _o1 = DecodeContextMap(num_block_types[0] << kLiteralContextBits, br);
21350     num_literal_htrees = _o1.num_htrees;
21351     context_map = _o1.context_map;
21353     var _o2 = DecodeContextMap(num_block_types[2] << kDistanceContextBits, br);
21354     num_dist_htrees = _o2.num_htrees;
21355     dist_context_map = _o2.context_map;
21357     hgroup[0] = new HuffmanTreeGroup(kNumLiteralCodes, num_literal_htrees);
21358     hgroup[1] = new HuffmanTreeGroup(kNumInsertAndCopyCodes, num_block_types[1]);
21359     hgroup[2] = new HuffmanTreeGroup(num_distance_codes, num_dist_htrees);
21361     for (i = 0; i < 3; ++i) {
21362       hgroup[i].decode(br);
21363     }
21365     context_map_slice = 0;
21366     dist_context_map_slice = 0;
21367     context_mode = context_modes[block_type[0]];
21368     context_lookup_offset1 = Context.lookupOffsets[context_mode];
21369     context_lookup_offset2 = Context.lookupOffsets[context_mode + 1];
21370     htree_command = hgroup[1].htrees[0];
21372     while (meta_block_remaining_len > 0) {
21373       var cmd_code;
21374       var range_idx;
21375       var insert_code;
21376       var copy_code;
21377       var insert_length;
21378       var copy_length;
21379       var distance_code;
21380       var distance;
21381       var context;
21382       var j;
21383       var copy_dst;
21385       br.readMoreInput();
21387       if (block_length[1] === 0) {
21388         DecodeBlockType(num_block_types[1],
21389                         block_type_trees, 1, block_type, block_type_rb,
21390                         block_type_rb_index, br);
21391         block_length[1] = ReadBlockLength(block_len_trees, HUFFMAN_MAX_TABLE_SIZE, br);
21392         htree_command = hgroup[1].htrees[block_type[1]];
21393       }
21394       --block_length[1];
21395       cmd_code = ReadSymbol(hgroup[1].codes, htree_command, br);
21396       range_idx = cmd_code >> 6;
21397       if (range_idx >= 2) {
21398         range_idx -= 2;
21399         distance_code = -1;
21400       } else {
21401         distance_code = 0;
21402       }
21403       insert_code = Prefix.kInsertRangeLut[range_idx] + ((cmd_code >> 3) & 7);
21404       copy_code = Prefix.kCopyRangeLut[range_idx] + (cmd_code & 7);
21405       insert_length = Prefix.kInsertLengthPrefixCode[insert_code].offset +
21406           br.readBits(Prefix.kInsertLengthPrefixCode[insert_code].nbits);
21407       copy_length = Prefix.kCopyLengthPrefixCode[copy_code].offset +
21408           br.readBits(Prefix.kCopyLengthPrefixCode[copy_code].nbits);
21409       prev_byte1 = ringbuffer[pos-1 & ringbuffer_mask];
21410       prev_byte2 = ringbuffer[pos-2 & ringbuffer_mask];
21411       for (j = 0; j < insert_length; ++j) {
21412         br.readMoreInput();
21414         if (block_length[0] === 0) {
21415           DecodeBlockType(num_block_types[0],
21416                           block_type_trees, 0, block_type, block_type_rb,
21417                           block_type_rb_index, br);
21418           block_length[0] = ReadBlockLength(block_len_trees, 0, br);
21419           context_offset = block_type[0] << kLiteralContextBits;
21420           context_map_slice = context_offset;
21421           context_mode = context_modes[block_type[0]];
21422           context_lookup_offset1 = Context.lookupOffsets[context_mode];
21423           context_lookup_offset2 = Context.lookupOffsets[context_mode + 1];
21424         }
21425         context = (Context.lookup[context_lookup_offset1 + prev_byte1] |
21426                    Context.lookup[context_lookup_offset2 + prev_byte2]);
21427         literal_htree_index = context_map[context_map_slice + context];
21428         --block_length[0];
21429         prev_byte2 = prev_byte1;
21430         prev_byte1 = ReadSymbol(hgroup[0].codes, hgroup[0].htrees[literal_htree_index], br);
21431         ringbuffer[pos & ringbuffer_mask] = prev_byte1;
21432         if ((pos & ringbuffer_mask) === ringbuffer_mask) {
21433           output.write(ringbuffer, ringbuffer_size);
21434         }
21435         ++pos;
21436       }
21437       meta_block_remaining_len -= insert_length;
21438       if (meta_block_remaining_len <= 0) break;
21440       if (distance_code < 0) {
21441         var context;
21443         br.readMoreInput();
21444         if (block_length[2] === 0) {
21445           DecodeBlockType(num_block_types[2],
21446                           block_type_trees, 2, block_type, block_type_rb,
21447                           block_type_rb_index, br);
21448           block_length[2] = ReadBlockLength(block_len_trees, 2 * HUFFMAN_MAX_TABLE_SIZE, br);
21449           dist_context_offset = block_type[2] << kDistanceContextBits;
21450           dist_context_map_slice = dist_context_offset;
21451         }
21452         --block_length[2];
21453         context = (copy_length > 4 ? 3 : copy_length - 2) & 0xff;
21454         dist_htree_index = dist_context_map[dist_context_map_slice + context];
21455         distance_code = ReadSymbol(hgroup[2].codes, hgroup[2].htrees[dist_htree_index], br);
21456         if (distance_code >= num_direct_distance_codes) {
21457           var nbits;
21458           var postfix;
21459           var offset;
21460           distance_code -= num_direct_distance_codes;
21461           postfix = distance_code & distance_postfix_mask;
21462           distance_code >>= distance_postfix_bits;
21463           nbits = (distance_code >> 1) + 1;
21464           offset = ((2 + (distance_code & 1)) << nbits) - 4;
21465           distance_code = num_direct_distance_codes +
21466               ((offset + br.readBits(nbits)) <<
21467                distance_postfix_bits) + postfix;
21468         }
21469       }
21471       /* Convert the distance code to the actual distance by possibly looking */
21472       /* up past distnaces from the ringbuffer. */
21473       distance = TranslateShortCodes(distance_code, dist_rb, dist_rb_idx);
21474       if (distance < 0) {
21475         throw new Error('[BrotliDecompress] invalid distance');
21476       }
21478       if (pos < max_backward_distance &&
21479           max_distance !== max_backward_distance) {
21480         max_distance = pos;
21481       } else {
21482         max_distance = max_backward_distance;
21483       }
21485       copy_dst = pos & ringbuffer_mask;
21487       if (distance > max_distance) {
21488         if (copy_length >= BrotliDictionary.minDictionaryWordLength &&
21489             copy_length <= BrotliDictionary.maxDictionaryWordLength) {
21490           var offset = BrotliDictionary.offsetsByLength[copy_length];
21491           var word_id = distance - max_distance - 1;
21492           var shift = BrotliDictionary.sizeBitsByLength[copy_length];
21493           var mask = (1 << shift) - 1;
21494           var word_idx = word_id & mask;
21495           var transform_idx = word_id >> shift;
21496           offset += word_idx * copy_length;
21497           if (transform_idx < Transform.kNumTransforms) {
21498             var len = Transform.transformDictionaryWord(ringbuffer, copy_dst, offset, copy_length, transform_idx);
21499             copy_dst += len;
21500             pos += len;
21501             meta_block_remaining_len -= len;
21502             if (copy_dst >= ringbuffer_end) {
21503               output.write(ringbuffer, ringbuffer_size);
21505               for (var _x = 0; _x < (copy_dst - ringbuffer_end); _x++)
21506                 ringbuffer[_x] = ringbuffer[ringbuffer_end + _x];
21507             }
21508           } else {
21509             throw new Error("Invalid backward reference. pos: " + pos + " distance: " + distance +
21510               " len: " + copy_length + " bytes left: " + meta_block_remaining_len);
21511           }
21512         } else {
21513           throw new Error("Invalid backward reference. pos: " + pos + " distance: " + distance +
21514             " len: " + copy_length + " bytes left: " + meta_block_remaining_len);
21515         }
21516       } else {
21517         if (distance_code > 0) {
21518           dist_rb[dist_rb_idx & 3] = distance;
21519           ++dist_rb_idx;
21520         }
21522         if (copy_length > meta_block_remaining_len) {
21523           throw new Error("Invalid backward reference. pos: " + pos + " distance: " + distance +
21524             " len: " + copy_length + " bytes left: " + meta_block_remaining_len);
21525         }
21527         for (j = 0; j < copy_length; ++j) {
21528           ringbuffer[pos & ringbuffer_mask] = ringbuffer[(pos - distance) & ringbuffer_mask];
21529           if ((pos & ringbuffer_mask) === ringbuffer_mask) {
21530             output.write(ringbuffer, ringbuffer_size);
21531           }
21532           ++pos;
21533           --meta_block_remaining_len;
21534         }
21535       }
21537       /* When we get here, we must have inserted at least one literal and */
21538       /* made a copy of at least length two, therefore accessing the last 2 */
21539       /* bytes is valid. */
21540       prev_byte1 = ringbuffer[(pos - 1) & ringbuffer_mask];
21541       prev_byte2 = ringbuffer[(pos - 2) & ringbuffer_mask];
21542     }
21544     /* Protect pos from overflow, wrap it around at every GB of input data */
21545     pos &= 0x3fffffff;
21546   }
21548   output.write(ringbuffer, pos & ringbuffer_mask);
21551 exports.BrotliDecompress = BrotliDecompress;
21553 BrotliDictionary.init();
21556 /***/ }),
21557 /* 118 */
21558 /***/ (function(module, exports) {
21560 function BrotliInput(buffer) {
21561   this.buffer = buffer;
21562   this.pos = 0;
21565 BrotliInput.prototype.read = function(buf, i, count) {
21566   if (this.pos + count > this.buffer.length) {
21567     count = this.buffer.length - this.pos;
21568   }
21570   for (var p = 0; p < count; p++)
21571     buf[i + p] = this.buffer[this.pos + p];
21573   this.pos += count;
21574   return count;
21577 exports.BrotliInput = BrotliInput;
21579 function BrotliOutput(buf) {
21580   this.buffer = buf;
21581   this.pos = 0;
21584 BrotliOutput.prototype.write = function(buf, count) {
21585   if (this.pos + count > this.buffer.length)
21586     throw new Error('Output buffer is not large enough');
21588   this.buffer.set(buf.subarray(0, count), this.pos);
21589   this.pos += count;
21590   return count;
21593 exports.BrotliOutput = BrotliOutput;
21596 /***/ }),
21597 /* 119 */
21598 /***/ (function(module, exports, __webpack_require__) {
21600 /* Copyright 2013 Google Inc. All Rights Reserved.
21602    Licensed under the Apache License, Version 2.0 (the "License");
21603    you may not use this file except in compliance with the License.
21604    You may obtain a copy of the License at
21606    http://www.apache.org/licenses/LICENSE-2.0
21608    Unless required by applicable law or agreed to in writing, software
21609    distributed under the License is distributed on an "AS IS" BASIS,
21610    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21611    See the License for the specific language governing permissions and
21612    limitations under the License.
21614    Collection of static dictionary words.
21617 var data = __webpack_require__(286);
21618 exports.init = function() {
21619   exports.dictionary = data.init();
21622 exports.offsetsByLength = new Uint32Array([
21623      0,     0,     0,     0,     0,  4096,  9216, 21504, 35840, 44032,
21624  53248, 63488, 74752, 87040, 93696, 100864, 104704, 106752, 108928, 113536,
21625  115968, 118528, 119872, 121280, 122016,
21628 exports.sizeBitsByLength = new Uint8Array([
21629   0,  0,  0,  0, 10, 10, 11, 11, 10, 10,
21630  10, 10, 10,  9,  9,  8,  7,  7,  8,  7,
21631   7,  6,  6,  5,  5,
21634 exports.minDictionaryWordLength = 4;
21635 exports.maxDictionaryWordLength = 24;
21638 /***/ }),
21639 /* 120 */
21640 /***/ (function(module, exports) {
21642 function HuffmanCode(bits, value) {
21643   this.bits = bits;   /* number of bits used for this symbol */
21644   this.value = value; /* symbol value or table offset */
21647 exports.HuffmanCode = HuffmanCode;
21649 var MAX_LENGTH = 15;
21651 /* Returns reverse(reverse(key, len) + 1, len), where reverse(key, len) is the
21652    bit-wise reversal of the len least significant bits of key. */
21653 function GetNextKey(key, len) {
21654   var step = 1 << (len - 1);
21655   while (key & step) {
21656     step >>= 1;
21657   }
21658   return (key & (step - 1)) + step;
21661 /* Stores code in table[0], table[step], table[2*step], ..., table[end] */
21662 /* Assumes that end is an integer multiple of step */
21663 function ReplicateValue(table, i, step, end, code) {
21664   do {
21665     end -= step;
21666     table[i + end] = new HuffmanCode(code.bits, code.value);
21667   } while (end > 0);
21670 /* Returns the table width of the next 2nd level table. count is the histogram
21671    of bit lengths for the remaining symbols, len is the code length of the next
21672    processed symbol */
21673 function NextTableBitSize(count, len, root_bits) {
21674   var left = 1 << (len - root_bits);
21675   while (len < MAX_LENGTH) {
21676     left -= count[len];
21677     if (left <= 0) break;
21678     ++len;
21679     left <<= 1;
21680   }
21681   return len - root_bits;
21684 exports.BrotliBuildHuffmanTable = function(root_table, table, root_bits, code_lengths, code_lengths_size) {
21685   var start_table = table;
21686   var code;            /* current table entry */
21687   var len;             /* current code length */
21688   var symbol;          /* symbol index in original or sorted table */
21689   var key;             /* reversed prefix code */
21690   var step;            /* step size to replicate values in current table */
21691   var low;             /* low bits for current root entry */
21692   var mask;            /* mask for low bits */
21693   var table_bits;      /* key length of current table */
21694   var table_size;      /* size of current table */
21695   var total_size;      /* sum of root table size and 2nd level table sizes */
21696   var sorted;          /* symbols sorted by code length */
21697   var count = new Int32Array(MAX_LENGTH + 1);  /* number of codes of each length */
21698   var offset = new Int32Array(MAX_LENGTH + 1);  /* offsets in sorted table for each length */
21700   sorted = new Int32Array(code_lengths_size);
21702   /* build histogram of code lengths */
21703   for (symbol = 0; symbol < code_lengths_size; symbol++) {
21704     count[code_lengths[symbol]]++;
21705   }
21707   /* generate offsets into sorted symbol table by code length */
21708   offset[1] = 0;
21709   for (len = 1; len < MAX_LENGTH; len++) {
21710     offset[len + 1] = offset[len] + count[len];
21711   }
21713   /* sort symbols by length, by symbol order within each length */
21714   for (symbol = 0; symbol < code_lengths_size; symbol++) {
21715     if (code_lengths[symbol] !== 0) {
21716       sorted[offset[code_lengths[symbol]]++] = symbol;
21717     }
21718   }
21720   table_bits = root_bits;
21721   table_size = 1 << table_bits;
21722   total_size = table_size;
21724   /* special case code with only one value */
21725   if (offset[MAX_LENGTH] === 1) {
21726     for (key = 0; key < total_size; ++key) {
21727       root_table[table + key] = new HuffmanCode(0, sorted[0] & 0xffff);
21728     }
21730     return total_size;
21731   }
21733   /* fill in root table */
21734   key = 0;
21735   symbol = 0;
21736   for (len = 1, step = 2; len <= root_bits; ++len, step <<= 1) {
21737     for (; count[len] > 0; --count[len]) {
21738       code = new HuffmanCode(len & 0xff, sorted[symbol++] & 0xffff);
21739       ReplicateValue(root_table, table + key, step, table_size, code);
21740       key = GetNextKey(key, len);
21741     }
21742   }
21744   /* fill in 2nd level tables and add pointers to root table */
21745   mask = total_size - 1;
21746   low = -1;
21747   for (len = root_bits + 1, step = 2; len <= MAX_LENGTH; ++len, step <<= 1) {
21748     for (; count[len] > 0; --count[len]) {
21749       if ((key & mask) !== low) {
21750         table += table_size;
21751         table_bits = NextTableBitSize(count, len, root_bits);
21752         table_size = 1 << table_bits;
21753         total_size += table_size;
21754         low = key & mask;
21755         root_table[start_table + low] = new HuffmanCode((table_bits + root_bits) & 0xff, ((table - start_table) - low) & 0xffff);
21756       }
21757       code = new HuffmanCode((len - root_bits) & 0xff, sorted[symbol++] & 0xffff);
21758       ReplicateValue(root_table, table + (key >> root_bits), step, table_size, code);
21759       key = GetNextKey(key, len);
21760     }
21761   }
21763   return total_size;
21767 /***/ }),
21768 /* 121 */
21769 /***/ (function(module, exports, __webpack_require__) {
21771 /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.12.6
21774 PDFImage - embeds images in PDF documents
21775 By Devon Govett
21776  */
21778 (function() {
21779   var Data, JPEG, PDFImage, PNG, fs;
21781   fs = __webpack_require__(8);
21783   Data = __webpack_require__(298);
21785   JPEG = __webpack_require__(299);
21787   PNG = __webpack_require__(300);
21789   PDFImage = (function() {
21790     function PDFImage() {}
21792     PDFImage.open = function(src, label) {
21793       var data, match;
21794       if (Buffer.isBuffer(src)) {
21795         data = src;
21796       } else if (src instanceof ArrayBuffer) {
21797         data = new Buffer(new Uint8Array(src));
21798       } else {
21799         if (match = /^data:.+;base64,(.*)$/.exec(src)) {
21800           data = new Buffer(match[1], 'base64');
21801         } else {
21802           data = fs.readFileSync(src);
21803           if (!data) {
21804             return;
21805           }
21806         }
21807       }
21808       if (data[0] === 0xff && data[1] === 0xd8) {
21809         return new JPEG(data, label);
21810       } else if (data[0] === 0x89 && data.toString('ascii', 1, 4) === 'PNG') {
21811         return new PNG(data, label);
21812       } else {
21813         throw new Error('Unknown image format.');
21814       }
21815     };
21817     return PDFImage;
21819   })();
21821   module.exports = PDFImage;
21823 }).call(this);
21825 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
21827 /***/ }),
21828 /* 122 */
21829 /***/ (function(module, exports, __webpack_require__) {
21831 /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["pdfMake"] = __webpack_require__(123);
21832 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7)))
21834 /***/ }),
21835 /* 123 */
21836 /***/ (function(module, exports, __webpack_require__) {
21838 "use strict";
21839 /* WEBPACK VAR INJECTION */(function(Buffer, global) {
21841 var PdfPrinter = __webpack_require__(126);
21842 var isFunction = __webpack_require__(0).isFunction;
21843 var FileSaver = __webpack_require__(306);
21844 var saveAs = FileSaver.saveAs;
21846 var defaultClientFonts = {
21847         Roboto: {
21848                 normal: 'Roboto-Regular.ttf',
21849                 bold: 'Roboto-Medium.ttf',
21850                 italics: 'Roboto-Italic.ttf',
21851                 bolditalics: 'Roboto-MediumItalic.ttf'
21852         }
21855 function Document(docDefinition, tableLayouts, fonts, vfs) {
21856         this.docDefinition = docDefinition;
21857         this.tableLayouts = tableLayouts || null;
21858         this.fonts = fonts || defaultClientFonts;
21859         this.vfs = vfs;
21862 function canCreatePdf() {
21863         // Ensure the browser provides the level of support needed
21864         if (!Object.keys) {
21865                 return false;
21866         }
21867         return true;
21870 Document.prototype._createDoc = function (options, callback) {
21871         options = options || {};
21872         if (this.tableLayouts) {
21873                 options.tableLayouts = this.tableLayouts;
21874         }
21876         var printer = new PdfPrinter(this.fonts);
21877         __webpack_require__(8).bindFS(this.vfs); // bind virtual file system to file system
21879         var doc = printer.createPdfKitDocument(this.docDefinition, options);
21880         var chunks = [];
21881         var result;
21883         doc.on('readable', function () {
21884                 var chunk;
21885                 while ((chunk = doc.read(9007199254740991)) !== null) {
21886                         chunks.push(chunk);
21887                 }
21888         });
21889         doc.on('end', function () {
21890                 result = Buffer.concat(chunks);
21891                 callback(result, doc._pdfMakePages);
21892         });
21893         doc.end();
21896 Document.prototype._getPages = function (options, cb) {
21897         if (!cb) {
21898                 throw '_getPages is an async method and needs a callback argument';
21899         }
21900         this._createDoc(options, function (ignoreBuffer, pages) {
21901                 cb(pages);
21902         });
21905 Document.prototype._bufferToBlob = function (buffer) {
21906         var blob;
21907         try {
21908                 blob = new Blob([buffer], {type: 'application/pdf'});
21909         } catch (e) {
21910                 // Old browser which can't handle it without making it an byte array (ie10)
21911                 if (e.name === 'InvalidStateError') {
21912                         var byteArray = new Uint8Array(buffer);
21913                         blob = new Blob([byteArray.buffer], {type: 'application/pdf'});
21914                 }
21915         }
21917         if (!blob) {
21918                 throw 'Could not generate blob';
21919         }
21921         return blob;
21924 Document.prototype._openWindow = function () {
21925         // we have to open the window immediately and store the reference
21926         // otherwise popup blockers will stop us
21927         var win = window.open('', '_blank');
21928         if (win === null) {
21929                 throw 'Open PDF in new window blocked by browser';
21930         }
21932         return win;
21935 Document.prototype._openPdf = function (options, win) {
21936         if (!win) {
21937                 win = this._openWindow();
21938         }
21939         try {
21940                 this.getBlob(function (result) {
21941                         var urlCreator = window.URL || window.webkitURL;
21942                         var pdfUrl = urlCreator.createObjectURL(result);
21943                         win.location.href = pdfUrl;
21944                 }, options);
21945         } catch (e) {
21946                 win.close();
21947                 throw e;
21948         }
21951 Document.prototype.open = function (options, win) {
21952         options = options || {};
21953         options.autoPrint = false;
21954         win = win || null;
21956         this._openPdf(options, win);
21960 Document.prototype.print = function (options, win) {
21961         options = options || {};
21962         options.autoPrint = true;
21963         win = win || null;
21965         this._openPdf(options, win);
21968 Document.prototype.download = function (defaultFileName, cb, options) {
21969         if (isFunction(defaultFileName)) {
21970                 cb = defaultFileName;
21971                 defaultFileName = null;
21972         }
21974         defaultFileName = defaultFileName || 'file.pdf';
21975         this.getBlob(function (result) {
21976                 saveAs(result, defaultFileName);
21978                 if (isFunction(cb)) {
21979                         cb();
21980                 }
21981         }, options);
21984 Document.prototype.getBase64 = function (cb, options) {
21985         if (!cb) {
21986                 throw 'getBase64 is an async method and needs a callback argument';
21987         }
21988         this.getBuffer(function (buffer) {
21989                 cb(buffer.toString('base64'));
21990         }, options);
21993 Document.prototype.getDataUrl = function (cb, options) {
21994         if (!cb) {
21995                 throw 'getDataUrl is an async method and needs a callback argument';
21996         }
21997         this.getBuffer(function (buffer) {
21998                 cb('data:application/pdf;base64,' + buffer.toString('base64'));
21999         }, options);
22002 Document.prototype.getBlob = function (cb, options) {
22003         if (!cb) {
22004                 throw 'getBlob is an async method and needs a callback argument';
22005         }
22006         var that = this;
22007         this.getBuffer(function (result) {
22008                 var blob = that._bufferToBlob(result);
22009                 cb(blob);
22010         }, options);
22013 Document.prototype.getBuffer = function (cb, options) {
22014         if (!cb) {
22015                 throw 'getBuffer is an async method and needs a callback argument';
22016         }
22017         this._createDoc(options, function (buffer) {
22018                 cb(buffer);
22019         });
22022 module.exports = {
22023         createPdf: function (docDefinition) {
22024                 if (!canCreatePdf()) {
22025                         throw 'Your browser does not provide the level of support needed';
22026                 }
22027                 return new Document(docDefinition, global.pdfMake.tableLayouts, global.pdfMake.fonts, global.pdfMake.vfs);
22028         }
22031 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer, __webpack_require__(7)))
22033 /***/ }),
22034 /* 124 */
22035 /***/ (function(module, exports, __webpack_require__) {
22037 "use strict";
22040 exports.byteLength = byteLength
22041 exports.toByteArray = toByteArray
22042 exports.fromByteArray = fromByteArray
22044 var lookup = []
22045 var revLookup = []
22046 var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
22048 var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
22049 for (var i = 0, len = code.length; i < len; ++i) {
22050   lookup[i] = code[i]
22051   revLookup[code.charCodeAt(i)] = i
22054 // Support decoding URL-safe base64 strings, as Node.js does.
22055 // See: https://en.wikipedia.org/wiki/Base64#URL_applications
22056 revLookup['-'.charCodeAt(0)] = 62
22057 revLookup['_'.charCodeAt(0)] = 63
22059 function placeHoldersCount (b64) {
22060   var len = b64.length
22061   if (len % 4 > 0) {
22062     throw new Error('Invalid string. Length must be a multiple of 4')
22063   }
22065   // the number of equal signs (place holders)
22066   // if there are two placeholders, than the two characters before it
22067   // represent one byte
22068   // if there is only one, then the three characters before it represent 2 bytes
22069   // this is just a cheap hack to not do indexOf twice
22070   return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
22073 function byteLength (b64) {
22074   // base64 is 4/3 + up to two characters of the original data
22075   return (b64.length * 3 / 4) - placeHoldersCount(b64)
22078 function toByteArray (b64) {
22079   var i, l, tmp, placeHolders, arr
22080   var len = b64.length
22081   placeHolders = placeHoldersCount(b64)
22083   arr = new Arr((len * 3 / 4) - placeHolders)
22085   // if there are placeholders, only get up to the last complete 4 chars
22086   l = placeHolders > 0 ? len - 4 : len
22088   var L = 0
22090   for (i = 0; i < l; i += 4) {
22091     tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
22092     arr[L++] = (tmp >> 16) & 0xFF
22093     arr[L++] = (tmp >> 8) & 0xFF
22094     arr[L++] = tmp & 0xFF
22095   }
22097   if (placeHolders === 2) {
22098     tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
22099     arr[L++] = tmp & 0xFF
22100   } else if (placeHolders === 1) {
22101     tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
22102     arr[L++] = (tmp >> 8) & 0xFF
22103     arr[L++] = tmp & 0xFF
22104   }
22106   return arr
22109 function tripletToBase64 (num) {
22110   return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
22113 function encodeChunk (uint8, start, end) {
22114   var tmp
22115   var output = []
22116   for (var i = start; i < end; i += 3) {
22117     tmp = ((uint8[i] << 16) & 0xFF0000) + ((uint8[i + 1] << 8) & 0xFF00) + (uint8[i + 2] & 0xFF)
22118     output.push(tripletToBase64(tmp))
22119   }
22120   return output.join('')
22123 function fromByteArray (uint8) {
22124   var tmp
22125   var len = uint8.length
22126   var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
22127   var output = ''
22128   var parts = []
22129   var maxChunkLength = 16383 // must be multiple of 3
22131   // go through the array every three bytes, we'll deal with trailing stuff later
22132   for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
22133     parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
22134   }
22136   // pad the end with zeros, but make sure to not forget the extra bytes
22137   if (extraBytes === 1) {
22138     tmp = uint8[len - 1]
22139     output += lookup[tmp >> 2]
22140     output += lookup[(tmp << 4) & 0x3F]
22141     output += '=='
22142   } else if (extraBytes === 2) {
22143     tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
22144     output += lookup[tmp >> 10]
22145     output += lookup[(tmp >> 4) & 0x3F]
22146     output += lookup[(tmp << 2) & 0x3F]
22147     output += '='
22148   }
22150   parts.push(output)
22152   return parts.join('')
22156 /***/ }),
22157 /* 125 */
22158 /***/ (function(module, exports) {
22160 exports.read = function (buffer, offset, isLE, mLen, nBytes) {
22161   var e, m
22162   var eLen = nBytes * 8 - mLen - 1
22163   var eMax = (1 << eLen) - 1
22164   var eBias = eMax >> 1
22165   var nBits = -7
22166   var i = isLE ? (nBytes - 1) : 0
22167   var d = isLE ? -1 : 1
22168   var s = buffer[offset + i]
22170   i += d
22172   e = s & ((1 << (-nBits)) - 1)
22173   s >>= (-nBits)
22174   nBits += eLen
22175   for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
22177   m = e & ((1 << (-nBits)) - 1)
22178   e >>= (-nBits)
22179   nBits += mLen
22180   for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
22182   if (e === 0) {
22183     e = 1 - eBias
22184   } else if (e === eMax) {
22185     return m ? NaN : ((s ? -1 : 1) * Infinity)
22186   } else {
22187     m = m + Math.pow(2, mLen)
22188     e = e - eBias
22189   }
22190   return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
22193 exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
22194   var e, m, c
22195   var eLen = nBytes * 8 - mLen - 1
22196   var eMax = (1 << eLen) - 1
22197   var eBias = eMax >> 1
22198   var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
22199   var i = isLE ? 0 : (nBytes - 1)
22200   var d = isLE ? 1 : -1
22201   var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
22203   value = Math.abs(value)
22205   if (isNaN(value) || value === Infinity) {
22206     m = isNaN(value) ? 1 : 0
22207     e = eMax
22208   } else {
22209     e = Math.floor(Math.log(value) / Math.LN2)
22210     if (value * (c = Math.pow(2, -e)) < 1) {
22211       e--
22212       c *= 2
22213     }
22214     if (e + eBias >= 1) {
22215       value += rt / c
22216     } else {
22217       value += rt * Math.pow(2, 1 - eBias)
22218     }
22219     if (value * c >= 2) {
22220       e++
22221       c /= 2
22222     }
22224     if (e + eBias >= eMax) {
22225       m = 0
22226       e = eMax
22227     } else if (e + eBias >= 1) {
22228       m = (value * c - 1) * Math.pow(2, mLen)
22229       e = e + eBias
22230     } else {
22231       m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
22232       e = 0
22233     }
22234   }
22236   for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
22238   e = (e << mLen) | m
22239   eLen += mLen
22240   for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
22242   buffer[offset + i - d] |= s * 128
22246 /***/ }),
22247 /* 126 */
22248 /***/ (function(module, exports, __webpack_require__) {
22250 "use strict";
22251 /*eslint no-unused-vars: ["error", {"args": "none"}]*/
22254 var FontProvider = __webpack_require__(127);
22255 var LayoutBuilder = __webpack_require__(128);
22256 var PdfKit = __webpack_require__(138);
22257 var sizes = __webpack_require__(303);
22258 var ImageMeasure = __webpack_require__(304);
22259 var textDecorator = __webpack_require__(305);
22260 var TextTools = __webpack_require__(42);
22261 var isFunction = __webpack_require__(0).isFunction;
22262 var isString = __webpack_require__(0).isString;
22263 var isNumber = __webpack_require__(0).isNumber;
22264 var isBoolean = __webpack_require__(0).isBoolean;
22265 var isArray = __webpack_require__(0).isArray;
22267 ////////////////////////////////////////
22268 // PdfPrinter
22271  * @class Creates an instance of a PdfPrinter which turns document definition into a pdf
22273  * @param {Object} fontDescriptors font definition dictionary
22275  * @example
22276  * var fontDescriptors = {
22277  *      Roboto: {
22278  *              normal: 'fonts/Roboto-Regular.ttf',
22279  *              bold: 'fonts/Roboto-Medium.ttf',
22280  *              italics: 'fonts/Roboto-Italic.ttf',
22281  *              bolditalics: 'fonts/Roboto-MediumItalic.ttf'
22282  *      }
22283  * };
22285  * var printer = new PdfPrinter(fontDescriptors);
22286  */
22287 function PdfPrinter(fontDescriptors) {
22288         this.fontDescriptors = fontDescriptors;
22292  * Executes layout engine for the specified document and renders it into a pdfkit document
22293  * ready to be saved.
22295  * @param {Object} docDefinition document definition
22296  * @param {Object} docDefinition.content an array describing the pdf structure (for more information take a look at the examples in the /examples folder)
22297  * @param {Object} [docDefinition.defaultStyle] default (implicit) style definition
22298  * @param {Object} [docDefinition.styles] dictionary defining all styles which can be used in the document
22299  * @param {Object} [docDefinition.pageSize] page size (pdfkit units, A4 dimensions by default)
22300  * @param {Number} docDefinition.pageSize.width width
22301  * @param {Number} docDefinition.pageSize.height height
22302  * @param {Object} [docDefinition.pageMargins] page margins (pdfkit units)
22303  * @param {Number} docDefinition.maxPagesNumber maximum number of pages to render
22305  * @example
22307  * var docDefinition = {
22308  *      info: {
22309  *              title: 'awesome Document',
22310  *              author: 'john doe',
22311  *              subject: 'subject of document',
22312  *              keywords: 'keywords for document',
22313  *      },
22314  *      content: [
22315  *              'First paragraph',
22316  *              'Second paragraph, this time a little bit longer',
22317  *              { text: 'Third paragraph, slightly bigger font size', fontSize: 20 },
22318  *              { text: 'Another paragraph using a named style', style: 'header' },
22319  *              { text: ['playing with ', 'inlines' ] },
22320  *              { text: ['and ', { text: 'restyling ', bold: true }, 'them'] },
22321  *      ],
22322  *      styles: {
22323  *              header: { fontSize: 30, bold: true }
22324  *      }
22325  * }
22327  * var pdfKitDoc = printer.createPdfKitDocument(docDefinition);
22329  * pdfKitDoc.pipe(fs.createWriteStream('sample.pdf'));
22330  * pdfKitDoc.end();
22332  * @return {Object} a pdfKit document object which can be saved or encode to data-url
22333  */
22334 PdfPrinter.prototype.createPdfKitDocument = function (docDefinition, options) {
22335         options = options || {};
22337         var pageSize = fixPageSize(docDefinition.pageSize, docDefinition.pageOrientation);
22338         var compressPdf = isBoolean(docDefinition.compress) ? docDefinition.compress : true;
22340         this.pdfKitDoc = new PdfKit({size: [pageSize.width, pageSize.height], autoFirstPage: false, compress: compressPdf});
22341         setMetadata(docDefinition, this.pdfKitDoc);
22343         this.fontProvider = new FontProvider(this.fontDescriptors, this.pdfKitDoc);
22345         docDefinition.images = docDefinition.images || {};
22347         var builder = new LayoutBuilder(pageSize, fixPageMargins(docDefinition.pageMargins || 40), new ImageMeasure(this.pdfKitDoc, docDefinition.images));
22349         registerDefaultTableLayouts(builder);
22350         if (options.tableLayouts) {
22351                 builder.registerTableLayouts(options.tableLayouts);
22352         }
22354         var pages = builder.layoutDocument(docDefinition.content, this.fontProvider, docDefinition.styles || {}, docDefinition.defaultStyle || {fontSize: 12, font: 'Roboto'}, docDefinition.background, docDefinition.header, docDefinition.footer, docDefinition.images, docDefinition.watermark, docDefinition.pageBreakBefore);
22355         var maxNumberPages = docDefinition.maxPagesNumber || -1;
22356         if (isNumber(maxNumberPages) && maxNumberPages > -1) {
22357                 pages = pages.slice(0, maxNumberPages);
22358         }
22360         // if pageSize.height is set to Infinity, calculate the actual height of the page that
22361         // was laid out using the height of each of the items in the page.
22362         if (pageSize.height === Infinity) {
22363                 var pageHeight = calculatePageHeight(pages, docDefinition.pageMargins);
22364                 this.pdfKitDoc.options.size = [pageSize.width, pageHeight];
22365         }
22367         renderPages(pages, this.fontProvider, this.pdfKitDoc, options.progressCallback);
22369         if (options.autoPrint) {
22370                 var printActionRef = this.pdfKitDoc.ref({
22371                         Type: 'Action',
22372                         S: 'Named',
22373                         N: 'Print'
22374                 });
22375                 this.pdfKitDoc._root.data.OpenAction = printActionRef;
22376                 printActionRef.end();
22377         }
22378         return this.pdfKitDoc;
22381 function setMetadata(docDefinition, pdfKitDoc) {
22382         // PDF standard has these properties reserved: Title, Author, Subject, Keywords,
22383         // Creator, Producer, CreationDate, ModDate, Trapped.
22384         // To keep the pdfmake api consistent, the info field are defined lowercase.
22385         // Custom properties don't contain a space.
22386         function standardizePropertyKey(key) {
22387                 var standardProperties = ['Title', 'Author', 'Subject', 'Keywords',
22388                         'Creator', 'Producer', 'CreationDate', 'ModDate', 'Trapped'];
22389                 var standardizedKey = key.charAt(0).toUpperCase() + key.slice(1);
22390                 if (standardProperties.indexOf(standardizedKey) !== -1) {
22391                         return standardizedKey;
22392                 }
22394                 return key.replace(/\s+/g, '');
22395         }
22397         pdfKitDoc.info.Producer = 'pdfmake';
22398         pdfKitDoc.info.Creator = 'pdfmake';
22400         if (docDefinition.info) {
22401                 for (var key in docDefinition.info) {
22402                         var value = docDefinition.info[key];
22403                         if (value) {
22404                                 key = standardizePropertyKey(key);
22405                                 pdfKitDoc.info[key] = value;
22406                         }
22407                 }
22408         }
22411 function calculatePageHeight(pages, margins) {
22412         function getItemHeight(item) {
22413                 if (isFunction(item.item.getHeight)) {
22414                         return item.item.getHeight();
22415                 } else if (item.item._height) {
22416                         return item.item._height;
22417                 } else {
22418                         // TODO: add support for next item types
22419                         return 0;
22420                 }
22421         }
22423         var fixedMargins = fixPageMargins(margins || 40);
22424         var height = fixedMargins.top + fixedMargins.bottom;
22425         pages.forEach(function (page) {
22426                 page.items.forEach(function (item) {
22427                         height += getItemHeight(item);
22428                 });
22429         });
22430         return height;
22433 function fixPageSize(pageSize, pageOrientation) {
22434         function isNeedSwapPageSizes(pageOrientation) {
22435                 if (isString(pageOrientation)) {
22436                         pageOrientation = pageOrientation.toLowerCase();
22437                         return ((pageOrientation === 'portrait') && (size.width > size.height)) ||
22438                                 ((pageOrientation === 'landscape') && (size.width < size.height));
22439                 }
22440                 return false;
22441         }
22443         // if pageSize.height is set to auto, set the height to infinity so there are no page breaks.
22444         if (pageSize && pageSize.height === 'auto') {
22445                 pageSize.height = Infinity;
22446         }
22448         var size = pageSize2widthAndHeight(pageSize || 'A4');
22449         if (isNeedSwapPageSizes(pageOrientation)) { // swap page sizes
22450                 size = {width: size.height, height: size.width};
22451         }
22452         size.orientation = size.width > size.height ? 'landscape' : 'portrait';
22453         return size;
22456 function fixPageMargins(margin) {
22457         if (!margin) {
22458                 return null;
22459         }
22461         if (isNumber(margin)) {
22462                 margin = {left: margin, right: margin, top: margin, bottom: margin};
22463         } else if (isArray(margin)) {
22464                 if (margin.length === 2) {
22465                         margin = {left: margin[0], top: margin[1], right: margin[0], bottom: margin[1]};
22466                 } else if (margin.length === 4) {
22467                         margin = {left: margin[0], top: margin[1], right: margin[2], bottom: margin[3]};
22468                 } else {
22469                         throw 'Invalid pageMargins definition';
22470                 }
22471         }
22473         return margin;
22476 function registerDefaultTableLayouts(layoutBuilder) {
22477         layoutBuilder.registerTableLayouts({
22478                 noBorders: {
22479                         hLineWidth: function (i) {
22480                                 return 0;
22481                         },
22482                         vLineWidth: function (i) {
22483                                 return 0;
22484                         },
22485                         paddingLeft: function (i) {
22486                                 return i && 4 || 0;
22487                         },
22488                         paddingRight: function (i, node) {
22489                                 return (i < node.table.widths.length - 1) ? 4 : 0;
22490                         }
22491                 },
22492                 headerLineOnly: {
22493                         hLineWidth: function (i, node) {
22494                                 if (i === 0 || i === node.table.body.length) {
22495                                         return 0;
22496                                 }
22497                                 return (i === node.table.headerRows) ? 2 : 0;
22498                         },
22499                         vLineWidth: function (i) {
22500                                 return 0;
22501                         },
22502                         paddingLeft: function (i) {
22503                                 return i === 0 ? 0 : 8;
22504                         },
22505                         paddingRight: function (i, node) {
22506                                 return (i === node.table.widths.length - 1) ? 0 : 8;
22507                         }
22508                 },
22509                 lightHorizontalLines: {
22510                         hLineWidth: function (i, node) {
22511                                 if (i === 0 || i === node.table.body.length) {
22512                                         return 0;
22513                                 }
22514                                 return (i === node.table.headerRows) ? 2 : 1;
22515                         },
22516                         vLineWidth: function (i) {
22517                                 return 0;
22518                         },
22519                         hLineColor: function (i) {
22520                                 return i === 1 ? 'black' : '#aaa';
22521                         },
22522                         paddingLeft: function (i) {
22523                                 return i === 0 ? 0 : 8;
22524                         },
22525                         paddingRight: function (i, node) {
22526                                 return (i === node.table.widths.length - 1) ? 0 : 8;
22527                         }
22528                 }
22529         });
22532 function pageSize2widthAndHeight(pageSize) {
22533         if (isString(pageSize)) {
22534                 var size = sizes[pageSize.toUpperCase()];
22535                 if (!size) {
22536                         throw 'Page size ' + pageSize + ' not recognized';
22537                 }
22538                 return {width: size[0], height: size[1]};
22539         }
22541         return pageSize;
22544 function updatePageOrientationInOptions(currentPage, pdfKitDoc) {
22545         var previousPageOrientation = pdfKitDoc.options.size[0] > pdfKitDoc.options.size[1] ? 'landscape' : 'portrait';
22547         if (currentPage.pageSize.orientation !== previousPageOrientation) {
22548                 var width = pdfKitDoc.options.size[0];
22549                 var height = pdfKitDoc.options.size[1];
22550                 pdfKitDoc.options.size = [height, width];
22551         }
22554 function renderPages(pages, fontProvider, pdfKitDoc, progressCallback) {
22555         pdfKitDoc._pdfMakePages = pages;
22556         pdfKitDoc.addPage();
22558         var totalItems = 0;
22559         if (progressCallback) {
22560                 pages.forEach(function (page) {
22561                         totalItems += page.items.length;
22562                 });
22563         }
22565         var renderedItems = 0;
22566         progressCallback = progressCallback || function () {};
22568         for (var i = 0; i < pages.length; i++) {
22569                 if (i > 0) {
22570                         updatePageOrientationInOptions(pages[i], pdfKitDoc);
22571                         pdfKitDoc.addPage(pdfKitDoc.options);
22572                 }
22574                 var page = pages[i];
22575                 for (var ii = 0, il = page.items.length; ii < il; ii++) {
22576                         var item = page.items[ii];
22577                         switch (item.type) {
22578                                 case 'vector':
22579                                         renderVector(item.item, pdfKitDoc);
22580                                         break;
22581                                 case 'line':
22582                                         renderLine(item.item, item.item.x, item.item.y, pdfKitDoc);
22583                                         break;
22584                                 case 'image':
22585                                         renderImage(item.item, item.item.x, item.item.y, pdfKitDoc);
22586                                         break;
22587                                 case 'beginClip':
22588                                         beginClip(item.item, pdfKitDoc);
22589                                         break;
22590                                 case 'endClip':
22591                                         endClip(pdfKitDoc);
22592                                         break;
22593                         }
22594                         renderedItems++;
22595                         progressCallback(renderedItems / totalItems);
22596                 }
22597                 if (page.watermark) {
22598                         renderWatermark(page, pdfKitDoc);
22599                 }
22600         }
22603 function renderLine(line, x, y, pdfKitDoc) {
22604         if (line._pageNodeRef) {
22605                 var newWidth;
22606                 var diffWidth;
22607                 var textTools = new TextTools(null);
22608                 var pageNumber = line._pageNodeRef.positions[0].pageNumber.toString();
22610                 line.inlines[0].text = pageNumber;
22611                 line.inlines[0].linkToPage = pageNumber;
22612                 newWidth = textTools.widthOfString(line.inlines[0].text, line.inlines[0].font, line.inlines[0].fontSize, line.inlines[0].characterSpacing, line.inlines[0].fontFeatures);
22613                 diffWidth = line.inlines[0].width - newWidth;
22614                 line.inlines[0].width = newWidth;
22616                 switch (line.inlines[0].alignment) {
22617                         case 'right':
22618                                 line.inlines[0].x += diffWidth;
22619                                 break;
22620                         case 'center':
22621                                 line.inlines[0].x += diffWidth / 2;
22622                                 break;
22623                 }
22624         }
22626         x = x || 0;
22627         y = y || 0;
22629         var lineHeight = line.getHeight();
22630         var ascenderHeight = line.getAscenderHeight();
22631         var descent = lineHeight - ascenderHeight;
22633         textDecorator.drawBackground(line, x, y, pdfKitDoc);
22635         //TODO: line.optimizeInlines();
22636         for (var i = 0, l = line.inlines.length; i < l; i++) {
22637                 var inline = line.inlines[i];
22638                 var shiftToBaseline = lineHeight - ((inline.font.ascender / 1000) * inline.fontSize) - descent;
22639                 var options = {
22640                         lineBreak: false,
22641                         textWidth: inline.width,
22642                         characterSpacing: inline.characterSpacing,
22643                         wordCount: 1,
22644                         link: inline.link
22645                 };
22647                 if (inline.fontFeatures) {
22648                         options.features = inline.fontFeatures;
22649                 }
22651                 pdfKitDoc.fill(inline.color || 'black');
22653                 pdfKitDoc._font = inline.font;
22654                 pdfKitDoc.fontSize(inline.fontSize);
22655                 pdfKitDoc.text(inline.text, x + inline.x, y + shiftToBaseline, options);
22657                 if (inline.linkToPage) {
22658                         var _ref = pdfKitDoc.ref({Type: 'Action', S: 'GoTo', D: [inline.linkToPage, 0, 0]}).end();
22659                         pdfKitDoc.annotate(x + inline.x, y + shiftToBaseline, inline.width, inline.height, {Subtype: 'Link', Dest: [inline.linkToPage - 1, 'XYZ', null, null, null]});
22660                 }
22662         }
22664         textDecorator.drawDecorations(line, x, y, pdfKitDoc);
22667 function renderWatermark(page, pdfKitDoc) {
22668         var watermark = page.watermark;
22670         pdfKitDoc.fill(watermark.color);
22671         pdfKitDoc.opacity(watermark.opacity);
22673         pdfKitDoc.save();
22675         var angle = Math.atan2(pdfKitDoc.page.height, pdfKitDoc.page.width) * -180 / Math.PI;
22676         pdfKitDoc.rotate(angle, {origin: [pdfKitDoc.page.width / 2, pdfKitDoc.page.height / 2]});
22678         var x = pdfKitDoc.page.width / 2 - watermark.size.size.width / 2;
22679         var y = pdfKitDoc.page.height / 2 - watermark.size.size.height / 4;
22681         pdfKitDoc._font = watermark.font;
22682         pdfKitDoc.fontSize(watermark.size.fontSize);
22683         pdfKitDoc.text(watermark.text, x, y, {lineBreak: false});
22685         pdfKitDoc.restore();
22688 function renderVector(vector, pdfKitDoc) {
22689         //TODO: pdf optimization (there's no need to write all properties everytime)
22690         pdfKitDoc.lineWidth(vector.lineWidth || 1);
22691         if (vector.dash) {
22692                 pdfKitDoc.dash(vector.dash.length, {space: vector.dash.space || vector.dash.length, phase: vector.dash.phase || 0});
22693         } else {
22694                 pdfKitDoc.undash();
22695         }
22696         pdfKitDoc.lineJoin(vector.lineJoin || 'miter');
22697         pdfKitDoc.lineCap(vector.lineCap || 'butt');
22699         //TODO: clipping
22701         switch (vector.type) {
22702                 case 'ellipse':
22703                         pdfKitDoc.ellipse(vector.x, vector.y, vector.r1, vector.r2);
22704                         break;
22705                 case 'rect':
22706                         if (vector.r) {
22707                                 pdfKitDoc.roundedRect(vector.x, vector.y, vector.w, vector.h, vector.r);
22708                         } else {
22709                                 pdfKitDoc.rect(vector.x, vector.y, vector.w, vector.h);
22710                         }
22712                         if (vector.linearGradient) {
22713                                 var gradient = pdfKitDoc.linearGradient(vector.x, vector.y, vector.x + vector.w, vector.y);
22714                                 var step = 1 / (vector.linearGradient.length - 1);
22716                                 for (var i = 0; i < vector.linearGradient.length; i++) {
22717                                         gradient.stop(i * step, vector.linearGradient[i]);
22718                                 }
22720                                 vector.color = gradient;
22721                         }
22722                         break;
22723                 case 'line':
22724                         pdfKitDoc.moveTo(vector.x1, vector.y1);
22725                         pdfKitDoc.lineTo(vector.x2, vector.y2);
22726                         break;
22727                 case 'polyline':
22728                         if (vector.points.length === 0) {
22729                                 break;
22730                         }
22732                         pdfKitDoc.moveTo(vector.points[0].x, vector.points[0].y);
22733                         for (var i = 1, l = vector.points.length; i < l; i++) {
22734                                 pdfKitDoc.lineTo(vector.points[i].x, vector.points[i].y);
22735                         }
22737                         if (vector.points.length > 1) {
22738                                 var p1 = vector.points[0];
22739                                 var pn = vector.points[vector.points.length - 1];
22741                                 if (vector.closePath || p1.x === pn.x && p1.y === pn.y) {
22742                                         pdfKitDoc.closePath();
22743                                 }
22744                         }
22745                         break;
22746                 case 'path':
22747                         pdfKitDoc.path(vector.d);
22748                         break;
22749         }
22751         if (vector.color && vector.lineColor) {
22752                 pdfKitDoc.fillColor(vector.color, vector.fillOpacity || 1);
22753                 pdfKitDoc.strokeColor(vector.lineColor, vector.strokeOpacity || 1);
22754                 pdfKitDoc.fillAndStroke();
22755         } else if (vector.color) {
22756                 pdfKitDoc.fillColor(vector.color, vector.fillOpacity || 1);
22757                 pdfKitDoc.fill();
22758         } else {
22759                 pdfKitDoc.strokeColor(vector.lineColor || 'black', vector.strokeOpacity || 1);
22760                 pdfKitDoc.stroke();
22761         }
22764 function renderImage(image, x, y, pdfKitDoc) {
22765         pdfKitDoc.image(image.image, image.x, image.y, {width: image._width, height: image._height});
22766         if (image.link) {
22767                 pdfKitDoc.link(image.x, image.y, image._width, image._height, image.link);
22768         }
22771 function beginClip(rect, pdfKitDoc) {
22772         pdfKitDoc.save();
22773         pdfKitDoc.addContent('' + rect.x + ' ' + rect.y + ' ' + rect.width + ' ' + rect.height + ' re');
22774         pdfKitDoc.clip();
22777 function endClip(pdfKitDoc) {
22778         pdfKitDoc.restore();
22781 module.exports = PdfPrinter;
22784 /***/ }),
22785 /* 127 */
22786 /***/ (function(module, exports, __webpack_require__) {
22788 "use strict";
22791 var isArray = __webpack_require__(0).isArray;
22793 function typeName(bold, italics) {
22794         var type = 'normal';
22795         if (bold && italics) {
22796                 type = 'bolditalics';
22797         } else if (bold) {
22798                 type = 'bold';
22799         } else if (italics) {
22800                 type = 'italics';
22801         }
22802         return type;
22805 function FontProvider(fontDescriptors, pdfKitDoc) {
22806         this.fonts = {};
22807         this.pdfKitDoc = pdfKitDoc;
22808         this.fontCache = {};
22810         for (var font in fontDescriptors) {
22811                 if (fontDescriptors.hasOwnProperty(font)) {
22812                         var fontDef = fontDescriptors[font];
22814                         this.fonts[font] = {
22815                                 normal: fontDef.normal,
22816                                 bold: fontDef.bold,
22817                                 italics: fontDef.italics,
22818                                 bolditalics: fontDef.bolditalics
22819                         };
22820                 }
22821         }
22824 FontProvider.prototype.provideFont = function (familyName, bold, italics) {
22825         var type = typeName(bold, italics);
22826         if (!this.fonts[familyName] || !this.fonts[familyName][type]) {
22827                 throw new Error('Font \'' + familyName + '\' in style \'' + type + '\' is not defined in the font section of the document definition.');
22828         }
22830         this.fontCache[familyName] = this.fontCache[familyName] || {};
22832         if (!this.fontCache[familyName][type]) {
22833                 var def = this.fonts[familyName][type];
22834                 if (!isArray(def)) {
22835                         def = [def];
22836                 }
22837                 this.fontCache[familyName][type] = this.pdfKitDoc.font.apply(this.pdfKitDoc, def)._font;
22838         }
22840         return this.fontCache[familyName][type];
22843 module.exports = FontProvider;
22846 /***/ }),
22847 /* 128 */
22848 /***/ (function(module, exports, __webpack_require__) {
22850 "use strict";
22853 var TraversalTracker = __webpack_require__(77);
22854 var DocPreprocessor = __webpack_require__(129);
22855 var DocMeasure = __webpack_require__(130);
22856 var DocumentContext = __webpack_require__(81);
22857 var PageElementWriter = __webpack_require__(135);
22858 var ColumnCalculator = __webpack_require__(44);
22859 var TableProcessor = __webpack_require__(137);
22860 var Line = __webpack_require__(82);
22861 var isString = __webpack_require__(0).isString;
22862 var isArray = __webpack_require__(0).isArray;
22863 var pack = __webpack_require__(0).pack;
22864 var offsetVector = __webpack_require__(0).offsetVector;
22865 var fontStringify = __webpack_require__(0).fontStringify;
22866 var isFunction = __webpack_require__(0).isFunction;
22867 var TextTools = __webpack_require__(42);
22868 var StyleContextStack = __webpack_require__(80);
22870 function addAll(target, otherArray) {
22871         otherArray.forEach(function (item) {
22872                 target.push(item);
22873         });
22877  * Creates an instance of LayoutBuilder - layout engine which turns document-definition-object
22878  * into a set of pages, lines, inlines and vectors ready to be rendered into a PDF
22880  * @param {Object} pageSize - an object defining page width and height
22881  * @param {Object} pageMargins - an object defining top, left, right and bottom margins
22882  */
22883 function LayoutBuilder(pageSize, pageMargins, imageMeasure) {
22884         this.pageSize = pageSize;
22885         this.pageMargins = pageMargins;
22886         this.tracker = new TraversalTracker();
22887         this.imageMeasure = imageMeasure;
22888         this.tableLayouts = {};
22891 LayoutBuilder.prototype.registerTableLayouts = function (tableLayouts) {
22892         this.tableLayouts = pack(this.tableLayouts, tableLayouts);
22896  * Executes layout engine on document-definition-object and creates an array of pages
22897  * containing positioned Blocks, Lines and inlines
22899  * @param {Object} docStructure document-definition-object
22900  * @param {Object} fontProvider font provider
22901  * @param {Object} styleDictionary dictionary with style definitions
22902  * @param {Object} defaultStyle default style definition
22903  * @return {Array} an array of pages
22904  */
22905 LayoutBuilder.prototype.layoutDocument = function (docStructure, fontProvider, styleDictionary, defaultStyle, background, header, footer, images, watermark, pageBreakBeforeFct) {
22907         function addPageBreaksIfNecessary(linearNodeList, pages) {
22909                 if (!isFunction(pageBreakBeforeFct)) {
22910                         return false;
22911                 }
22913                 linearNodeList = linearNodeList.filter(function (node) {
22914                         return node.positions.length > 0;
22915                 });
22917                 linearNodeList.forEach(function (node) {
22918                         var nodeInfo = {};
22919                         [
22920                                 'id', 'text', 'ul', 'ol', 'table', 'image', 'qr', 'canvas', 'columns',
22921                                 'headlineLevel', 'style', 'pageBreak', 'pageOrientation',
22922                                 'width', 'height'
22923                         ].forEach(function (key) {
22924                                 if (node[key] !== undefined) {
22925                                         nodeInfo[key] = node[key];
22926                                 }
22927                         });
22928                         nodeInfo.startPosition = node.positions[0];
22929                         nodeInfo.pageNumbers = node.positions.map(function (node) {
22930                                 return node.pageNumber;
22931                         }).filter(function (element, position, array) {
22932                                 return array.indexOf(element) === position;
22933                         });
22934                         nodeInfo.pages = pages.length;
22935                         nodeInfo.stack = isArray(node.stack);
22937                         node.nodeInfo = nodeInfo;
22938                 });
22940                 return linearNodeList.some(function (node, index, followingNodeList) {
22941                         if (node.pageBreak !== 'before' && !node.pageBreakCalculated) {
22942                                 node.pageBreakCalculated = true;
22943                                 var pageNumber = node.nodeInfo.pageNumbers[0];
22945                                 var followingNodesOnPage = followingNodeList.slice(index + 1).filter(function (node0) {
22946                                         return node0.nodeInfo.pageNumbers.indexOf(pageNumber) > -1;
22947                                 });
22949                                 var nodesOnNextPage = followingNodeList.slice(index + 1).filter(function (node0) {
22950                                         return node0.nodeInfo.pageNumbers.indexOf(pageNumber + 1) > -1;
22951                                 });
22953                                 var previousNodesOnPage = followingNodeList.slice(0, index).filter(function (node0) {
22954                                         return node0.nodeInfo.pageNumbers.indexOf(pageNumber) > -1;
22955                                 });
22957                                 if (
22958                                         pageBreakBeforeFct(
22959                                                 node.nodeInfo,
22960                                                 followingNodesOnPage.map(function (node) {
22961                                                         return node.nodeInfo;
22962                                                 }),
22963                                                 nodesOnNextPage.map(function (node) {
22964                                                         return node.nodeInfo;
22965                                                 }),
22966                                                 previousNodesOnPage.map(function (node) {
22967                                                         return node.nodeInfo;
22968                                                 }))) {
22969                                         node.pageBreak = 'before';
22970                                         return true;
22971                                 }
22972                         }
22973                 });
22974         }
22976         this.docPreprocessor = new DocPreprocessor();
22977         this.docMeasure = new DocMeasure(fontProvider, styleDictionary, defaultStyle, this.imageMeasure, this.tableLayouts, images);
22980         function resetXYs(result) {
22981                 result.linearNodeList.forEach(function (node) {
22982                         node.resetXY();
22983                 });
22984         }
22986         var result = this.tryLayoutDocument(docStructure, fontProvider, styleDictionary, defaultStyle, background, header, footer, images, watermark);
22987         while (addPageBreaksIfNecessary(result.linearNodeList, result.pages)) {
22988                 resetXYs(result);
22989                 result = this.tryLayoutDocument(docStructure, fontProvider, styleDictionary, defaultStyle, background, header, footer, images, watermark);
22990         }
22992         return result.pages;
22995 LayoutBuilder.prototype.tryLayoutDocument = function (docStructure, fontProvider, styleDictionary, defaultStyle, background, header, footer, images, watermark, pageBreakBeforeFct) {
22997         this.linearNodeList = [];
22998         docStructure = this.docPreprocessor.preprocessDocument(docStructure);
22999         docStructure = this.docMeasure.measureDocument(docStructure);
23001         this.writer = new PageElementWriter(
23002                 new DocumentContext(this.pageSize, this.pageMargins), this.tracker);
23004         var _this = this;
23005         this.writer.context().tracker.startTracking('pageAdded', function () {
23006                 _this.addBackground(background);
23007         });
23009         this.addBackground(background);
23010         this.processNode(docStructure);
23011         this.addHeadersAndFooters(header, footer);
23012         if (watermark != null) {
23013                 this.addWatermark(watermark, fontProvider, defaultStyle);
23014         }
23016         return {pages: this.writer.context().pages, linearNodeList: this.linearNodeList};
23020 LayoutBuilder.prototype.addBackground = function (background) {
23021         var backgroundGetter = isFunction(background) ? background : function () {
23022                 return background;
23023         };
23025         var pageBackground = backgroundGetter(this.writer.context().page + 1);
23027         if (pageBackground) {
23028                 var pageSize = this.writer.context().getCurrentPage().pageSize;
23029                 this.writer.beginUnbreakableBlock(pageSize.width, pageSize.height);
23030                 pageBackground = this.docPreprocessor.preprocessDocument(pageBackground);
23031                 this.processNode(this.docMeasure.measureDocument(pageBackground));
23032                 this.writer.commitUnbreakableBlock(0, 0);
23033                 this.writer.context().hasBackground = true;
23034         }
23037 LayoutBuilder.prototype.addStaticRepeatable = function (headerOrFooter, sizeFunction) {
23038         this.addDynamicRepeatable(function () {
23039                 return JSON.parse(JSON.stringify(headerOrFooter)); // copy to new object
23040         }, sizeFunction);
23043 LayoutBuilder.prototype.addDynamicRepeatable = function (nodeGetter, sizeFunction) {
23044         var pages = this.writer.context().pages;
23046         for (var pageIndex = 0, l = pages.length; pageIndex < l; pageIndex++) {
23047                 this.writer.context().page = pageIndex;
23049                 var node = nodeGetter(pageIndex + 1, l, this.writer.context().pages[pageIndex].pageSize);
23051                 if (node) {
23052                         var sizes = sizeFunction(this.writer.context().getCurrentPage().pageSize, this.pageMargins);
23053                         this.writer.beginUnbreakableBlock(sizes.width, sizes.height);
23054                         node = this.docPreprocessor.preprocessDocument(node);
23055                         this.processNode(this.docMeasure.measureDocument(node));
23056                         this.writer.commitUnbreakableBlock(sizes.x, sizes.y);
23057                 }
23058         }
23061 LayoutBuilder.prototype.addHeadersAndFooters = function (header, footer) {
23062         var headerSizeFct = function (pageSize, pageMargins) {
23063                 return {
23064                         x: 0,
23065                         y: 0,
23066                         width: pageSize.width,
23067                         height: pageMargins.top
23068                 };
23069         };
23071         var footerSizeFct = function (pageSize, pageMargins) {
23072                 return {
23073                         x: 0,
23074                         y: pageSize.height - pageMargins.bottom,
23075                         width: pageSize.width,
23076                         height: pageMargins.bottom
23077                 };
23078         };
23080         if (isFunction(header)) {
23081                 this.addDynamicRepeatable(header, headerSizeFct);
23082         } else if (header) {
23083                 this.addStaticRepeatable(header, headerSizeFct);
23084         }
23086         if (isFunction(footer)) {
23087                 this.addDynamicRepeatable(footer, footerSizeFct);
23088         } else if (footer) {
23089                 this.addStaticRepeatable(footer, footerSizeFct);
23090         }
23093 LayoutBuilder.prototype.addWatermark = function (watermark, fontProvider, defaultStyle) {
23094         if (isString(watermark)) {
23095                 watermark = {'text': watermark};
23096         }
23098         if (!watermark.text) { // empty watermark text
23099                 return;
23100         }
23102         watermark.font = watermark.font || defaultStyle.font || 'Roboto';
23103         watermark.color = watermark.color || 'black';
23104         watermark.opacity = watermark.opacity || 0.6;
23105         watermark.bold = watermark.bold || false;
23106         watermark.italics = watermark.italics || false;
23108         var watermarkObject = {
23109                 text: watermark.text,
23110                 font: fontProvider.provideFont(watermark.font, watermark.bold, watermark.italics),
23111                 size: getSize(this.pageSize, watermark, fontProvider),
23112                 color: watermark.color,
23113                 opacity: watermark.opacity
23114         };
23116         var pages = this.writer.context().pages;
23117         for (var i = 0, l = pages.length; i < l; i++) {
23118                 pages[i].watermark = watermarkObject;
23119         }
23121         function getSize(pageSize, watermark, fontProvider) {
23122                 var width = pageSize.width;
23123                 var height = pageSize.height;
23124                 var targetWidth = Math.sqrt(width * width + height * height) * 0.8; /* page diagonal * sample factor */
23125                 var textTools = new TextTools(fontProvider);
23126                 var styleContextStack = new StyleContextStack(null, {font: watermark.font, bold: watermark.bold, italics: watermark.italics});
23127                 var size;
23129                 /**
23130                  * Binary search the best font size.
23131                  * Initial bounds [0, 1000]
23132                  * Break when range < 1
23133                  */
23134                 var a = 0;
23135                 var b = 1000;
23136                 var c = (a + b) / 2;
23137                 while (Math.abs(a - b) > 1) {
23138                         styleContextStack.push({
23139                                 fontSize: c
23140                         });
23141                         size = textTools.sizeOfString(watermark.text, styleContextStack);
23142                         if (size.width > targetWidth) {
23143                                 b = c;
23144                                 c = (a + b) / 2;
23145                         } else if (size.width < targetWidth) {
23146                                 a = c;
23147                                 c = (a + b) / 2;
23148                         }
23149                         styleContextStack.pop();
23150                 }
23151                 /*
23152                  End binary search
23153                  */
23154                 return {size: size, fontSize: c};
23155         }
23158 function decorateNode(node) {
23159         var x = node.x, y = node.y;
23160         node.positions = [];
23162         if (isArray(node.canvas)) {
23163                 node.canvas.forEach(function (vector) {
23164                         var x = vector.x, y = vector.y, x1 = vector.x1, y1 = vector.y1, x2 = vector.x2, y2 = vector.y2;
23165                         vector.resetXY = function () {
23166                                 vector.x = x;
23167                                 vector.y = y;
23168                                 vector.x1 = x1;
23169                                 vector.y1 = y1;
23170                                 vector.x2 = x2;
23171                                 vector.y2 = y2;
23172                         };
23173                 });
23174         }
23176         node.resetXY = function () {
23177                 node.x = x;
23178                 node.y = y;
23179                 if (isArray(node.canvas)) {
23180                         node.canvas.forEach(function (vector) {
23181                                 vector.resetXY();
23182                         });
23183                 }
23184         };
23187 LayoutBuilder.prototype.processNode = function (node) {
23188         var self = this;
23190         this.linearNodeList.push(node);
23191         decorateNode(node);
23193         applyMargins(function () {
23194                 var unbreakable = node.unbreakable;
23195                 if (unbreakable) {
23196                         self.writer.beginUnbreakableBlock();
23197                 }
23199                 var absPosition = node.absolutePosition;
23200                 if (absPosition) {
23201                         self.writer.context().beginDetachedBlock();
23202                         self.writer.context().moveTo(absPosition.x || 0, absPosition.y || 0);
23203                 }
23205                 var relPosition = node.relativePosition;
23206                 if (relPosition) {
23207                         self.writer.context().beginDetachedBlock();
23208                         self.writer.context().moveTo((relPosition.x || 0) + self.writer.context().x, (relPosition.y || 0) + self.writer.context().y);
23209                 }
23211                 if (node.stack) {
23212                         self.processVerticalContainer(node);
23213                 } else if (node.columns) {
23214                         self.processColumns(node);
23215                 } else if (node.ul) {
23216                         self.processList(false, node);
23217                 } else if (node.ol) {
23218                         self.processList(true, node);
23219                 } else if (node.table) {
23220                         self.processTable(node);
23221                 } else if (node.text !== undefined) {
23222                         self.processLeaf(node);
23223                 } else if (node.toc) {
23224                         self.processToc(node);
23225                 } else if (node.image) {
23226                         self.processImage(node);
23227                 } else if (node.canvas) {
23228                         self.processCanvas(node);
23229                 } else if (node.qr) {
23230                         self.processQr(node);
23231                 } else if (!node._span) {
23232                         throw 'Unrecognized document structure: ' + JSON.stringify(node, fontStringify);
23233                 }
23235                 if (absPosition || relPosition) {
23236                         self.writer.context().endDetachedBlock();
23237                 }
23239                 if (unbreakable) {
23240                         self.writer.commitUnbreakableBlock();
23241                 }
23242         });
23244         function applyMargins(callback) {
23245                 var margin = node._margin;
23247                 if (node.pageBreak === 'before') {
23248                         self.writer.moveToNextPage(node.pageOrientation);
23249                 }
23251                 if (margin) {
23252                         self.writer.context().moveDown(margin[1]);
23253                         self.writer.context().addMargin(margin[0], margin[2]);
23254                 }
23256                 callback();
23258                 if (margin) {
23259                         self.writer.context().addMargin(-margin[0], -margin[2]);
23260                         self.writer.context().moveDown(margin[3]);
23261                 }
23263                 if (node.pageBreak === 'after') {
23264                         self.writer.moveToNextPage(node.pageOrientation);
23265                 }
23266         }
23269 // vertical container
23270 LayoutBuilder.prototype.processVerticalContainer = function (node) {
23271         var self = this;
23272         node.stack.forEach(function (item) {
23273                 self.processNode(item);
23274                 addAll(node.positions, item.positions);
23276                 //TODO: paragraph gap
23277         });
23280 // columns
23281 LayoutBuilder.prototype.processColumns = function (columnNode) {
23282         var columns = columnNode.columns;
23283         var availableWidth = this.writer.context().availableWidth;
23284         var gaps = gapArray(columnNode._gap);
23286         if (gaps) {
23287                 availableWidth -= (gaps.length - 1) * columnNode._gap;
23288         }
23290         ColumnCalculator.buildColumnWidths(columns, availableWidth);
23291         var result = this.processRow(columns, columns, gaps);
23292         addAll(columnNode.positions, result.positions);
23295         function gapArray(gap) {
23296                 if (!gap) {
23297                         return null;
23298                 }
23300                 var gaps = [];
23301                 gaps.push(0);
23303                 for (var i = columns.length - 1; i > 0; i--) {
23304                         gaps.push(gap);
23305                 }
23307                 return gaps;
23308         }
23311 LayoutBuilder.prototype.processRow = function (columns, widths, gaps, tableBody, tableRow, height) {
23312         var self = this;
23313         var pageBreaks = [], positions = [];
23315         this.tracker.auto('pageChanged', storePageBreakData, function () {
23316                 widths = widths || columns;
23318                 self.writer.context().beginColumnGroup();
23320                 for (var i = 0, l = columns.length; i < l; i++) {
23321                         var column = columns[i];
23322                         var width = widths[i]._calcWidth;
23323                         var leftOffset = colLeftOffset(i);
23325                         if (column.colSpan && column.colSpan > 1) {
23326                                 for (var j = 1; j < column.colSpan; j++) {
23327                                         width += widths[++i]._calcWidth + gaps[i];
23328                                 }
23329                         }
23331                         self.writer.context().beginColumn(width, leftOffset, getEndingCell(column, i));
23332                         if (!column._span) {
23333                                 self.processNode(column);
23334                                 addAll(positions, column.positions);
23335                         } else if (column._columnEndingContext) {
23336                                 // row-span ending
23337                                 self.writer.context().markEnding(column);
23338                         }
23339                 }
23341                 self.writer.context().completeColumnGroup(height);
23342         });
23344         return {pageBreaks: pageBreaks, positions: positions};
23346         function storePageBreakData(data) {
23347                 var pageDesc;
23349                 for (var i = 0, l = pageBreaks.length; i < l; i++) {
23350                         var desc = pageBreaks[i];
23351                         if (desc.prevPage === data.prevPage) {
23352                                 pageDesc = desc;
23353                                 break;
23354                         }
23355                 }
23357                 if (!pageDesc) {
23358                         pageDesc = data;
23359                         pageBreaks.push(pageDesc);
23360                 }
23361                 pageDesc.prevY = Math.max(pageDesc.prevY, data.prevY);
23362                 pageDesc.y = Math.min(pageDesc.y, data.y);
23363         }
23365         function colLeftOffset(i) {
23366                 if (gaps && gaps.length > i) {
23367                         return gaps[i];
23368                 }
23369                 return 0;
23370         }
23372         function getEndingCell(column, columnIndex) {
23373                 if (column.rowSpan && column.rowSpan > 1) {
23374                         var endingRow = tableRow + column.rowSpan - 1;
23375                         if (endingRow >= tableBody.length) {
23376                                 throw 'Row span for column ' + columnIndex + ' (with indexes starting from 0) exceeded row count';
23377                         }
23378                         return tableBody[endingRow][columnIndex];
23379                 }
23381                 return null;
23382         }
23385 // lists
23386 LayoutBuilder.prototype.processList = function (orderedList, node) {
23387         var self = this,
23388                 items = orderedList ? node.ol : node.ul,
23389                 gapSize = node._gapSize;
23391         this.writer.context().addMargin(gapSize.width);
23393         var nextMarker;
23394         this.tracker.auto('lineAdded', addMarkerToFirstLeaf, function () {
23395                 items.forEach(function (item) {
23396                         nextMarker = item.listMarker;
23397                         self.processNode(item);
23398                         addAll(node.positions, item.positions);
23399                 });
23400         });
23402         this.writer.context().addMargin(-gapSize.width);
23404         function addMarkerToFirstLeaf(line) {
23405                 // I'm not very happy with the way list processing is implemented
23406                 // (both code and algorithm should be rethinked)
23407                 if (nextMarker) {
23408                         var marker = nextMarker;
23409                         nextMarker = null;
23411                         if (marker.canvas) {
23412                                 var vector = marker.canvas[0];
23414                                 offsetVector(vector, -marker._minWidth, 0);
23415                                 self.writer.addVector(vector);
23416                         } else if (marker._inlines) {
23417                                 var markerLine = new Line(self.pageSize.width);
23418                                 markerLine.addInline(marker._inlines[0]);
23419                                 markerLine.x = -marker._minWidth;
23420                                 markerLine.y = line.getAscenderHeight() - markerLine.getAscenderHeight();
23421                                 self.writer.addLine(markerLine, true);
23422                         }
23423                 }
23424         }
23427 // tables
23428 LayoutBuilder.prototype.processTable = function (tableNode) {
23429         var processor = new TableProcessor(tableNode);
23431         processor.beginTable(this.writer);
23433         var rowHeights = tableNode.table.heights;
23434         for (var i = 0, l = tableNode.table.body.length; i < l; i++) {
23435                 processor.beginRow(i, this.writer);
23437                 var height;
23438                 if (isFunction(rowHeights)) {
23439                         height = rowHeights(i);
23440                 } else if (isArray(rowHeights)) {
23441                         height = rowHeights[i];
23442                 } else {
23443                         height = rowHeights;
23444                 }
23446                 if (height === 'auto') {
23447                         height = undefined;
23448                 }
23450                 var result = this.processRow(tableNode.table.body[i], tableNode.table.widths, tableNode._offsets.offsets, tableNode.table.body, i, height);
23451                 addAll(tableNode.positions, result.positions);
23453                 processor.endRow(i, this.writer, result.pageBreaks);
23454         }
23456         processor.endTable(this.writer);
23459 // leafs (texts)
23460 LayoutBuilder.prototype.processLeaf = function (node) {
23461         var line = this.buildNextLine(node);
23462         var currentHeight = (line) ? line.getHeight() : 0;
23463         var maxHeight = node.maxHeight || -1;
23465         if (node._tocItemRef) {
23466                 line._pageNodeRef = node._tocItemRef;
23467         }
23469         if (node._pageRef) {
23470                 line._pageNodeRef = node._pageRef._nodeRef;
23471         }
23473         while (line && (maxHeight === -1 || currentHeight < maxHeight)) {
23474                 var positions = this.writer.addLine(line);
23475                 node.positions.push(positions);
23476                 line = this.buildNextLine(node);
23477                 if (line) {
23478                         currentHeight += line.getHeight();
23479                 }
23480         }
23483 LayoutBuilder.prototype.processToc = function (node) {
23484         if (node.toc.title) {
23485                 this.processNode(node.toc.title);
23486         }
23487         this.processNode(node.toc._table);
23490 LayoutBuilder.prototype.buildNextLine = function (textNode) {
23492         function cloneInline(inline) {
23493                 var newInline = inline.constructor();
23494                 for (var key in inline) {
23495                         newInline[key] = inline[key];
23496                 }
23497                 return newInline;
23498         }
23500         if (!textNode._inlines || textNode._inlines.length === 0) {
23501                 return null;
23502         }
23504         var line = new Line(this.writer.context().availableWidth);
23505         var textTools = new TextTools(null);
23507         while (textNode._inlines && textNode._inlines.length > 0 && line.hasEnoughSpaceForInline(textNode._inlines[0])) {
23508                 var inline = textNode._inlines.shift();
23510                 if (!inline.noWrap && inline.text.length > 1 && inline.width > line.maxWidth) {
23511                         var widthPerChar = inline.width / inline.text.length;
23512                         var maxChars = Math.floor(line.maxWidth / widthPerChar);
23513                         if (maxChars < 1) {
23514                                 maxChars = 1;
23515                         }
23516                         if (maxChars < inline.text.length) {
23517                                 var newInline = cloneInline(inline);
23519                                 newInline.text = inline.text.substr(maxChars);
23520                                 inline.text = inline.text.substr(0, maxChars);
23522                                 newInline.width = textTools.widthOfString(newInline.text, newInline.font, newInline.fontSize, newInline.characterSpacing, newInline.fontFeatures);
23523                                 inline.width = textTools.widthOfString(inline.text, inline.font, inline.fontSize, inline.characterSpacing, inline.fontFeatures);
23525                                 textNode._inlines.unshift(newInline);
23526                         }
23527                 }
23529                 line.addInline(inline);
23530         }
23532         line.lastLineInParagraph = textNode._inlines.length === 0;
23534         return line;
23537 // images
23538 LayoutBuilder.prototype.processImage = function (node) {
23539         var position = this.writer.addImage(node);
23540         node.positions.push(position);
23543 LayoutBuilder.prototype.processCanvas = function (node) {
23544         var height = node._minHeight;
23546         if (node.absolutePosition === undefined && this.writer.context().availableHeight < height) {
23547                 // TODO: support for canvas larger than a page
23548                 // TODO: support for other overflow methods
23550                 this.writer.moveToNextPage();
23551         }
23553         this.writer.alignCanvas(node);
23555         node.canvas.forEach(function (vector) {
23556                 var position = this.writer.addVector(vector);
23557                 node.positions.push(position);
23558         }, this);
23560         this.writer.context().moveDown(height);
23563 LayoutBuilder.prototype.processQr = function (node) {
23564         var position = this.writer.addQr(node);
23565         node.positions.push(position);
23568 module.exports = LayoutBuilder;
23571 /***/ }),
23572 /* 129 */
23573 /***/ (function(module, exports, __webpack_require__) {
23575 "use strict";
23576 /* WEBPACK VAR INJECTION */(function(Buffer) {
23578 var isString = __webpack_require__(0).isString;
23579 var isNumber = __webpack_require__(0).isNumber;
23580 var isBoolean = __webpack_require__(0).isBoolean;
23581 var isArray = __webpack_require__(0).isArray;
23582 var isUndefined = __webpack_require__(0).isUndefined;
23583 var fontStringify = __webpack_require__(0).fontStringify;
23585 function DocPreprocessor() {
23589 DocPreprocessor.prototype.preprocessDocument = function (docStructure) {
23590         this.tocs = [];
23591         this.nodeReferences = [];
23592         return this.preprocessNode(docStructure);
23595 DocPreprocessor.prototype.preprocessNode = function (node) {
23596         // expand shortcuts and casting values
23597         if (isArray(node)) {
23598                 node = {stack: node};
23599         } else if (isString(node)) {
23600                 node = {text: node};
23601         } else if (isNumber(node) || isBoolean(node)) {
23602                 node = {text: node.toString()};
23603         } else if (node === null) {
23604                 node = {text: ''};
23605         } else if (Object.keys(node).length === 0) { // empty object
23606                 node = {text: ''};
23607         }
23609         if (node.columns) {
23610                 return this.preprocessColumns(node);
23611         } else if (node.stack) {
23612                 return this.preprocessVerticalContainer(node);
23613         } else if (node.ul) {
23614                 return this.preprocessList(node);
23615         } else if (node.ol) {
23616                 return this.preprocessList(node);
23617         } else if (node.table) {
23618                 return this.preprocessTable(node);
23619         } else if (node.text !== undefined) {
23620                 return this.preprocessText(node);
23621         } else if (node.toc) {
23622                 return this.preprocessToc(node);
23623         } else if (node.image) {
23624                 return this.preprocessImage(node);
23625         } else if (node.canvas) {
23626                 return this.preprocessCanvas(node);
23627         } else if (node.qr) {
23628                 return this.preprocessQr(node);
23629         } else if (node.pageReference || node.textReference) {
23630                 return this.preprocessText(node);
23631         } else {
23632                 throw 'Unrecognized document structure: ' + JSON.stringify(node, fontStringify);
23633         }
23636 DocPreprocessor.prototype.preprocessColumns = function (node) {
23637         var columns = node.columns;
23639         for (var i = 0, l = columns.length; i < l; i++) {
23640                 columns[i] = this.preprocessNode(columns[i]);
23641         }
23643         return node;
23646 DocPreprocessor.prototype.preprocessVerticalContainer = function (node) {
23647         var items = node.stack;
23649         for (var i = 0, l = items.length; i < l; i++) {
23650                 items[i] = this.preprocessNode(items[i]);
23651         }
23653         return node;
23656 DocPreprocessor.prototype.preprocessList = function (node) {
23657         var items = node.ul || node.ol;
23659         for (var i = 0, l = items.length; i < l; i++) {
23660                 items[i] = this.preprocessNode(items[i]);
23661         }
23663         return node;
23666 DocPreprocessor.prototype.preprocessTable = function (node) {
23667         var col, row, cols, rows;
23669         for (col = 0, cols = node.table.body[0].length; col < cols; col++) {
23670                 for (row = 0, rows = node.table.body.length; row < rows; row++) {
23671                         var rowData = node.table.body[row];
23672                         var data = rowData[col];
23673                         if (data !== undefined) {
23674                                 if (data === null) { // transform to object
23675                                         data = '';
23676                                 }
23677                                 if (!data._span) {
23678                                         rowData[col] = this.preprocessNode(data);
23679                                 }
23680                         }
23681                 }
23682         }
23684         return node;
23687 DocPreprocessor.prototype.preprocessText = function (node) {
23688         if (node.tocItem) {
23689                 if (!isArray(node.tocItem)) {
23690                         node.tocItem = [node.tocItem];
23691                 }
23693                 for (var i = 0, l = node.tocItem.length; i < l; i++) {
23694                         if (!isString(node.tocItem[i])) {
23695                                 node.tocItem[i] = '_default_';
23696                         }
23698                         var tocItemId = node.tocItem[i];
23700                         if (!this.tocs[tocItemId]) {
23701                                 this.tocs[tocItemId] = {toc: {_items: [], _pseudo: true}};
23702                         }
23704                         this.tocs[tocItemId].toc._items.push(node);
23705                 }
23706         }
23708         if (node.id) {
23709                 if (this.nodeReferences[node.id]) {
23710                         if (!this.nodeReferences[node.id]._pseudo) {
23711                                 throw "Node id '" + node.id + "' already exists";
23712                         }
23714                         this.nodeReferences[node.id]._nodeRef = node;
23715                         this.nodeReferences[node.id]._pseudo = false;
23716                 } else {
23717                         this.nodeReferences[node.id] = {_nodeRef: node};
23718                 }
23719         }
23721         if (node.pageReference) {
23722                 if (!this.nodeReferences[node.pageReference]) {
23723                         this.nodeReferences[node.pageReference] = {_nodeRef: {}, _pseudo: true};
23724                 }
23725                 node.text = '00000';
23726                 node._pageRef = this.nodeReferences[node.pageReference];
23727         }
23729         if (node.textReference) {
23730                 if (!this.nodeReferences[node.textReference]) {
23731                         this.nodeReferences[node.textReference] = {_nodeRef: {}, _pseudo: true};
23732                 }
23734                 node.text = '';
23735                 node._textRef = this.nodeReferences[node.textReference];
23736         }
23738         if (node.text && node.text.text) {
23739                 node.text = [this.preprocessNode(node.text)];
23740         }
23742         return node;
23745 DocPreprocessor.prototype.preprocessToc = function (node) {
23746         if (!node.toc.id) {
23747                 node.toc.id = '_default_';
23748         }
23750         node.toc.title = node.toc.title ? this.preprocessNode(node.toc.title) : null;
23751         node.toc._items = [];
23753         if (this.tocs[node.toc.id]) {
23754                 if (!this.tocs[node.toc.id].toc._pseudo) {
23755                         throw "TOC '" + node.toc.id + "' already exists";
23756                 }
23758                 node.toc._items = this.tocs[node.toc.id].toc._items;
23759         }
23761         this.tocs[node.toc.id] = node;
23763         return node;
23766 DocPreprocessor.prototype.preprocessImage = function (node) {
23767         if (!isUndefined(node.image.type) && !isUndefined(node.image.data) && (node.image.type === 'Buffer') && isArray(node.image.data)) {
23768                 node.image = Buffer.from(node.image.data);
23769         }
23770         return node;
23773 DocPreprocessor.prototype.preprocessCanvas = function (node) {
23774         return node;
23777 DocPreprocessor.prototype.preprocessQr = function (node) {
23778         return node;
23781 module.exports = DocPreprocessor;
23782 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
23784 /***/ }),
23785 /* 130 */
23786 /***/ (function(module, exports, __webpack_require__) {
23788 "use strict";
23789 /*eslint no-unused-vars: ["error", {"args": "none"}]*/
23793 var TextTools = __webpack_require__(42);
23794 var StyleContextStack = __webpack_require__(80);
23795 var ColumnCalculator = __webpack_require__(44);
23796 var isString = __webpack_require__(0).isString;
23797 var isNumber = __webpack_require__(0).isNumber;
23798 var isObject = __webpack_require__(0).isObject;
23799 var isArray = __webpack_require__(0).isArray;
23800 var fontStringify = __webpack_require__(0).fontStringify;
23801 var pack = __webpack_require__(0).pack;
23802 var qrEncoder = __webpack_require__(134);
23805  * @private
23806  */
23807 function DocMeasure(fontProvider, styleDictionary, defaultStyle, imageMeasure, tableLayouts, images) {
23808         this.textTools = new TextTools(fontProvider);
23809         this.styleStack = new StyleContextStack(styleDictionary, defaultStyle);
23810         this.imageMeasure = imageMeasure;
23811         this.tableLayouts = tableLayouts;
23812         this.images = images;
23813         this.autoImageIndex = 1;
23817  * Measures all nodes and sets min/max-width properties required for the second
23818  * layout-pass.
23819  * @param  {Object} docStructure document-definition-object
23820  * @return {Object}              document-measurement-object
23821  */
23822 DocMeasure.prototype.measureDocument = function (docStructure) {
23823         return this.measureNode(docStructure);
23826 DocMeasure.prototype.measureNode = function (node) {
23828         var self = this;
23830         return this.styleStack.auto(node, function () {
23831                 // TODO: refactor + rethink whether this is the proper way to handle margins
23832                 node._margin = getNodeMargin(node);
23834                 if (node.columns) {
23835                         return extendMargins(self.measureColumns(node));
23836                 } else if (node.stack) {
23837                         return extendMargins(self.measureVerticalContainer(node));
23838                 } else if (node.ul) {
23839                         return extendMargins(self.measureUnorderedList(node));
23840                 } else if (node.ol) {
23841                         return extendMargins(self.measureOrderedList(node));
23842                 } else if (node.table) {
23843                         return extendMargins(self.measureTable(node));
23844                 } else if (node.text !== undefined) {
23845                         return extendMargins(self.measureLeaf(node));
23846                 } else if (node.toc) {
23847                         return extendMargins(self.measureToc(node));
23848                 } else if (node.image) {
23849                         return extendMargins(self.measureImage(node));
23850                 } else if (node.canvas) {
23851                         return extendMargins(self.measureCanvas(node));
23852                 } else if (node.qr) {
23853                         return extendMargins(self.measureQr(node));
23854                 } else {
23855                         throw 'Unrecognized document structure: ' + JSON.stringify(node, fontStringify);
23856                 }
23857         });
23859         function extendMargins(node) {
23860                 var margin = node._margin;
23862                 if (margin) {
23863                         node._minWidth += margin[0] + margin[2];
23864                         node._maxWidth += margin[0] + margin[2];
23865                 }
23867                 return node;
23868         }
23870         function getNodeMargin() {
23872                 function processSingleMargins(node, currentMargin) {
23873                         if (node.marginLeft || node.marginTop || node.marginRight || node.marginBottom) {
23874                                 return [
23875                                         node.marginLeft || currentMargin[0] || 0,
23876                                         node.marginTop || currentMargin[1] || 0,
23877                                         node.marginRight || currentMargin[2] || 0,
23878                                         node.marginBottom || currentMargin[3] || 0
23879                                 ];
23880                         }
23881                         return currentMargin;
23882                 }
23884                 function flattenStyleArray(styleArray) {
23885                         var flattenedStyles = {};
23886                         for (var i = styleArray.length - 1; i >= 0; i--) {
23887                                 var styleName = styleArray[i];
23888                                 var style = self.styleStack.styleDictionary[styleName];
23889                                 for (var key in style) {
23890                                         if (style.hasOwnProperty(key)) {
23891                                                 flattenedStyles[key] = style[key];
23892                                         }
23893                                 }
23894                         }
23895                         return flattenedStyles;
23896                 }
23898                 function convertMargin(margin) {
23899                         if (isNumber(margin)) {
23900                                 margin = [margin, margin, margin, margin];
23901                         } else if (isArray(margin)) {
23902                                 if (margin.length === 2) {
23903                                         margin = [margin[0], margin[1], margin[0], margin[1]];
23904                                 }
23905                         }
23906                         return margin;
23907                 }
23909                 var margin = [undefined, undefined, undefined, undefined];
23911                 if (node.style) {
23912                         var styleArray = isArray(node.style) ? node.style : [node.style];
23913                         var flattenedStyleArray = flattenStyleArray(styleArray);
23915                         if (flattenedStyleArray) {
23916                                 margin = processSingleMargins(flattenedStyleArray, margin);
23917                         }
23919                         if (flattenedStyleArray.margin) {
23920                                 margin = convertMargin(flattenedStyleArray.margin);
23921                         }
23922                 }
23924                 margin = processSingleMargins(node, margin);
23926                 if (node.margin) {
23927                         margin = convertMargin(node.margin);
23928                 }
23930                 if (margin[0] === undefined && margin[1] === undefined && margin[2] === undefined && margin[3] === undefined) {
23931                         return null;
23932                 } else {
23933                         return margin;
23934                 }
23935         }
23938 DocMeasure.prototype.convertIfBase64Image = function (node) {
23939         if (/^data:image\/(jpeg|jpg|png);base64,/.test(node.image)) {
23940                 var label = '$$pdfmake$$' + this.autoImageIndex++;
23941                 this.images[label] = node.image;
23942                 node.image = label;
23943         }
23946 DocMeasure.prototype.measureImage = function (node) {
23947         if (this.images) {
23948                 this.convertIfBase64Image(node);
23949         }
23951         var imageSize = this.imageMeasure.measureImage(node.image);
23953         if (node.fit) {
23954                 var factor = (imageSize.width / imageSize.height > node.fit[0] / node.fit[1]) ? node.fit[0] / imageSize.width : node.fit[1] / imageSize.height;
23955                 node._width = node._minWidth = node._maxWidth = imageSize.width * factor;
23956                 node._height = imageSize.height * factor;
23957         } else {
23958                 node._width = node._minWidth = node._maxWidth = node.width || imageSize.width;
23959                 node._height = node.height || (imageSize.height * node._width / imageSize.width);
23961                 if (isNumber(node.maxWidth) && node.maxWidth < node._width) {
23962                         node._width = node._minWidth = node._maxWidth = node.maxWidth;
23963                         node._height = node._width * imageSize.height / imageSize.width;
23964                 }
23966                 if (isNumber(node.maxHeight) && node.maxHeight < node._height) {
23967                         node._height = node.maxHeight;
23968                         node._width = node._minWidth = node._maxWidth = node._height * imageSize.width / imageSize.height;
23969                 }
23971                 if (isNumber(node.minWidth) && node.minWidth > node._width) {
23972                         node._width = node._minWidth = node._maxWidth = node.minWidth;
23973                         node._height = node._width * imageSize.height / imageSize.width;
23974                 }
23976                 if (isNumber(node.minHeight) && node.minHeight > node._height) {
23977                         node._height = node.minHeight;
23978                         node._width = node._minWidth = node._maxWidth = node._height * imageSize.width / imageSize.height;
23979                 }
23980         }
23982         node._alignment = this.styleStack.getProperty('alignment');
23983         return node;
23986 DocMeasure.prototype.measureLeaf = function (node) {
23988         if (node._textRef && node._textRef._nodeRef.text) {
23989                 node.text = node._textRef._nodeRef.text;
23990         }
23992         // Make sure style properties of the node itself are considered when building inlines.
23993         // We could also just pass [node] to buildInlines, but that fails for bullet points.
23994         var styleStack = this.styleStack.clone();
23995         styleStack.push(node);
23997         var data = this.textTools.buildInlines(node.text, styleStack);
23999         node._inlines = data.items;
24000         node._minWidth = data.minWidth;
24001         node._maxWidth = data.maxWidth;
24003         return node;
24006 DocMeasure.prototype.measureToc = function (node) {
24007         if (node.toc.title) {
24008                 node.toc.title = this.measureNode(node.toc.title);
24009         }
24011         var body = [];
24012         var textStyle = node.toc.textStyle || {};
24013         var numberStyle = node.toc.numberStyle || textStyle;
24014         var textMargin = node.toc.textMargin || [0, 0, 0, 0];
24015         for (var i = 0, l = node.toc._items.length; i < l; i++) {
24016                 var item = node.toc._items[i];
24017                 var lineStyle = node.toc._items[i].tocStyle || textStyle;
24018                 var lineMargin = node.toc._items[i].tocMargin || textMargin;
24019                 body.push([
24020                         {text: item.text, alignment: 'left', style: lineStyle, margin: lineMargin},
24021                         {text: '00000', alignment: 'right', _tocItemRef: item, style: numberStyle, margin: [0, lineMargin[1], 0, lineMargin[3]]}
24022                 ]);
24023         }
24026         node.toc._table = {
24027                 table: {
24028                         dontBreakRows: true,
24029                         widths: ['*', 'auto'],
24030                         body: body
24031                 },
24032                 layout: 'noBorders'
24033         };
24035         node.toc._table = this.measureNode(node.toc._table);
24037         return node;
24040 DocMeasure.prototype.measureVerticalContainer = function (node) {
24041         var items = node.stack;
24043         node._minWidth = 0;
24044         node._maxWidth = 0;
24046         for (var i = 0, l = items.length; i < l; i++) {
24047                 items[i] = this.measureNode(items[i]);
24049                 node._minWidth = Math.max(node._minWidth, items[i]._minWidth);
24050                 node._maxWidth = Math.max(node._maxWidth, items[i]._maxWidth);
24051         }
24053         return node;
24056 DocMeasure.prototype.gapSizeForList = function () {
24057         return this.textTools.sizeOfString('9. ', this.styleStack);
24060 DocMeasure.prototype.buildUnorderedMarker = function (styleStack, gapSize, type) {
24061         function buildDisc(gapSize, color) {
24062                 // TODO: ascender-based calculations
24063                 var radius = gapSize.fontSize / 6;
24064                 return {
24065                         canvas: [{
24066                                         x: radius,
24067                                         y: (gapSize.height / gapSize.lineHeight) + gapSize.descender - gapSize.fontSize / 3,
24068                                         r1: radius,
24069                                         r2: radius,
24070                                         type: 'ellipse',
24071                                         color: color
24072                                 }]
24073                 };
24074         }
24076         function buildSquare(gapSize, color) {
24077                 // TODO: ascender-based calculations
24078                 var size = gapSize.fontSize / 3;
24079                 return {
24080                         canvas: [{
24081                                         x: 0,
24082                                         y: (gapSize.height / gapSize.lineHeight) + gapSize.descender - (gapSize.fontSize / 3) - (size / 2),
24083                                         h: size,
24084                                         w: size,
24085                                         type: 'rect',
24086                                         color: color
24087                                 }]
24088                 };
24089         }
24091         function buildCircle(gapSize, color) {
24092                 // TODO: ascender-based calculations
24093                 var radius = gapSize.fontSize / 6;
24094                 return {
24095                         canvas: [{
24096                                         x: radius,
24097                                         y: (gapSize.height / gapSize.lineHeight) + gapSize.descender - gapSize.fontSize / 3,
24098                                         r1: radius,
24099                                         r2: radius,
24100                                         type: 'ellipse',
24101                                         lineColor: color
24102                                 }]
24103                 };
24104         }
24106         var marker;
24107         var color = styleStack.getProperty('markerColor') || styleStack.getProperty('color') || 'black';
24109         switch (type) {
24110                 case 'circle':
24111                         marker = buildCircle(gapSize, color);
24112                         break;
24114                 case 'square':
24115                         marker = buildSquare(gapSize, color);
24116                         break;
24118                 case 'none':
24119                         marker = {};
24120                         break;
24122                 case 'disc':
24123                 default:
24124                         marker = buildDisc(gapSize, color);
24125                         break;
24126         }
24128         marker._minWidth = marker._maxWidth = gapSize.width;
24129         marker._minHeight = marker._maxHeight = gapSize.height;
24131         return marker;
24134 DocMeasure.prototype.buildOrderedMarker = function (counter, styleStack, type, separator) {
24135         function prepareAlpha(counter) {
24136                 function toAlpha(num) {
24137                         return (num >= 26 ? toAlpha((num / 26 >> 0) - 1) : '') + 'abcdefghijklmnopqrstuvwxyz'[num % 26 >> 0];
24138                 }
24140                 if (counter < 1) {
24141                         return counter.toString();
24142                 }
24144                 return toAlpha(counter - 1);
24145         }
24147         function prepareRoman(counter) {
24148                 if (counter < 1 || counter > 4999) {
24149                         return counter.toString();
24150                 }
24151                 var num = counter;
24152                 var lookup = {M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4, I: 1}, roman = '', i;
24153                 for (i in lookup) {
24154                         while (num >= lookup[i]) {
24155                                 roman += i;
24156                                 num -= lookup[i];
24157                         }
24158                 }
24159                 return roman;
24160         }
24162         function prepareDecimal(counter) {
24163                 return counter.toString();
24164         }
24166         var counterText;
24167         switch (type) {
24168                 case 'none':
24169                         counterText = null;
24170                         break;
24172                 case 'upper-alpha':
24173                         counterText = prepareAlpha(counter).toUpperCase();
24174                         break;
24176                 case 'lower-alpha':
24177                         counterText = prepareAlpha(counter);
24178                         break;
24180                 case 'upper-roman':
24181                         counterText = prepareRoman(counter);
24182                         break;
24184                 case 'lower-roman':
24185                         counterText = prepareRoman(counter).toLowerCase();
24186                         break;
24188                 case 'decimal':
24189                 default:
24190                         counterText = prepareDecimal(counter);
24191                         break;
24192         }
24194         if (counterText === null) {
24195                 return {};
24196         }
24198         if (separator) {
24199                 if (isArray(separator)) {
24200                         if (separator[0]) {
24201                                 counterText = separator[0] + counterText;
24202                         }
24204                         if (separator[1]) {
24205                                 counterText += separator[1];
24206                         }
24207                         counterText += ' ';
24208                 } else {
24209                         counterText += separator + ' ';
24210                 }
24211         }
24213         var textArray = {text: counterText};
24214         var markerColor = styleStack.getProperty('markerColor');
24215         if (markerColor) {
24216                 textArray.color = markerColor;
24217         }
24219         return {_inlines: this.textTools.buildInlines(textArray, styleStack).items};
24222 DocMeasure.prototype.measureUnorderedList = function (node) {
24223         var style = this.styleStack.clone();
24224         var items = node.ul;
24225         node.type = node.type || 'disc';
24226         node._gapSize = this.gapSizeForList();
24227         node._minWidth = 0;
24228         node._maxWidth = 0;
24230         for (var i = 0, l = items.length; i < l; i++) {
24231                 var item = items[i] = this.measureNode(items[i]);
24233                 if (!item.ol && !item.ul) {
24234                         item.listMarker = this.buildUnorderedMarker(style, node._gapSize, item.listType || node.type);
24235                 }
24237                 node._minWidth = Math.max(node._minWidth, items[i]._minWidth + node._gapSize.width);
24238                 node._maxWidth = Math.max(node._maxWidth, items[i]._maxWidth + node._gapSize.width);
24239         }
24241         return node;
24244 DocMeasure.prototype.measureOrderedList = function (node) {
24245         var style = this.styleStack.clone();
24246         var items = node.ol;
24247         node.type = node.type || 'decimal';
24248         node.separator = node.separator || '.';
24249         node.reversed = node.reversed || false;
24250         if (!node.start) {
24251                 node.start = node.reversed ? items.length : 1;
24252         }
24253         node._gapSize = this.gapSizeForList();
24254         node._minWidth = 0;
24255         node._maxWidth = 0;
24257         var counter = node.start;
24258         for (var i = 0, l = items.length; i < l; i++) {
24259                 var item = items[i] = this.measureNode(items[i]);
24261                 if (!item.ol && !item.ul) {
24262                         item.listMarker = this.buildOrderedMarker(item.counter || counter, style, item.listType || node.type, node.separator);
24263                         if (item.listMarker._inlines) {
24264                                 node._gapSize.width = Math.max(node._gapSize.width, item.listMarker._inlines[0].width);
24265                         }
24266                 }  // TODO: else - nested lists numbering
24268                 node._minWidth = Math.max(node._minWidth, items[i]._minWidth);
24269                 node._maxWidth = Math.max(node._maxWidth, items[i]._maxWidth);
24271                 if (node.reversed) {
24272                         counter--;
24273                 } else {
24274                         counter++;
24275                 }
24276         }
24278         node._minWidth += node._gapSize.width;
24279         node._maxWidth += node._gapSize.width;
24281         for (var i = 0, l = items.length; i < l; i++) {
24282                 var item = items[i];
24283                 if (!item.ol && !item.ul) {
24284                         item.listMarker._minWidth = item.listMarker._maxWidth = node._gapSize.width;
24285                 }
24286         }
24288         return node;
24291 DocMeasure.prototype.measureColumns = function (node) {
24292         var columns = node.columns;
24293         node._gap = this.styleStack.getProperty('columnGap') || 0;
24295         for (var i = 0, l = columns.length; i < l; i++) {
24296                 columns[i] = this.measureNode(columns[i]);
24297         }
24299         var measures = ColumnCalculator.measureMinMax(columns);
24301         var numGaps = (columns.length > 0) ? (columns.length - 1) : 0;
24302         node._minWidth = measures.min + node._gap * numGaps;
24303         node._maxWidth = measures.max + node._gap * numGaps;
24305         return node;
24308 DocMeasure.prototype.measureTable = function (node) {
24309         extendTableWidths(node);
24310         node._layout = getLayout(this.tableLayouts);
24311         node._offsets = getOffsets(node._layout);
24313         var colSpans = [];
24314         var col, row, cols, rows;
24316         for (col = 0, cols = node.table.body[0].length; col < cols; col++) {
24317                 var c = node.table.widths[col];
24318                 c._minWidth = 0;
24319                 c._maxWidth = 0;
24321                 for (row = 0, rows = node.table.body.length; row < rows; row++) {
24322                         var rowData = node.table.body[row];
24323                         var data = rowData[col];
24324                         if (data === undefined) {
24325                                 console.error('Malformed table row ', rowData, 'in node ', node);
24326                                 throw 'Malformed table row, a cell is undefined.';
24327                         }
24328                         if (data === null) { // transform to object
24329                                 data = '';
24330                         }
24332                         if (!data._span) {
24333                                 data = rowData[col] = this.styleStack.auto(data, measureCb(this, data));
24335                                 if (data.colSpan && data.colSpan > 1) {
24336                                         markSpans(rowData, col, data.colSpan);
24337                                         colSpans.push({col: col, span: data.colSpan, minWidth: data._minWidth, maxWidth: data._maxWidth});
24338                                 } else {
24339                                         c._minWidth = Math.max(c._minWidth, data._minWidth);
24340                                         c._maxWidth = Math.max(c._maxWidth, data._maxWidth);
24341                                 }
24342                         }
24344                         if (data.rowSpan && data.rowSpan > 1) {
24345                                 markVSpans(node.table, row, col, data.rowSpan);
24346                         }
24347                 }
24348         }
24350         extendWidthsForColSpans();
24352         var measures = ColumnCalculator.measureMinMax(node.table.widths);
24354         node._minWidth = measures.min + node._offsets.total;
24355         node._maxWidth = measures.max + node._offsets.total;
24357         return node;
24359         function measureCb(_this, data) {
24360                 return function () {
24361                         if (isObject(data)) {
24362                                 data.fillColor = _this.styleStack.getProperty('fillColor');
24363                         }
24364                         return _this.measureNode(data);
24365                 };
24366         }
24368         function getLayout(tableLayouts) {
24369                 var layout = node.layout;
24371                 if (isString(layout)) {
24372                         layout = tableLayouts[layout];
24373                 }
24375                 var defaultLayout = {
24376                         hLineWidth: function (i, node) {
24377                                 return 1;
24378                         },
24379                         vLineWidth: function (i, node) {
24380                                 return 1;
24381                         },
24382                         hLineColor: function (i, node) {
24383                                 return 'black';
24384                         },
24385                         vLineColor: function (i, node) {
24386                                 return 'black';
24387                         },
24388                         paddingLeft: function (i, node) {
24389                                 return 4;
24390                         },
24391                         paddingRight: function (i, node) {
24392                                 return 4;
24393                         },
24394                         paddingTop: function (i, node) {
24395                                 return 2;
24396                         },
24397                         paddingBottom: function (i, node) {
24398                                 return 2;
24399                         },
24400                         fillColor: function (i, node) {
24401                                 return null;
24402                         },
24403                         defaultBorder: true
24404                 };
24406                 return pack(defaultLayout, layout);
24407         }
24409         function getOffsets(layout) {
24410                 var offsets = [];
24411                 var totalOffset = 0;
24412                 var prevRightPadding = 0;
24414                 for (var i = 0, l = node.table.widths.length; i < l; i++) {
24415                         var lOffset = prevRightPadding + layout.vLineWidth(i, node) + layout.paddingLeft(i, node);
24416                         offsets.push(lOffset);
24417                         totalOffset += lOffset;
24418                         prevRightPadding = layout.paddingRight(i, node);
24419                 }
24421                 totalOffset += prevRightPadding + layout.vLineWidth(node.table.widths.length, node);
24423                 return {
24424                         total: totalOffset,
24425                         offsets: offsets
24426                 };
24427         }
24429         function extendWidthsForColSpans() {
24430                 var q, j;
24432                 for (var i = 0, l = colSpans.length; i < l; i++) {
24433                         var span = colSpans[i];
24435                         var currentMinMax = getMinMax(span.col, span.span, node._offsets);
24436                         var minDifference = span.minWidth - currentMinMax.minWidth;
24437                         var maxDifference = span.maxWidth - currentMinMax.maxWidth;
24439                         if (minDifference > 0) {
24440                                 q = minDifference / span.span;
24442                                 for (j = 0; j < span.span; j++) {
24443                                         node.table.widths[span.col + j]._minWidth += q;
24444                                 }
24445                         }
24447                         if (maxDifference > 0) {
24448                                 q = maxDifference / span.span;
24450                                 for (j = 0; j < span.span; j++) {
24451                                         node.table.widths[span.col + j]._maxWidth += q;
24452                                 }
24453                         }
24454                 }
24455         }
24457         function getMinMax(col, span, offsets) {
24458                 var result = {minWidth: 0, maxWidth: 0};
24460                 for (var i = 0; i < span; i++) {
24461                         result.minWidth += node.table.widths[col + i]._minWidth + (i ? offsets.offsets[col + i] : 0);
24462                         result.maxWidth += node.table.widths[col + i]._maxWidth + (i ? offsets.offsets[col + i] : 0);
24463                 }
24465                 return result;
24466         }
24468         function markSpans(rowData, col, span) {
24469                 for (var i = 1; i < span; i++) {
24470                         rowData[col + i] = {
24471                                 _span: true,
24472                                 _minWidth: 0,
24473                                 _maxWidth: 0,
24474                                 rowSpan: rowData[col].rowSpan
24475                         };
24476                 }
24477         }
24479         function markVSpans(table, row, col, span) {
24480                 for (var i = 1; i < span; i++) {
24481                         table.body[row + i][col] = {
24482                                 _span: true,
24483                                 _minWidth: 0,
24484                                 _maxWidth: 0,
24485                                 fillColor: table.body[row][col].fillColor
24486                         };
24487                 }
24488         }
24490         function extendTableWidths(node) {
24491                 if (!node.table.widths) {
24492                         node.table.widths = 'auto';
24493                 }
24495                 if (isString(node.table.widths)) {
24496                         node.table.widths = [node.table.widths];
24498                         while (node.table.widths.length < node.table.body[0].length) {
24499                                 node.table.widths.push(node.table.widths[node.table.widths.length - 1]);
24500                         }
24501                 }
24503                 for (var i = 0, l = node.table.widths.length; i < l; i++) {
24504                         var w = node.table.widths[i];
24505                         if (isNumber(w) || isString(w)) {
24506                                 node.table.widths[i] = {width: w};
24507                         }
24508                 }
24509         }
24512 DocMeasure.prototype.measureCanvas = function (node) {
24513         var w = 0, h = 0;
24515         for (var i = 0, l = node.canvas.length; i < l; i++) {
24516                 var vector = node.canvas[i];
24518                 switch (vector.type) {
24519                         case 'ellipse':
24520                                 w = Math.max(w, vector.x + vector.r1);
24521                                 h = Math.max(h, vector.y + vector.r2);
24522                                 break;
24523                         case 'rect':
24524                                 w = Math.max(w, vector.x + vector.w);
24525                                 h = Math.max(h, vector.y + vector.h);
24526                                 break;
24527                         case 'line':
24528                                 w = Math.max(w, vector.x1, vector.x2);
24529                                 h = Math.max(h, vector.y1, vector.y2);
24530                                 break;
24531                         case 'polyline':
24532                                 for (var i2 = 0, l2 = vector.points.length; i2 < l2; i2++) {
24533                                         w = Math.max(w, vector.points[i2].x);
24534                                         h = Math.max(h, vector.points[i2].y);
24535                                 }
24536                                 break;
24537                 }
24538         }
24540         node._minWidth = node._maxWidth = w;
24541         node._minHeight = node._maxHeight = h;
24542         node._alignment = this.styleStack.getProperty('alignment');
24544         return node;
24547 DocMeasure.prototype.measureQr = function (node) {
24548         node = qrEncoder.measure(node);
24549         node._alignment = this.styleStack.getProperty('alignment');
24550         return node;
24553 module.exports = DocMeasure;
24556 /***/ }),
24557 /* 131 */
24558 /***/ (function(module, exports, __webpack_require__) {
24560 var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
24562 ;(function (exports) {
24563         'use strict';
24565   var Arr = (typeof Uint8Array !== 'undefined')
24566     ? Uint8Array
24567     : Array
24569         var PLUS   = '+'.charCodeAt(0)
24570         var SLASH  = '/'.charCodeAt(0)
24571         var NUMBER = '0'.charCodeAt(0)
24572         var LOWER  = 'a'.charCodeAt(0)
24573         var UPPER  = 'A'.charCodeAt(0)
24574         var PLUS_URL_SAFE = '-'.charCodeAt(0)
24575         var SLASH_URL_SAFE = '_'.charCodeAt(0)
24577         function decode (elt) {
24578                 var code = elt.charCodeAt(0)
24579                 if (code === PLUS ||
24580                     code === PLUS_URL_SAFE)
24581                         return 62 // '+'
24582                 if (code === SLASH ||
24583                     code === SLASH_URL_SAFE)
24584                         return 63 // '/'
24585                 if (code < NUMBER)
24586                         return -1 //no match
24587                 if (code < NUMBER + 10)
24588                         return code - NUMBER + 26 + 26
24589                 if (code < UPPER + 26)
24590                         return code - UPPER
24591                 if (code < LOWER + 26)
24592                         return code - LOWER + 26
24593         }
24595         function b64ToByteArray (b64) {
24596                 var i, j, l, tmp, placeHolders, arr
24598                 if (b64.length % 4 > 0) {
24599                         throw new Error('Invalid string. Length must be a multiple of 4')
24600                 }
24602                 // the number of equal signs (place holders)
24603                 // if there are two placeholders, than the two characters before it
24604                 // represent one byte
24605                 // if there is only one, then the three characters before it represent 2 bytes
24606                 // this is just a cheap hack to not do indexOf twice
24607                 var len = b64.length
24608                 placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
24610                 // base64 is 4/3 + up to two characters of the original data
24611                 arr = new Arr(b64.length * 3 / 4 - placeHolders)
24613                 // if there are placeholders, only get up to the last complete 4 chars
24614                 l = placeHolders > 0 ? b64.length - 4 : b64.length
24616                 var L = 0
24618                 function push (v) {
24619                         arr[L++] = v
24620                 }
24622                 for (i = 0, j = 0; i < l; i += 4, j += 3) {
24623                         tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
24624                         push((tmp & 0xFF0000) >> 16)
24625                         push((tmp & 0xFF00) >> 8)
24626                         push(tmp & 0xFF)
24627                 }
24629                 if (placeHolders === 2) {
24630                         tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
24631                         push(tmp & 0xFF)
24632                 } else if (placeHolders === 1) {
24633                         tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
24634                         push((tmp >> 8) & 0xFF)
24635                         push(tmp & 0xFF)
24636                 }
24638                 return arr
24639         }
24641         function uint8ToBase64 (uint8) {
24642                 var i,
24643                         extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
24644                         output = "",
24645                         temp, length
24647                 function encode (num) {
24648                         return lookup.charAt(num)
24649                 }
24651                 function tripletToBase64 (num) {
24652                         return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
24653                 }
24655                 // go through the array every three bytes, we'll deal with trailing stuff later
24656                 for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
24657                         temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
24658                         output += tripletToBase64(temp)
24659                 }
24661                 // pad the end with zeros, but make sure to not forget the extra bytes
24662                 switch (extraBytes) {
24663                         case 1:
24664                                 temp = uint8[uint8.length - 1]
24665                                 output += encode(temp >> 2)
24666                                 output += encode((temp << 4) & 0x3F)
24667                                 output += '=='
24668                                 break
24669                         case 2:
24670                                 temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
24671                                 output += encode(temp >> 10)
24672                                 output += encode((temp >> 4) & 0x3F)
24673                                 output += encode((temp << 2) & 0x3F)
24674                                 output += '='
24675                                 break
24676                 }
24678                 return output
24679         }
24681         exports.toByteArray = b64ToByteArray
24682         exports.fromByteArray = uint8ToBase64
24683 }( false ? (this.base64js = {}) : exports))
24686 /***/ }),
24687 /* 132 */
24688 /***/ (function(module, exports) {
24690 // Generated by CoffeeScript 1.7.1
24691 (function() {
24692   var AI, AL, B2, BA, BB, BK, CB, CJ, CL, CM, CP, CR, EX, GL, H2, H3, HL, HY, ID, IN, IS, JL, JT, JV, LF, NL, NS, NU, OP, PO, PR, QU, RI, SA, SG, SP, SY, WJ, XX, ZW;
24694   exports.OP = OP = 0;
24696   exports.CL = CL = 1;
24698   exports.CP = CP = 2;
24700   exports.QU = QU = 3;
24702   exports.GL = GL = 4;
24704   exports.NS = NS = 5;
24706   exports.EX = EX = 6;
24708   exports.SY = SY = 7;
24710   exports.IS = IS = 8;
24712   exports.PR = PR = 9;
24714   exports.PO = PO = 10;
24716   exports.NU = NU = 11;
24718   exports.AL = AL = 12;
24720   exports.HL = HL = 13;
24722   exports.ID = ID = 14;
24724   exports.IN = IN = 15;
24726   exports.HY = HY = 16;
24728   exports.BA = BA = 17;
24730   exports.BB = BB = 18;
24732   exports.B2 = B2 = 19;
24734   exports.ZW = ZW = 20;
24736   exports.CM = CM = 21;
24738   exports.WJ = WJ = 22;
24740   exports.H2 = H2 = 23;
24742   exports.H3 = H3 = 24;
24744   exports.JL = JL = 25;
24746   exports.JV = JV = 26;
24748   exports.JT = JT = 27;
24750   exports.RI = RI = 28;
24752   exports.AI = AI = 29;
24754   exports.BK = BK = 30;
24756   exports.CB = CB = 31;
24758   exports.CJ = CJ = 32;
24760   exports.CR = CR = 33;
24762   exports.LF = LF = 34;
24764   exports.NL = NL = 35;
24766   exports.SA = SA = 36;
24768   exports.SG = SG = 37;
24770   exports.SP = SP = 38;
24772   exports.XX = XX = 39;
24774 }).call(this);
24777 /***/ }),
24778 /* 133 */
24779 /***/ (function(module, exports) {
24781 // Generated by CoffeeScript 1.7.1
24782 (function() {
24783   var CI_BRK, CP_BRK, DI_BRK, IN_BRK, PR_BRK;
24785   exports.DI_BRK = DI_BRK = 0;
24787   exports.IN_BRK = IN_BRK = 1;
24789   exports.CI_BRK = CI_BRK = 2;
24791   exports.CP_BRK = CP_BRK = 3;
24793   exports.PR_BRK = PR_BRK = 4;
24795   exports.pairTable = [[PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, CP_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, CI_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, CI_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, DI_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, DI_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, CI_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, PR_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, CI_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK]];
24797 }).call(this);
24800 /***/ }),
24801 /* 134 */
24802 /***/ (function(module, exports, __webpack_require__) {
24804 "use strict";
24805 /*eslint no-unused-vars: ["error", {"args": "none"}]*/
24806 /*eslint no-redeclare: "off"*/
24809 /* qr.js -- QR code generator in Javascript (revision 2011-01-19)
24810  * Written by Kang Seonghoon <public+qrjs@mearie.org>.
24812  * This source code is in the public domain; if your jurisdiction does not
24813  * recognize the public domain the terms of Creative Commons CC0 license
24814  * apply. In the other words, you can always do what you want.
24815  */
24818 // per-version information (cf. JIS X 0510:2004 pp. 30--36, 71)
24820 // [0]: the degree of generator polynomial by ECC levels
24821 // [1]: # of code blocks by ECC levels
24822 // [2]: left-top positions of alignment patterns
24824 // the number in this table (in particular, [0]) does not exactly match with
24825 // the numbers in the specficiation. see augumenteccs below for the reason.
24826 var VERSIONS = [
24827         null,
24828         [[10, 7, 17, 13], [1, 1, 1, 1], []],
24829         [[16, 10, 28, 22], [1, 1, 1, 1], [4, 16]],
24830         [[26, 15, 22, 18], [1, 1, 2, 2], [4, 20]],
24831         [[18, 20, 16, 26], [2, 1, 4, 2], [4, 24]],
24832         [[24, 26, 22, 18], [2, 1, 4, 4], [4, 28]],
24833         [[16, 18, 28, 24], [4, 2, 4, 4], [4, 32]],
24834         [[18, 20, 26, 18], [4, 2, 5, 6], [4, 20, 36]],
24835         [[22, 24, 26, 22], [4, 2, 6, 6], [4, 22, 40]],
24836         [[22, 30, 24, 20], [5, 2, 8, 8], [4, 24, 44]],
24837         [[26, 18, 28, 24], [5, 4, 8, 8], [4, 26, 48]],
24838         [[30, 20, 24, 28], [5, 4, 11, 8], [4, 28, 52]],
24839         [[22, 24, 28, 26], [8, 4, 11, 10], [4, 30, 56]],
24840         [[22, 26, 22, 24], [9, 4, 16, 12], [4, 32, 60]],
24841         [[24, 30, 24, 20], [9, 4, 16, 16], [4, 24, 44, 64]],
24842         [[24, 22, 24, 30], [10, 6, 18, 12], [4, 24, 46, 68]],
24843         [[28, 24, 30, 24], [10, 6, 16, 17], [4, 24, 48, 72]],
24844         [[28, 28, 28, 28], [11, 6, 19, 16], [4, 28, 52, 76]],
24845         [[26, 30, 28, 28], [13, 6, 21, 18], [4, 28, 54, 80]],
24846         [[26, 28, 26, 26], [14, 7, 25, 21], [4, 28, 56, 84]],
24847         [[26, 28, 28, 30], [16, 8, 25, 20], [4, 32, 60, 88]],
24848         [[26, 28, 30, 28], [17, 8, 25, 23], [4, 26, 48, 70, 92]],
24849         [[28, 28, 24, 30], [17, 9, 34, 23], [4, 24, 48, 72, 96]],
24850         [[28, 30, 30, 30], [18, 9, 30, 25], [4, 28, 52, 76, 100]],
24851         [[28, 30, 30, 30], [20, 10, 32, 27], [4, 26, 52, 78, 104]],
24852         [[28, 26, 30, 30], [21, 12, 35, 29], [4, 30, 56, 82, 108]],
24853         [[28, 28, 30, 28], [23, 12, 37, 34], [4, 28, 56, 84, 112]],
24854         [[28, 30, 30, 30], [25, 12, 40, 34], [4, 32, 60, 88, 116]],
24855         [[28, 30, 30, 30], [26, 13, 42, 35], [4, 24, 48, 72, 96, 120]],
24856         [[28, 30, 30, 30], [28, 14, 45, 38], [4, 28, 52, 76, 100, 124]],
24857         [[28, 30, 30, 30], [29, 15, 48, 40], [4, 24, 50, 76, 102, 128]],
24858         [[28, 30, 30, 30], [31, 16, 51, 43], [4, 28, 54, 80, 106, 132]],
24859         [[28, 30, 30, 30], [33, 17, 54, 45], [4, 32, 58, 84, 110, 136]],
24860         [[28, 30, 30, 30], [35, 18, 57, 48], [4, 28, 56, 84, 112, 140]],
24861         [[28, 30, 30, 30], [37, 19, 60, 51], [4, 32, 60, 88, 116, 144]],
24862         [[28, 30, 30, 30], [38, 19, 63, 53], [4, 28, 52, 76, 100, 124, 148]],
24863         [[28, 30, 30, 30], [40, 20, 66, 56], [4, 22, 48, 74, 100, 126, 152]],
24864         [[28, 30, 30, 30], [43, 21, 70, 59], [4, 26, 52, 78, 104, 130, 156]],
24865         [[28, 30, 30, 30], [45, 22, 74, 62], [4, 30, 56, 82, 108, 134, 160]],
24866         [[28, 30, 30, 30], [47, 24, 77, 65], [4, 24, 52, 80, 108, 136, 164]],
24867         [[28, 30, 30, 30], [49, 25, 81, 68], [4, 28, 56, 84, 112, 140, 168]]];
24869 // mode constants (cf. Table 2 in JIS X 0510:2004 p. 16)
24870 var MODE_TERMINATOR = 0;
24871 var MODE_NUMERIC = 1, MODE_ALPHANUMERIC = 2, MODE_OCTET = 4, MODE_KANJI = 8;
24873 // validation regexps
24874 var NUMERIC_REGEXP = /^\d*$/;
24875 var ALPHANUMERIC_REGEXP = /^[A-Za-z0-9 $%*+\-./:]*$/;
24876 var ALPHANUMERIC_OUT_REGEXP = /^[A-Z0-9 $%*+\-./:]*$/;
24878 // ECC levels (cf. Table 22 in JIS X 0510:2004 p. 45)
24879 var ECCLEVEL_L = 1, ECCLEVEL_M = 0, ECCLEVEL_Q = 3, ECCLEVEL_H = 2;
24881 // GF(2^8)-to-integer mapping with a reducing polynomial x^8+x^4+x^3+x^2+1
24882 // invariant: GF256_MAP[GF256_INVMAP[i]] == i for all i in [1,256)
24883 var GF256_MAP = [], GF256_INVMAP = [-1];
24884 for (var i = 0, v = 1; i < 255; ++i) {
24885         GF256_MAP.push(v);
24886         GF256_INVMAP[v] = i;
24887         v = (v * 2) ^ (v >= 128 ? 0x11d : 0);
24890 // generator polynomials up to degree 30
24891 // (should match with polynomials in JIS X 0510:2004 Appendix A)
24893 // generator polynomial of degree K is product of (x-\alpha^0), (x-\alpha^1),
24894 // ..., (x-\alpha^(K-1)). by convention, we omit the K-th coefficient (always 1)
24895 // from the result; also other coefficients are written in terms of the exponent
24896 // to \alpha to avoid the redundant calculation. (see also calculateecc below.)
24897 var GF256_GENPOLY = [[]];
24898 for (var i = 0; i < 30; ++i) {
24899         var prevpoly = GF256_GENPOLY[i], poly = [];
24900         for (var j = 0; j <= i; ++j) {
24901                 var a = (j < i ? GF256_MAP[prevpoly[j]] : 0);
24902                 var b = GF256_MAP[(i + (prevpoly[j - 1] || 0)) % 255];
24903                 poly.push(GF256_INVMAP[a ^ b]);
24904         }
24905         GF256_GENPOLY.push(poly);
24908 // alphanumeric character mapping (cf. Table 5 in JIS X 0510:2004 p. 19)
24909 var ALPHANUMERIC_MAP = {};
24910 for (var i = 0; i < 45; ++i) {
24911         ALPHANUMERIC_MAP['0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:'.charAt(i)] = i;
24914 // mask functions in terms of row # and column #
24915 // (cf. Table 20 in JIS X 0510:2004 p. 42)
24916 /*jshint unused: false */
24917 var MASKFUNCS = [
24918         function (i, j) {
24919                 return (i + j) % 2 === 0;
24920         },
24921         function (i, j) {
24922                 return i % 2 === 0;
24923         },
24924         function (i, j) {
24925                 return j % 3 === 0;
24926         },
24927         function (i, j) {
24928                 return (i + j) % 3 === 0;
24929         },
24930         function (i, j) {
24931                 return (((i / 2) | 0) + ((j / 3) | 0)) % 2 === 0;
24932         },
24933         function (i, j) {
24934                 return (i * j) % 2 + (i * j) % 3 === 0;
24935         },
24936         function (i, j) {
24937                 return ((i * j) % 2 + (i * j) % 3) % 2 === 0;
24938         },
24939         function (i, j) {
24940                 return ((i + j) % 2 + (i * j) % 3) % 2 === 0;
24941         }];
24943 // returns true when the version information has to be embeded.
24944 var needsverinfo = function (ver) {
24945         return ver > 6;
24948 // returns the size of entire QR code for given version.
24949 var getsizebyver = function (ver) {
24950         return 4 * ver + 17;
24953 // returns the number of bits available for code words in this version.
24954 var nfullbits = function (ver) {
24955         /*
24956          * |<--------------- n --------------->|
24957          * |        |<----- n-17 ---->|        |
24958          * +-------+                ///+-------+ ----
24959          * |       |                ///|       |    ^
24960          * |  9x9  |       @@@@@    ///|  9x8  |    |
24961          * |       | # # # @5x5@ # # # |       |    |
24962          * +-------+       @@@@@       +-------+    |
24963          *       #                               ---|
24964          *                                        ^ |
24965          *       #                                |
24966          *     @@@@@       @@@@@       @@@@@      | n
24967          *     @5x5@       @5x5@       @5x5@   n-17
24968          *     @@@@@       @@@@@       @@@@@      | |
24969          *       #                                | |
24970          * //////                                 v |
24971          * //////#                               ---|
24972          * +-------+       @@@@@       @@@@@        |
24973          * |       |       @5x5@       @5x5@        |
24974          * |  8x9  |       @@@@@       @@@@@        |
24975          * |       |                                v
24976          * +-------+                             ----
24977          *
24978          * when the entire code has n^2 modules and there are m^2-3 alignment
24979          * patterns, we have:
24980          * - 225 (= 9x9 + 9x8 + 8x9) modules for finder patterns and
24981          *   format information;
24982          * - 2n-34 (= 2(n-17)) modules for timing patterns;
24983          * - 36 (= 3x6 + 6x3) modules for version information, if any;
24984          * - 25m^2-75 (= (m^2-3)(5x5)) modules for alignment patterns
24985          *   if any, but 10m-20 (= 2(m-2)x5) of them overlaps with
24986          *   timing patterns.
24987          */
24988         var v = VERSIONS[ver];
24989         var nbits = 16 * ver * ver + 128 * ver + 64; // finder, timing and format info.
24990         if (needsverinfo(ver))
24991                 nbits -= 36; // version information
24992         if (v[2].length) { // alignment patterns
24993                 nbits -= 25 * v[2].length * v[2].length - 10 * v[2].length - 55;
24994         }
24995         return nbits;
24998 // returns the number of bits available for data portions (i.e. excludes ECC
24999 // bits but includes mode and length bits) in this version and ECC level.
25000 var ndatabits = function (ver, ecclevel) {
25001         var nbits = nfullbits(ver) & ~7; // no sub-octet code words
25002         var v = VERSIONS[ver];
25003         nbits -= 8 * v[0][ecclevel] * v[1][ecclevel]; // ecc bits
25004         return nbits;
25007 // returns the number of bits required for the length of data.
25008 // (cf. Table 3 in JIS X 0510:2004 p. 16)
25009 var ndatalenbits = function (ver, mode) {
25010         switch (mode) {
25011                 case MODE_NUMERIC:
25012                         return (ver < 10 ? 10 : ver < 27 ? 12 : 14);
25013                 case MODE_ALPHANUMERIC:
25014                         return (ver < 10 ? 9 : ver < 27 ? 11 : 13);
25015                 case MODE_OCTET:
25016                         return (ver < 10 ? 8 : 16);
25017                 case MODE_KANJI:
25018                         return (ver < 10 ? 8 : ver < 27 ? 10 : 12);
25019         }
25022 // returns the maximum length of data possible in given configuration.
25023 var getmaxdatalen = function (ver, mode, ecclevel) {
25024         var nbits = ndatabits(ver, ecclevel) - 4 - ndatalenbits(ver, mode); // 4 for mode bits
25025         switch (mode) {
25026                 case MODE_NUMERIC:
25027                         return ((nbits / 10) | 0) * 3 + (nbits % 10 < 4 ? 0 : nbits % 10 < 7 ? 1 : 2);
25028                 case MODE_ALPHANUMERIC:
25029                         return ((nbits / 11) | 0) * 2 + (nbits % 11 < 6 ? 0 : 1);
25030                 case MODE_OCTET:
25031                         return (nbits / 8) | 0;
25032                 case MODE_KANJI:
25033                         return (nbits / 13) | 0;
25034         }
25037 // checks if the given data can be encoded in given mode, and returns
25038 // the converted data for the further processing if possible. otherwise
25039 // returns null.
25041 // this function does not check the length of data; it is a duty of
25042 // encode function below (as it depends on the version and ECC level too).
25043 var validatedata = function (mode, data) {
25044         switch (mode) {
25045                 case MODE_NUMERIC:
25046                         if (!data.match(NUMERIC_REGEXP))
25047                                 return null;
25048                         return data;
25050                 case MODE_ALPHANUMERIC:
25051                         if (!data.match(ALPHANUMERIC_REGEXP))
25052                                 return null;
25053                         return data.toUpperCase();
25055                 case MODE_OCTET:
25056                         if (typeof data === 'string') { // encode as utf-8 string
25057                                 var newdata = [];
25058                                 for (var i = 0; i < data.length; ++i) {
25059                                         var ch = data.charCodeAt(i);
25060                                         if (ch < 0x80) {
25061                                                 newdata.push(ch);
25062                                         } else if (ch < 0x800) {
25063                                                 newdata.push(0xc0 | (ch >> 6),
25064                                                         0x80 | (ch & 0x3f));
25065                                         } else if (ch < 0x10000) {
25066                                                 newdata.push(0xe0 | (ch >> 12),
25067                                                         0x80 | ((ch >> 6) & 0x3f),
25068                                                         0x80 | (ch & 0x3f));
25069                                         } else {
25070                                                 newdata.push(0xf0 | (ch >> 18),
25071                                                         0x80 | ((ch >> 12) & 0x3f),
25072                                                         0x80 | ((ch >> 6) & 0x3f),
25073                                                         0x80 | (ch & 0x3f));
25074                                         }
25075                                 }
25076                                 return newdata;
25077                         } else {
25078                                 return data;
25079                         }
25080         }
25083 // returns the code words (sans ECC bits) for given data and configurations.
25084 // requires data to be preprocessed by validatedata. no length check is
25085 // performed, and everything has to be checked before calling this function.
25086 var encode = function (ver, mode, data, maxbuflen) {
25087         var buf = [];
25088         var bits = 0, remaining = 8;
25089         var datalen = data.length;
25091         // this function is intentionally no-op when n=0.
25092         var pack = function (x, n) {
25093                 if (n >= remaining) {
25094                         buf.push(bits | (x >> (n -= remaining)));
25095                         while (n >= 8)
25096                                 buf.push((x >> (n -= 8)) & 255);
25097                         bits = 0;
25098                         remaining = 8;
25099                 }
25100                 if (n > 0)
25101                         bits |= (x & ((1 << n) - 1)) << (remaining -= n);
25102         };
25104         var nlenbits = ndatalenbits(ver, mode);
25105         pack(mode, 4);
25106         pack(datalen, nlenbits);
25108         switch (mode) {
25109                 case MODE_NUMERIC:
25110                         for (var i = 2; i < datalen; i += 3) {
25111                                 pack(parseInt(data.substring(i - 2, i + 1), 10), 10);
25112                         }
25113                         pack(parseInt(data.substring(i - 2), 10), [0, 4, 7][datalen % 3]);
25114                         break;
25116                 case MODE_ALPHANUMERIC:
25117                         for (var i = 1; i < datalen; i += 2) {
25118                                 pack(ALPHANUMERIC_MAP[data.charAt(i - 1)] * 45 +
25119                                         ALPHANUMERIC_MAP[data.charAt(i)], 11);
25120                         }
25121                         if (datalen % 2 == 1) {
25122                                 pack(ALPHANUMERIC_MAP[data.charAt(i - 1)], 6);
25123                         }
25124                         break;
25126                 case MODE_OCTET:
25127                         for (var i = 0; i < datalen; ++i) {
25128                                 pack(data[i], 8);
25129                         }
25130                         break;
25131         }
25133         // final bits. it is possible that adding terminator causes the buffer
25134         // to overflow, but then the buffer truncated to the maximum size will
25135         // be valid as the truncated terminator mode bits and padding is
25136         // identical in appearance (cf. JIS X 0510:2004 sec 8.4.8).
25137         pack(MODE_TERMINATOR, 4);
25138         if (remaining < 8)
25139                 buf.push(bits);
25141         // the padding to fill up the remaining space. we should not add any
25142         // words when the overflow already occurred.
25143         while (buf.length + 1 < maxbuflen)
25144                 buf.push(0xec, 0x11);
25145         if (buf.length < maxbuflen)
25146                 buf.push(0xec);
25147         return buf;
25150 // calculates ECC code words for given code words and generator polynomial.
25152 // this is quite similar to CRC calculation as both Reed-Solomon and CRC use
25153 // the certain kind of cyclic codes, which is effectively the division of
25154 // zero-augumented polynomial by the generator polynomial. the only difference
25155 // is that Reed-Solomon uses GF(2^8), instead of CRC's GF(2), and Reed-Solomon
25156 // uses the different generator polynomial than CRC's.
25157 var calculateecc = function (poly, genpoly) {
25158         var modulus = poly.slice(0);
25159         var polylen = poly.length, genpolylen = genpoly.length;
25160         for (var i = 0; i < genpolylen; ++i)
25161                 modulus.push(0);
25162         for (var i = 0; i < polylen; ) {
25163                 var quotient = GF256_INVMAP[modulus[i++]];
25164                 if (quotient >= 0) {
25165                         for (var j = 0; j < genpolylen; ++j) {
25166                                 modulus[i + j] ^= GF256_MAP[(quotient + genpoly[j]) % 255];
25167                         }
25168                 }
25169         }
25170         return modulus.slice(polylen);
25173 // auguments ECC code words to given code words. the resulting words are
25174 // ready to be encoded in the matrix.
25176 // the much of actual augumenting procedure follows JIS X 0510:2004 sec 8.7.
25177 // the code is simplified using the fact that the size of each code & ECC
25178 // blocks is almost same; for example, when we have 4 blocks and 46 data words
25179 // the number of code words in those blocks are 11, 11, 12, 12 respectively.
25180 var augumenteccs = function (poly, nblocks, genpoly) {
25181         var subsizes = [];
25182         var subsize = (poly.length / nblocks) | 0, subsize0 = 0;
25183         var pivot = nblocks - poly.length % nblocks;
25184         for (var i = 0; i < pivot; ++i) {
25185                 subsizes.push(subsize0);
25186                 subsize0 += subsize;
25187         }
25188         for (var i = pivot; i < nblocks; ++i) {
25189                 subsizes.push(subsize0);
25190                 subsize0 += subsize + 1;
25191         }
25192         subsizes.push(subsize0);
25194         var eccs = [];
25195         for (var i = 0; i < nblocks; ++i) {
25196                 eccs.push(calculateecc(poly.slice(subsizes[i], subsizes[i + 1]), genpoly));
25197         }
25199         var result = [];
25200         var nitemsperblock = (poly.length / nblocks) | 0;
25201         for (var i = 0; i < nitemsperblock; ++i) {
25202                 for (var j = 0; j < nblocks; ++j) {
25203                         result.push(poly[subsizes[j] + i]);
25204                 }
25205         }
25206         for (var j = pivot; j < nblocks; ++j) {
25207                 result.push(poly[subsizes[j + 1] - 1]);
25208         }
25209         for (var i = 0; i < genpoly.length; ++i) {
25210                 for (var j = 0; j < nblocks; ++j) {
25211                         result.push(eccs[j][i]);
25212                 }
25213         }
25214         return result;
25217 // auguments BCH(p+q,q) code to the polynomial over GF(2), given the proper
25218 // genpoly. the both input and output are in binary numbers, and unlike
25219 // calculateecc genpoly should include the 1 bit for the highest degree.
25221 // actual polynomials used for this procedure are as follows:
25222 // - p=10, q=5, genpoly=x^10+x^8+x^5+x^4+x^2+x+1 (JIS X 0510:2004 Appendix C)
25223 // - p=18, q=6, genpoly=x^12+x^11+x^10+x^9+x^8+x^5+x^2+1 (ibid. Appendix D)
25224 var augumentbch = function (poly, p, genpoly, q) {
25225         var modulus = poly << q;
25226         for (var i = p - 1; i >= 0; --i) {
25227                 if ((modulus >> (q + i)) & 1)
25228                         modulus ^= genpoly << i;
25229         }
25230         return (poly << q) | modulus;
25233 // creates the base matrix for given version. it returns two matrices, one of
25234 // them is the actual one and the another represents the "reserved" portion
25235 // (e.g. finder and timing patterns) of the matrix.
25237 // some entries in the matrix may be undefined, rather than 0 or 1. this is
25238 // intentional (no initialization needed!), and putdata below will fill
25239 // the remaining ones.
25240 var makebasematrix = function (ver) {
25241         var v = VERSIONS[ver], n = getsizebyver(ver);
25242         var matrix = [], reserved = [];
25243         for (var i = 0; i < n; ++i) {
25244                 matrix.push([]);
25245                 reserved.push([]);
25246         }
25248         var blit = function (y, x, h, w, bits) {
25249                 for (var i = 0; i < h; ++i) {
25250                         for (var j = 0; j < w; ++j) {
25251                                 matrix[y + i][x + j] = (bits[i] >> j) & 1;
25252                                 reserved[y + i][x + j] = 1;
25253                         }
25254                 }
25255         };
25257         // finder patterns and a part of timing patterns
25258         // will also mark the format information area (not yet written) as reserved.
25259         blit(0, 0, 9, 9, [0x7f, 0x41, 0x5d, 0x5d, 0x5d, 0x41, 0x17f, 0x00, 0x40]);
25260         blit(n - 8, 0, 8, 9, [0x100, 0x7f, 0x41, 0x5d, 0x5d, 0x5d, 0x41, 0x7f]);
25261         blit(0, n - 8, 9, 8, [0xfe, 0x82, 0xba, 0xba, 0xba, 0x82, 0xfe, 0x00, 0x00]);
25263         // the rest of timing patterns
25264         for (var i = 9; i < n - 8; ++i) {
25265                 matrix[6][i] = matrix[i][6] = ~i & 1;
25266                 reserved[6][i] = reserved[i][6] = 1;
25267         }
25269         // alignment patterns
25270         var aligns = v[2], m = aligns.length;
25271         for (var i = 0; i < m; ++i) {
25272                 var minj = (i === 0 || i === m - 1 ? 1 : 0), maxj = (i === 0 ? m - 1 : m);
25273                 for (var j = minj; j < maxj; ++j) {
25274                         blit(aligns[i], aligns[j], 5, 5, [0x1f, 0x11, 0x15, 0x11, 0x1f]);
25275                 }
25276         }
25278         // version information
25279         if (needsverinfo(ver)) {
25280                 var code = augumentbch(ver, 6, 0x1f25, 12);
25281                 var k = 0;
25282                 for (var i = 0; i < 6; ++i) {
25283                         for (var j = 0; j < 3; ++j) {
25284                                 matrix[i][(n - 11) + j] = matrix[(n - 11) + j][i] = (code >> k++) & 1;
25285                                 reserved[i][(n - 11) + j] = reserved[(n - 11) + j][i] = 1;
25286                         }
25287                 }
25288         }
25290         return {matrix: matrix, reserved: reserved};
25293 // fills the data portion (i.e. unmarked in reserved) of the matrix with given
25294 // code words. the size of code words should be no more than available bits,
25295 // and remaining bits are padded to 0 (cf. JIS X 0510:2004 sec 8.7.3).
25296 var putdata = function (matrix, reserved, buf) {
25297         var n = matrix.length;
25298         var k = 0, dir = -1;
25299         for (var i = n - 1; i >= 0; i -= 2) {
25300                 if (i == 6)
25301                         --i; // skip the entire timing pattern column
25302                 var jj = (dir < 0 ? n - 1 : 0);
25303                 for (var j = 0; j < n; ++j) {
25304                         for (var ii = i; ii > i - 2; --ii) {
25305                                 if (!reserved[jj][ii]) {
25306                                         // may overflow, but (undefined >> x)
25307                                         // is 0 so it will auto-pad to zero.
25308                                         matrix[jj][ii] = (buf[k >> 3] >> (~k & 7)) & 1;
25309                                         ++k;
25310                                 }
25311                         }
25312                         jj += dir;
25313                 }
25314                 dir = -dir;
25315         }
25316         return matrix;
25319 // XOR-masks the data portion of the matrix. repeating the call with the same
25320 // arguments will revert the prior call (convenient in the matrix evaluation).
25321 var maskdata = function (matrix, reserved, mask) {
25322         var maskf = MASKFUNCS[mask];
25323         var n = matrix.length;
25324         for (var i = 0; i < n; ++i) {
25325                 for (var j = 0; j < n; ++j) {
25326                         if (!reserved[i][j])
25327                                 matrix[i][j] ^= maskf(i, j);
25328                 }
25329         }
25330         return matrix;
25333 // puts the format information.
25334 var putformatinfo = function (matrix, reserved, ecclevel, mask) {
25335         var n = matrix.length;
25336         var code = augumentbch((ecclevel << 3) | mask, 5, 0x537, 10) ^ 0x5412;
25337         for (var i = 0; i < 15; ++i) {
25338                 var r = [0, 1, 2, 3, 4, 5, 7, 8, n - 7, n - 6, n - 5, n - 4, n - 3, n - 2, n - 1][i];
25339                 var c = [n - 1, n - 2, n - 3, n - 4, n - 5, n - 6, n - 7, n - 8, 7, 5, 4, 3, 2, 1, 0][i];
25340                 matrix[r][8] = matrix[8][c] = (code >> i) & 1;
25341                 // we don't have to mark those bits reserved; always done
25342                 // in makebasematrix above.
25343         }
25344         return matrix;
25347 // evaluates the resulting matrix and returns the score (lower is better).
25348 // (cf. JIS X 0510:2004 sec 8.8.2)
25350 // the evaluation procedure tries to avoid the problematic patterns naturally
25351 // occuring from the original matrix. for example, it penaltizes the patterns
25352 // which just look like the finder pattern which will confuse the decoder.
25353 // we choose the mask which results in the lowest score among 8 possible ones.
25355 // note: zxing seems to use the same procedure and in many cases its choice
25356 // agrees to ours, but sometimes it does not. practically it doesn't matter.
25357 var evaluatematrix = function (matrix) {
25358         // N1+(k-5) points for each consecutive row of k same-colored modules,
25359         // where k >= 5. no overlapping row counts.
25360         var PENALTY_CONSECUTIVE = 3;
25361         // N2 points for each 2x2 block of same-colored modules.
25362         // overlapping block does count.
25363         var PENALTY_TWOBYTWO = 3;
25364         // N3 points for each pattern with >4W:1B:1W:3B:1W:1B or
25365         // 1B:1W:3B:1W:1B:>4W, or their multiples (e.g. highly unlikely,
25366         // but 13W:3B:3W:9B:3W:3B counts).
25367         var PENALTY_FINDERLIKE = 40;
25368         // N4*k points for every (5*k)% deviation from 50% black density.
25369         // i.e. k=1 for 55~60% and 40~45%, k=2 for 60~65% and 35~40%, etc.
25370         var PENALTY_DENSITY = 10;
25372         var evaluategroup = function (groups) { // assumes [W,B,W,B,W,...,B,W]
25373                 var score = 0;
25374                 for (var i = 0; i < groups.length; ++i) {
25375                         if (groups[i] >= 5)
25376                                 score += PENALTY_CONSECUTIVE + (groups[i] - 5);
25377                 }
25378                 for (var i = 5; i < groups.length; i += 2) {
25379                         var p = groups[i];
25380                         if (groups[i - 1] == p && groups[i - 2] == 3 * p && groups[i - 3] == p &&
25381                                 groups[i - 4] == p && (groups[i - 5] >= 4 * p || groups[i + 1] >= 4 * p)) {
25382                                 // this part differs from zxing...
25383                                 score += PENALTY_FINDERLIKE;
25384                         }
25385                 }
25386                 return score;
25387         };
25389         var n = matrix.length;
25390         var score = 0, nblacks = 0;
25391         for (var i = 0; i < n; ++i) {
25392                 var row = matrix[i];
25393                 var groups;
25395                 // evaluate the current row
25396                 groups = [0]; // the first empty group of white
25397                 for (var j = 0; j < n; ) {
25398                         var k;
25399                         for (k = 0; j < n && row[j]; ++k)
25400                                 ++j;
25401                         groups.push(k);
25402                         for (k = 0; j < n && !row[j]; ++k)
25403                                 ++j;
25404                         groups.push(k);
25405                 }
25406                 score += evaluategroup(groups);
25408                 // evaluate the current column
25409                 groups = [0];
25410                 for (var j = 0; j < n; ) {
25411                         var k;
25412                         for (k = 0; j < n && matrix[j][i]; ++k)
25413                                 ++j;
25414                         groups.push(k);
25415                         for (k = 0; j < n && !matrix[j][i]; ++k)
25416                                 ++j;
25417                         groups.push(k);
25418                 }
25419                 score += evaluategroup(groups);
25421                 // check the 2x2 box and calculate the density
25422                 var nextrow = matrix[i + 1] || [];
25423                 nblacks += row[0];
25424                 for (var j = 1; j < n; ++j) {
25425                         var p = row[j];
25426                         nblacks += p;
25427                         // at least comparison with next row should be strict...
25428                         if (row[j - 1] == p && nextrow[j] === p && nextrow[j - 1] === p) {
25429                                 score += PENALTY_TWOBYTWO;
25430                         }
25431                 }
25432         }
25434         score += PENALTY_DENSITY * ((Math.abs(nblacks / n / n - 0.5) / 0.05) | 0);
25435         return score;
25438 // returns the fully encoded QR code matrix which contains given data.
25439 // it also chooses the best mask automatically when mask is -1.
25440 var generate = function (data, ver, mode, ecclevel, mask) {
25441         var v = VERSIONS[ver];
25442         var buf = encode(ver, mode, data, ndatabits(ver, ecclevel) >> 3);
25443         buf = augumenteccs(buf, v[1][ecclevel], GF256_GENPOLY[v[0][ecclevel]]);
25445         var result = makebasematrix(ver);
25446         var matrix = result.matrix, reserved = result.reserved;
25447         putdata(matrix, reserved, buf);
25449         if (mask < 0) {
25450                 // find the best mask
25451                 maskdata(matrix, reserved, 0);
25452                 putformatinfo(matrix, reserved, ecclevel, 0);
25453                 var bestmask = 0, bestscore = evaluatematrix(matrix);
25454                 maskdata(matrix, reserved, 0);
25455                 for (mask = 1; mask < 8; ++mask) {
25456                         maskdata(matrix, reserved, mask);
25457                         putformatinfo(matrix, reserved, ecclevel, mask);
25458                         var score = evaluatematrix(matrix);
25459                         if (bestscore > score) {
25460                                 bestscore = score;
25461                                 bestmask = mask;
25462                         }
25463                         maskdata(matrix, reserved, mask);
25464                 }
25465                 mask = bestmask;
25466         }
25468         maskdata(matrix, reserved, mask);
25469         putformatinfo(matrix, reserved, ecclevel, mask);
25470         return matrix;
25473 // the public interface is trivial; the options available are as follows:
25475 // - version: an integer in [1,40]. when omitted (or -1) the smallest possible
25476 //   version is chosen.
25477 // - mode: one of 'numeric', 'alphanumeric', 'octet'. when omitted the smallest
25478 //   possible mode is chosen.
25479 // - eccLevel: one of 'L', 'M', 'Q', 'H'. defaults to 'L'.
25480 // - mask: an integer in [0,7]. when omitted (or -1) the best mask is chosen.
25483 function generateFrame(data, options) {
25484         var MODES = {'numeric': MODE_NUMERIC, 'alphanumeric': MODE_ALPHANUMERIC,
25485                 'octet': MODE_OCTET};
25486         var ECCLEVELS = {'L': ECCLEVEL_L, 'M': ECCLEVEL_M, 'Q': ECCLEVEL_Q,
25487                 'H': ECCLEVEL_H};
25489         options = options || {};
25490         var ver = options.version || -1;
25491         var ecclevel = ECCLEVELS[(options.eccLevel || 'L').toUpperCase()];
25492         var mode = options.mode ? MODES[options.mode.toLowerCase()] : -1;
25493         var mask = 'mask' in options ? options.mask : -1;
25495         if (mode < 0) {
25496                 if (typeof data === 'string') {
25497                         if (data.match(NUMERIC_REGEXP)) {
25498                                 mode = MODE_NUMERIC;
25499                         } else if (data.match(ALPHANUMERIC_OUT_REGEXP)) {
25500                                 // while encode supports case-insensitive encoding, we restrict the data to be uppercased when auto-selecting the mode.
25501                                 mode = MODE_ALPHANUMERIC;
25502                         } else {
25503                                 mode = MODE_OCTET;
25504                         }
25505                 } else {
25506                         mode = MODE_OCTET;
25507                 }
25508         } else if (!(mode == MODE_NUMERIC || mode == MODE_ALPHANUMERIC ||
25509                 mode == MODE_OCTET)) {
25510                 throw 'invalid or unsupported mode';
25511         }
25513         data = validatedata(mode, data);
25514         if (data === null)
25515                 throw 'invalid data format';
25517         if (ecclevel < 0 || ecclevel > 3)
25518                 throw 'invalid ECC level';
25520         if (ver < 0) {
25521                 for (ver = 1; ver <= 40; ++ver) {
25522                         if (data.length <= getmaxdatalen(ver, mode, ecclevel))
25523                                 break;
25524                 }
25525                 if (ver > 40)
25526                         throw 'too large data for the Qr format';
25527         } else if (ver < 1 || ver > 40) {
25528                 throw 'invalid Qr version! should be between 1 and 40';
25529         }
25531         if (mask != -1 && (mask < 0 || mask > 8))
25532                 throw 'invalid mask';
25533         //console.log('version:', ver, 'mode:', mode, 'ECC:', ecclevel, 'mask:', mask )
25534         return generate(data, ver, mode, ecclevel, mask);
25538 // options
25539 // - modulesize: a number. this is a size of each modules in pixels, and
25540 //   defaults to 5px.
25541 // - margin: a number. this is a size of margin in *modules*, and defaults to
25542 //   4 (white modules). the specficiation mandates the margin no less than 4
25543 //   modules, so it is better not to alter this value unless you know what
25544 //   you're doing.
25545 function buildCanvas(data, options) {
25547         var canvas = [];
25548         var background = options.background || '#fff';
25549         var foreground = options.foreground || '#000';
25550         //var margin = options.margin || 4;
25551         var matrix = generateFrame(data, options);
25552         var n = matrix.length;
25553         var modSize = Math.floor(options.fit ? options.fit / n : 5);
25554         var size = n * modSize;
25556         canvas.push({
25557                 type: 'rect',
25558                 x: 0, y: 0, w: size, h: size, lineWidth: 0, color: background
25559         });
25561         for (var i = 0; i < n; ++i) {
25562                 for (var j = 0; j < n; ++j) {
25563                         if (matrix[i][j]) {
25564                                 canvas.push({
25565                                         type: 'rect',
25566                                         x: modSize * j,
25567                                         y: modSize * i,
25568                                         w: modSize,
25569                                         h: modSize,
25570                                         lineWidth: 0,
25571                                         color: foreground
25572                                 });
25573                         }
25574                 }
25575         }
25577         return {
25578                 canvas: canvas,
25579                 size: size
25580         };
25584 function measure(node) {
25585         var cd = buildCanvas(node.qr, node);
25586         node._canvas = cd.canvas;
25587         node._width = node._height = node._minWidth = node._maxWidth = node._minHeight = node._maxHeight = cd.size;
25588         return node;
25591 module.exports = {
25592         measure: measure
25595 /***/ }),
25596 /* 135 */
25597 /***/ (function(module, exports, __webpack_require__) {
25599 "use strict";
25602 var ElementWriter = __webpack_require__(136);
25605  * Creates an instance of PageElementWriter - an extended ElementWriter
25606  * which can handle:
25607  * - page-breaks (it adds new pages when there's not enough space left),
25608  * - repeatable fragments (like table-headers, which are repeated everytime
25609  *                         a page-break occurs)
25610  * - transactions (used for unbreakable-blocks when we want to make sure
25611  *                 whole block will be rendered on the same page)
25612  */
25613 function PageElementWriter(context, tracker) {
25614         this.transactionLevel = 0;
25615         this.repeatables = [];
25616         this.tracker = tracker;
25617         this.writer = new ElementWriter(context, tracker);
25620 function fitOnPage(self, addFct) {
25621         var position = addFct(self);
25622         if (!position) {
25623                 self.moveToNextPage();
25624                 position = addFct(self);
25625         }
25626         return position;
25629 PageElementWriter.prototype.addLine = function (line, dontUpdateContextPosition, index) {
25630         return fitOnPage(this, function (self) {
25631                 return self.writer.addLine(line, dontUpdateContextPosition, index);
25632         });
25635 PageElementWriter.prototype.addImage = function (image, index) {
25636         return fitOnPage(this, function (self) {
25637                 return self.writer.addImage(image, index);
25638         });
25641 PageElementWriter.prototype.addQr = function (qr, index) {
25642         return fitOnPage(this, function (self) {
25643                 return self.writer.addQr(qr, index);
25644         });
25647 PageElementWriter.prototype.addVector = function (vector, ignoreContextX, ignoreContextY, index) {
25648         return this.writer.addVector(vector, ignoreContextX, ignoreContextY, index);
25651 PageElementWriter.prototype.beginClip = function (width, height) {
25652         return this.writer.beginClip(width, height);
25655 PageElementWriter.prototype.endClip = function () {
25656         return this.writer.endClip();
25659 PageElementWriter.prototype.alignCanvas = function (node) {
25660         this.writer.alignCanvas(node);
25663 PageElementWriter.prototype.addFragment = function (fragment, useBlockXOffset, useBlockYOffset, dontUpdateContextPosition) {
25664         if (!this.writer.addFragment(fragment, useBlockXOffset, useBlockYOffset, dontUpdateContextPosition)) {
25665                 this.moveToNextPage();
25666                 this.writer.addFragment(fragment, useBlockXOffset, useBlockYOffset, dontUpdateContextPosition);
25667         }
25670 PageElementWriter.prototype.moveToNextPage = function (pageOrientation) {
25672         var nextPage = this.writer.context.moveToNextPage(pageOrientation);
25674         if (nextPage.newPageCreated) {
25675                 this.repeatables.forEach(function (rep) {
25676                         this.writer.addFragment(rep, true);
25677                 }, this);
25678         } else {
25679                 this.repeatables.forEach(function (rep) {
25680                         this.writer.context.moveDown(rep.height);
25681                 }, this);
25682         }
25684         this.writer.tracker.emit('pageChanged', {
25685                 prevPage: nextPage.prevPage,
25686                 prevY: nextPage.prevY,
25687                 y: nextPage.y
25688         });
25691 PageElementWriter.prototype.beginUnbreakableBlock = function (width, height) {
25692         if (this.transactionLevel++ === 0) {
25693                 this.originalX = this.writer.context.x;
25694                 this.writer.pushContext(width, height);
25695         }
25698 PageElementWriter.prototype.commitUnbreakableBlock = function (forcedX, forcedY) {
25699         if (--this.transactionLevel === 0) {
25700                 var unbreakableContext = this.writer.context;
25701                 this.writer.popContext();
25703                 var nbPages = unbreakableContext.pages.length;
25704                 if (nbPages > 0) {
25705                         // no support for multi-page unbreakableBlocks
25706                         var fragment = unbreakableContext.pages[0];
25707                         fragment.xOffset = forcedX;
25708                         fragment.yOffset = forcedY;
25710                         //TODO: vectors can influence height in some situations
25711                         if (nbPages > 1) {
25712                                 // on out-of-context blocs (headers, footers, background) height should be the whole DocumentContext height
25713                                 if (forcedX !== undefined || forcedY !== undefined) {
25714                                         fragment.height = unbreakableContext.getCurrentPage().pageSize.height - unbreakableContext.pageMargins.top - unbreakableContext.pageMargins.bottom;
25715                                 } else {
25716                                         fragment.height = this.writer.context.getCurrentPage().pageSize.height - this.writer.context.pageMargins.top - this.writer.context.pageMargins.bottom;
25717                                         for (var i = 0, l = this.repeatables.length; i < l; i++) {
25718                                                 fragment.height -= this.repeatables[i].height;
25719                                         }
25720                                 }
25721                         } else {
25722                                 fragment.height = unbreakableContext.y;
25723                         }
25725                         if (forcedX !== undefined || forcedY !== undefined) {
25726                                 this.writer.addFragment(fragment, true, true, true);
25727                         } else {
25728                                 this.addFragment(fragment);
25729                         }
25730                 }
25731         }
25734 PageElementWriter.prototype.currentBlockToRepeatable = function () {
25735         var unbreakableContext = this.writer.context;
25736         var rep = {items: []};
25738         unbreakableContext.pages[0].items.forEach(function (item) {
25739                 rep.items.push(item);
25740         });
25742         rep.xOffset = this.originalX;
25744         //TODO: vectors can influence height in some situations
25745         rep.height = unbreakableContext.y;
25747         return rep;
25750 PageElementWriter.prototype.pushToRepeatables = function (rep) {
25751         this.repeatables.push(rep);
25754 PageElementWriter.prototype.popFromRepeatables = function () {
25755         this.repeatables.pop();
25758 PageElementWriter.prototype.context = function () {
25759         return this.writer.context;
25762 module.exports = PageElementWriter;
25765 /***/ }),
25766 /* 136 */
25767 /***/ (function(module, exports, __webpack_require__) {
25769 "use strict";
25772 var Line = __webpack_require__(82);
25773 var isNumber = __webpack_require__(0).isNumber;
25774 var pack = __webpack_require__(0).pack;
25775 var offsetVector = __webpack_require__(0).offsetVector;
25776 var DocumentContext = __webpack_require__(81);
25779  * Creates an instance of ElementWriter - a line/vector writer, which adds
25780  * elements to current page and sets their positions based on the context
25781  */
25782 function ElementWriter(context, tracker) {
25783         this.context = context;
25784         this.contextStack = [];
25785         this.tracker = tracker;
25788 function addPageItem(page, item, index) {
25789         if (index === null || index === undefined || index < 0 || index > page.items.length) {
25790                 page.items.push(item);
25791         } else {
25792                 page.items.splice(index, 0, item);
25793         }
25796 ElementWriter.prototype.addLine = function (line, dontUpdateContextPosition, index) {
25797         var height = line.getHeight();
25798         var context = this.context;
25799         var page = context.getCurrentPage(),
25800                 position = this.getCurrentPositionOnPage();
25802         if (context.availableHeight < height || !page) {
25803                 return false;
25804         }
25806         line.x = context.x + (line.x || 0);
25807         line.y = context.y + (line.y || 0);
25809         this.alignLine(line);
25811         addPageItem(page, {
25812                 type: 'line',
25813                 item: line
25814         }, index);
25815         this.tracker.emit('lineAdded', line);
25817         if (!dontUpdateContextPosition) {
25818                 context.moveDown(height);
25819         }
25821         return position;
25824 ElementWriter.prototype.alignLine = function (line) {
25825         var width = this.context.availableWidth;
25826         var lineWidth = line.getWidth();
25828         var alignment = line.inlines && line.inlines.length > 0 && line.inlines[0].alignment;
25830         var offset = 0;
25831         switch (alignment) {
25832                 case 'right':
25833                         offset = width - lineWidth;
25834                         break;
25835                 case 'center':
25836                         offset = (width - lineWidth) / 2;
25837                         break;
25838         }
25840         if (offset) {
25841                 line.x = (line.x || 0) + offset;
25842         }
25844         if (alignment === 'justify' &&
25845                 !line.newLineForced &&
25846                 !line.lastLineInParagraph &&
25847                 line.inlines.length > 1) {
25848                 var additionalSpacing = (width - lineWidth) / (line.inlines.length - 1);
25850                 for (var i = 1, l = line.inlines.length; i < l; i++) {
25851                         offset = i * additionalSpacing;
25853                         line.inlines[i].x += offset;
25854                         line.inlines[i].justifyShift = additionalSpacing;
25855                 }
25856         }
25859 ElementWriter.prototype.addImage = function (image, index) {
25860         var context = this.context;
25861         var page = context.getCurrentPage(),
25862                 position = this.getCurrentPositionOnPage();
25864         if (!page || (image.absolutePosition === undefined && context.availableHeight < image._height && page.items.length > 0)) {
25865                 return false;
25866         }
25868         if (image._x === undefined) {
25869                 image._x = image.x || 0;
25870         }
25872         image.x = context.x + image._x;
25873         image.y = context.y;
25875         this.alignImage(image);
25877         addPageItem(page, {
25878                 type: 'image',
25879                 item: image
25880         }, index);
25882         context.moveDown(image._height);
25884         return position;
25887 ElementWriter.prototype.addQr = function (qr, index) {
25888         var context = this.context;
25889         var page = context.getCurrentPage(),
25890                 position = this.getCurrentPositionOnPage();
25892         if (!page || (qr.absolutePosition === undefined && context.availableHeight < qr._height)) {
25893                 return false;
25894         }
25896         if (qr._x === undefined) {
25897                 qr._x = qr.x || 0;
25898         }
25900         qr.x = context.x + qr._x;
25901         qr.y = context.y;
25903         this.alignImage(qr);
25905         for (var i = 0, l = qr._canvas.length; i < l; i++) {
25906                 var vector = qr._canvas[i];
25907                 vector.x += qr.x;
25908                 vector.y += qr.y;
25909                 this.addVector(vector, true, true, index);
25910         }
25912         context.moveDown(qr._height);
25914         return position;
25917 ElementWriter.prototype.alignImage = function (image) {
25918         var width = this.context.availableWidth;
25919         var imageWidth = image._minWidth;
25920         var offset = 0;
25921         switch (image._alignment) {
25922                 case 'right':
25923                         offset = width - imageWidth;
25924                         break;
25925                 case 'center':
25926                         offset = (width - imageWidth) / 2;
25927                         break;
25928         }
25930         if (offset) {
25931                 image.x = (image.x || 0) + offset;
25932         }
25935 ElementWriter.prototype.alignCanvas = function (node) {
25936         var width = this.context.availableWidth;
25937         var canvasWidth = node._minWidth;
25938         var offset = 0;
25939         switch (node._alignment) {
25940                 case 'right':
25941                         offset = width - canvasWidth;
25942                         break;
25943                 case 'center':
25944                         offset = (width - canvasWidth) / 2;
25945                         break;
25946         }
25947         if (offset) {
25948                 node.canvas.forEach(function (vector) {
25949                         offsetVector(vector, offset, 0);
25950                 });
25951         }
25954 ElementWriter.prototype.addVector = function (vector, ignoreContextX, ignoreContextY, index) {
25955         var context = this.context;
25956         var page = context.getCurrentPage(),
25957                 position = this.getCurrentPositionOnPage();
25959         if (page) {
25960                 offsetVector(vector, ignoreContextX ? 0 : context.x, ignoreContextY ? 0 : context.y);
25961                 addPageItem(page, {
25962                         type: 'vector',
25963                         item: vector
25964                 }, index);
25965                 return position;
25966         }
25969 ElementWriter.prototype.beginClip = function (width, height) {
25970         var ctx = this.context;
25971         var page = ctx.getCurrentPage();
25972         page.items.push({
25973                 type: 'beginClip',
25974                 item: {x: ctx.x, y: ctx.y, width: width, height: height}
25975         });
25976         return true;
25979 ElementWriter.prototype.endClip = function () {
25980         var ctx = this.context;
25981         var page = ctx.getCurrentPage();
25982         page.items.push({
25983                 type: 'endClip'
25984         });
25985         return true;
25988 function cloneLine(line) {
25989         var result = new Line(line.maxWidth);
25991         for (var key in line) {
25992                 if (line.hasOwnProperty(key)) {
25993                         result[key] = line[key];
25994                 }
25995         }
25997         return result;
26000 ElementWriter.prototype.addFragment = function (block, useBlockXOffset, useBlockYOffset, dontUpdateContextPosition) {
26001         var ctx = this.context;
26002         var page = ctx.getCurrentPage();
26004         if (!useBlockXOffset && block.height > ctx.availableHeight) {
26005                 return false;
26006         }
26008         block.items.forEach(function (item) {
26009                 switch (item.type) {
26010                         case 'line':
26011                                 var l = cloneLine(item.item);
26013                                 l.x = (l.x || 0) + (useBlockXOffset ? (block.xOffset || 0) : ctx.x);
26014                                 l.y = (l.y || 0) + (useBlockYOffset ? (block.yOffset || 0) : ctx.y);
26016                                 page.items.push({
26017                                         type: 'line',
26018                                         item: l
26019                                 });
26020                                 break;
26022                         case 'vector':
26023                                 var v = pack(item.item);
26025                                 offsetVector(v, useBlockXOffset ? (block.xOffset || 0) : ctx.x, useBlockYOffset ? (block.yOffset || 0) : ctx.y);
26026                                 page.items.push({
26027                                         type: 'vector',
26028                                         item: v
26029                                 });
26030                                 break;
26032                         case 'image':
26033                                 var img = pack(item.item);
26035                                 img.x = (img.x || 0) + (useBlockXOffset ? (block.xOffset || 0) : ctx.x);
26036                                 img.y = (img.y || 0) + (useBlockYOffset ? (block.yOffset || 0) : ctx.y);
26038                                 page.items.push({
26039                                         type: 'image',
26040                                         item: img
26041                                 });
26042                                 break;
26043                 }
26044         });
26046         if (!dontUpdateContextPosition) {
26047                 ctx.moveDown(block.height);
26048         }
26050         return true;
26054  * Pushes the provided context onto the stack or creates a new one
26056  * pushContext(context) - pushes the provided context and makes it current
26057  * pushContext(width, height) - creates and pushes a new context with the specified width and height
26058  * pushContext() - creates a new context for unbreakable blocks (with current availableWidth and full-page-height)
26059  */
26060 ElementWriter.prototype.pushContext = function (contextOrWidth, height) {
26061         if (contextOrWidth === undefined) {
26062                 height = this.context.getCurrentPage().height - this.context.pageMargins.top - this.context.pageMargins.bottom;
26063                 contextOrWidth = this.context.availableWidth;
26064         }
26066         if (isNumber(contextOrWidth)) {
26067                 contextOrWidth = new DocumentContext({width: contextOrWidth, height: height}, {left: 0, right: 0, top: 0, bottom: 0});
26068         }
26070         this.contextStack.push(this.context);
26071         this.context = contextOrWidth;
26074 ElementWriter.prototype.popContext = function () {
26075         this.context = this.contextStack.pop();
26078 ElementWriter.prototype.getCurrentPositionOnPage = function () {
26079         return (this.contextStack[0] || this.context).getCurrentPosition();
26083 module.exports = ElementWriter;
26086 /***/ }),
26087 /* 137 */
26088 /***/ (function(module, exports, __webpack_require__) {
26090 "use strict";
26093 var ColumnCalculator = __webpack_require__(44);
26094 var isFunction = __webpack_require__(0).isFunction;
26096 function TableProcessor(tableNode) {
26097         this.tableNode = tableNode;
26100 TableProcessor.prototype.beginTable = function (writer) {
26101         var tableNode;
26102         var availableWidth;
26103         var self = this;
26105         tableNode = this.tableNode;
26106         this.offsets = tableNode._offsets;
26107         this.layout = tableNode._layout;
26109         availableWidth = writer.context().availableWidth - this.offsets.total;
26110         ColumnCalculator.buildColumnWidths(tableNode.table.widths, availableWidth);
26112         this.tableWidth = tableNode._offsets.total + getTableInnerContentWidth();
26113         this.rowSpanData = prepareRowSpanData();
26114         this.cleanUpRepeatables = false;
26116         this.headerRows = tableNode.table.headerRows || 0;
26117         this.rowsWithoutPageBreak = this.headerRows + (tableNode.table.keepWithHeaderRows || 0);
26118         this.dontBreakRows = tableNode.table.dontBreakRows || false;
26120         if (this.rowsWithoutPageBreak) {
26121                 writer.beginUnbreakableBlock();
26122         }
26124         // update the border properties of all cells before drawing any lines
26125         prepareCellBorders(this.tableNode.table.body);
26127         this.drawHorizontalLine(0, writer);
26129         function getTableInnerContentWidth() {
26130                 var width = 0;
26132                 tableNode.table.widths.forEach(function (w) {
26133                         width += w._calcWidth;
26134                 });
26136                 return width;
26137         }
26139         function prepareRowSpanData() {
26140                 var rsd = [];
26141                 var x = 0;
26142                 var lastWidth = 0;
26144                 rsd.push({left: 0, rowSpan: 0});
26146                 for (var i = 0, l = self.tableNode.table.body[0].length; i < l; i++) {
26147                         var paddings = self.layout.paddingLeft(i, self.tableNode) + self.layout.paddingRight(i, self.tableNode);
26148                         var lBorder = self.layout.vLineWidth(i, self.tableNode);
26149                         lastWidth = paddings + lBorder + self.tableNode.table.widths[i]._calcWidth;
26150                         rsd[rsd.length - 1].width = lastWidth;
26151                         x += lastWidth;
26152                         rsd.push({left: x, rowSpan: 0, width: 0});
26153                 }
26155                 return rsd;
26156         }
26158         // Iterate through all cells. If the current cell is the start of a
26159         // rowSpan/colSpan, update the border property of the cells on its
26160         // bottom/right accordingly. This is needed since each iteration of the
26161         // line-drawing loops draws lines for a single cell, not for an entire
26162         // rowSpan/colSpan.
26163         function prepareCellBorders(body) {
26164                 for (var rowIndex = 0; rowIndex < body.length; rowIndex++) {
26165                         var row = body[rowIndex];
26167                         for (var colIndex = 0; colIndex < row.length; colIndex++) {
26168                                 var cell = row[colIndex];
26170                                 if (cell.border) {
26171                                         var rowSpan = cell.rowSpan || 1;
26172                                         var colSpan = cell.colSpan || 1;
26174                                         for (var rowOffset = 0; rowOffset < rowSpan; rowOffset++) {
26175                                                 // set left border
26176                                                 if (cell.border[0] !== undefined && rowOffset > 0) {
26177                                                         setBorder(rowIndex + rowOffset, colIndex, 0, cell.border[0]);
26178                                                 }
26180                                                 // set right border
26181                                                 if (cell.border[2] !== undefined) {
26182                                                         setBorder(rowIndex + rowOffset, colIndex + colSpan - 1, 2, cell.border[2]);
26183                                                 }
26184                                         }
26186                                         for (var colOffset = 0; colOffset < colSpan; colOffset++) {
26187                                                 // set top border
26188                                                 if (cell.border[1] !== undefined && colOffset > 0) {
26189                                                         setBorder(rowIndex, colIndex + colOffset, 1, cell.border[1]);
26190                                                 }
26192                                                 // set bottom border
26193                                                 if (cell.border[3] !== undefined) {
26194                                                         setBorder(rowIndex + rowSpan - 1, colIndex + colOffset, 3, cell.border[3]);
26195                                                 }
26196                                         }
26197                                 }
26198                         }
26199                 }
26201                 // helper function to set the border for a given cell
26202                 function setBorder(rowIndex, colIndex, borderIndex, borderValue) {
26203                         var cell = body[rowIndex][colIndex];
26204                         cell.border = cell.border || {};
26205                         cell.border[borderIndex] = borderValue;
26206                 }
26207         }
26210 TableProcessor.prototype.onRowBreak = function (rowIndex, writer) {
26211         var self = this;
26212         return function () {
26213                 var offset = self.rowPaddingTop + (!self.headerRows ? self.topLineWidth : 0);
26214                 writer.context().availableHeight -= self.reservedAtBottom;
26215                 writer.context().moveDown(offset);
26216         };
26219 TableProcessor.prototype.beginRow = function (rowIndex, writer) {
26220         this.topLineWidth = this.layout.hLineWidth(rowIndex, this.tableNode);
26221         this.rowPaddingTop = this.layout.paddingTop(rowIndex, this.tableNode);
26222         this.bottomLineWidth = this.layout.hLineWidth(rowIndex + 1, this.tableNode);
26223         this.rowPaddingBottom = this.layout.paddingBottom(rowIndex, this.tableNode);
26225         this.rowCallback = this.onRowBreak(rowIndex, writer);
26226         writer.tracker.startTracking('pageChanged', this.rowCallback);
26227         if (this.dontBreakRows) {
26228                 writer.beginUnbreakableBlock();
26229         }
26230         this.rowTopY = writer.context().y;
26231         this.reservedAtBottom = this.bottomLineWidth + this.rowPaddingBottom;
26233         writer.context().availableHeight -= this.reservedAtBottom;
26235         writer.context().moveDown(this.rowPaddingTop);
26238 TableProcessor.prototype.drawHorizontalLine = function (lineIndex, writer, overrideY) {
26239         var lineWidth = this.layout.hLineWidth(lineIndex, this.tableNode);
26240         if (lineWidth) {
26241                 var offset = lineWidth / 2;
26242                 var currentLine = null;
26243                 var body = this.tableNode.table.body;
26245                 for (var i = 0, l = this.rowSpanData.length; i < l; i++) {
26246                         var data = this.rowSpanData[i];
26247                         var shouldDrawLine = !data.rowSpan;
26249                         // draw only if the current cell requires a top border or the cell in the
26250                         // row above requires a bottom border
26251                         if (shouldDrawLine && i < l - 1) {
26252                                 var topBorder = false, bottomBorder = false;
26254                                 // the current cell
26255                                 if (lineIndex < body.length) {
26256                                         var cell = body[lineIndex][i];
26257                                         topBorder = cell.border ? cell.border[1] : this.layout.defaultBorder;
26258                                 }
26260                                 // the cell in the row above
26261                                 if (lineIndex > 0) {
26262                                         var cellAbove = body[lineIndex - 1][i];
26263                                         bottomBorder = cellAbove.border ? cellAbove.border[3] : this.layout.defaultBorder;
26264                                 }
26266                                 shouldDrawLine = topBorder || bottomBorder;
26267                         }
26269                         if (!currentLine && shouldDrawLine) {
26270                                 currentLine = {left: data.left, width: 0};
26271                         }
26273                         if (shouldDrawLine) {
26274                                 currentLine.width += (data.width || 0);
26275                         }
26277                         var y = (overrideY || 0) + offset;
26279                         if (!shouldDrawLine || i === l - 1) {
26280                                 if (currentLine && currentLine.width) {
26281                                         writer.addVector({
26282                                                 type: 'line',
26283                                                 x1: currentLine.left,
26284                                                 x2: currentLine.left + currentLine.width,
26285                                                 y1: y,
26286                                                 y2: y,
26287                                                 lineWidth: lineWidth,
26288                                                 lineColor: isFunction(this.layout.hLineColor) ? this.layout.hLineColor(lineIndex, this.tableNode) : this.layout.hLineColor
26289                                         }, false, overrideY);
26290                                         currentLine = null;
26291                                 }
26292                         }
26293                 }
26295                 writer.context().moveDown(lineWidth);
26296         }
26299 TableProcessor.prototype.drawVerticalLine = function (x, y0, y1, vLineIndex, writer) {
26300         var width = this.layout.vLineWidth(vLineIndex, this.tableNode);
26301         if (width === 0) {
26302                 return;
26303         }
26304         writer.addVector({
26305                 type: 'line',
26306                 x1: x + width / 2,
26307                 x2: x + width / 2,
26308                 y1: y0,
26309                 y2: y1,
26310                 lineWidth: width,
26311                 lineColor: isFunction(this.layout.vLineColor) ? this.layout.vLineColor(vLineIndex, this.tableNode) : this.layout.vLineColor
26312         }, false, true);
26315 TableProcessor.prototype.endTable = function (writer) {
26316         if (this.cleanUpRepeatables) {
26317                 writer.popFromRepeatables();
26318                 this.headerRepeatableHeight = null;
26319         }
26322 TableProcessor.prototype.endRow = function (rowIndex, writer, pageBreaks) {
26323         var l, i;
26324         var self = this;
26325         writer.tracker.stopTracking('pageChanged', this.rowCallback);
26326         writer.context().moveDown(this.layout.paddingBottom(rowIndex, this.tableNode));
26327         writer.context().availableHeight += this.reservedAtBottom;
26329         var endingPage = writer.context().page;
26330         var endingY = writer.context().y;
26332         var xs = getLineXs();
26334         var ys = [];
26336         var hasBreaks = pageBreaks && pageBreaks.length > 0;
26337         var body = this.tableNode.table.body;
26339         ys.push({
26340                 y0: this.rowTopY,
26341                 page: hasBreaks ? pageBreaks[0].prevPage : endingPage
26342         });
26344         if (hasBreaks) {
26345                 for (i = 0, l = pageBreaks.length; i < l; i++) {
26346                         var pageBreak = pageBreaks[i];
26347                         ys[ys.length - 1].y1 = pageBreak.prevY;
26349                         ys.push({y0: pageBreak.y, page: pageBreak.prevPage + 1});
26351                         if (this.headerRepeatableHeight) {
26352                                 ys[ys.length - 1].y0 += this.headerRepeatableHeight;
26353                         }
26354                 }
26355         }
26357         ys[ys.length - 1].y1 = endingY;
26359         var skipOrphanePadding = (ys[0].y1 - ys[0].y0 === this.rowPaddingTop);
26360         for (var yi = (skipOrphanePadding ? 1 : 0), yl = ys.length; yi < yl; yi++) {
26361                 var willBreak = yi < ys.length - 1;
26362                 var rowBreakWithoutHeader = (yi > 0 && !this.headerRows);
26363                 var hzLineOffset = rowBreakWithoutHeader ? 0 : this.topLineWidth;
26364                 var y1 = ys[yi].y0;
26365                 var y2 = ys[yi].y1;
26367                 if (willBreak) {
26368                         y2 = y2 + this.rowPaddingBottom;
26369                 }
26371                 if (writer.context().page != ys[yi].page) {
26372                         writer.context().page = ys[yi].page;
26374                         //TODO: buggy, availableHeight should be updated on every pageChanged event
26375                         // TableProcessor should be pageChanged listener, instead of processRow
26376                         this.reservedAtBottom = 0;
26377                 }
26379                 for (i = 0, l = xs.length; i < l; i++) {
26380                         var leftBorder = false, rightBorder = false;
26381                         var colIndex = xs[i].index;
26383                         // the current cell
26384                         if (colIndex < body[rowIndex].length) {
26385                                 var cell = body[rowIndex][colIndex];
26386                                 leftBorder = cell.border ? cell.border[0] : this.layout.defaultBorder;
26387                         }
26389                         // the cell from before column
26390                         if (colIndex > 0) {
26391                                 var cell = body[rowIndex][colIndex - 1];
26392                                 rightBorder = cell.border ? cell.border[2] : this.layout.defaultBorder;
26393                         }
26395                         if (leftBorder || rightBorder) {
26396                                 this.drawVerticalLine(xs[i].x, y1 - hzLineOffset, y2 + this.bottomLineWidth, xs[i].index, writer);
26397                         }
26399                         if (i < l - 1) {
26400                                 var fillColor = body[rowIndex][colIndex].fillColor;
26401                                 if (!fillColor) {
26402                                         fillColor = isFunction(this.layout.fillColor) ? this.layout.fillColor(rowIndex, this.tableNode, colIndex) : this.layout.fillColor;
26403                                 }
26404                                 if (fillColor) {
26405                                         var wBorder = (leftBorder || rightBorder) ? this.layout.vLineWidth(colIndex, this.tableNode) : 0;
26406                                         var xf = xs[i].x + wBorder;
26407                                         var yf = this.dontBreakRows ? y1 : y1 - hzLineOffset;
26408                                         writer.addVector({
26409                                                 type: 'rect',
26410                                                 x: xf,
26411                                                 y: yf,
26412                                                 w: xs[i + 1].x - xf,
26413                                                 h: y2 + this.bottomLineWidth - yf,
26414                                                 lineWidth: 0,
26415                                                 color: fillColor
26416                                         }, false, true, writer.context().hasBackground ? 1 : 0);
26417                                 }
26418                         }
26419                 }
26421                 if (willBreak && this.layout.hLineWhenBroken !== false) {
26422                         this.drawHorizontalLine(rowIndex + 1, writer, y2);
26423                 }
26424                 if (rowBreakWithoutHeader && this.layout.hLineWhenBroken !== false) {
26425                         this.drawHorizontalLine(rowIndex, writer, y1);
26426                 }
26427         }
26429         writer.context().page = endingPage;
26430         writer.context().y = endingY;
26432         var row = this.tableNode.table.body[rowIndex];
26433         for (i = 0, l = row.length; i < l; i++) {
26434                 if (row[i].rowSpan) {
26435                         this.rowSpanData[i].rowSpan = row[i].rowSpan;
26437                         // fix colSpans
26438                         if (row[i].colSpan && row[i].colSpan > 1) {
26439                                 for (var j = 1; j < row[i].rowSpan; j++) {
26440                                         this.tableNode.table.body[rowIndex + j][i]._colSpan = row[i].colSpan;
26441                                 }
26442                         }
26443                 }
26445                 if (this.rowSpanData[i].rowSpan > 0) {
26446                         this.rowSpanData[i].rowSpan--;
26447                 }
26448         }
26450         this.drawHorizontalLine(rowIndex + 1, writer);
26452         if (this.headerRows && rowIndex === this.headerRows - 1) {
26453                 this.headerRepeatable = writer.currentBlockToRepeatable();
26454         }
26456         if (this.dontBreakRows) {
26457                 writer.tracker.auto('pageChanged',
26458                         function () {
26459                                 if (!self.headerRows && self.layout.hLineWhenBroken !== false) {
26460                                         self.drawHorizontalLine(rowIndex, writer);
26461                                 }
26462                         },
26463                         function () {
26464                                 writer.commitUnbreakableBlock();
26465                         }
26466                 );
26467         }
26469         if (this.headerRepeatable && (rowIndex === (this.rowsWithoutPageBreak - 1) || rowIndex === this.tableNode.table.body.length - 1)) {
26470                 this.headerRepeatableHeight = this.headerRepeatable.height;
26471                 writer.commitUnbreakableBlock();
26472                 writer.pushToRepeatables(this.headerRepeatable);
26473                 this.cleanUpRepeatables = true;
26474                 this.headerRepeatable = null;
26475         }
26477         function getLineXs() {
26478                 var result = [];
26479                 var cols = 0;
26481                 for (var i = 0, l = self.tableNode.table.body[rowIndex].length; i < l; i++) {
26482                         if (!cols) {
26483                                 result.push({x: self.rowSpanData[i].left, index: i});
26485                                 var item = self.tableNode.table.body[rowIndex][i];
26486                                 cols = (item._colSpan || item.colSpan || 0);
26487                         }
26488                         if (cols > 0) {
26489                                 cols--;
26490                         }
26491                 }
26493                 result.push({x: self.rowSpanData[self.rowSpanData.length - 1].left, index: self.rowSpanData.length - 1});
26495                 return result;
26496         }
26499 module.exports = TableProcessor;
26502 /***/ }),
26503 /* 138 */
26504 /***/ (function(module, exports, __webpack_require__) {
26506 /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.12.6
26509 PDFDocument - represents an entire PDF document
26510 By Devon Govett
26511  */
26513 (function() {
26514   var PDFDocument, PDFObject, PDFPage, PDFReference, fs, stream,
26515     extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
26516     hasProp = {}.hasOwnProperty;
26518   stream = __webpack_require__(15);
26520   fs = __webpack_require__(8);
26522   PDFObject = __webpack_require__(26);
26524   PDFReference = __webpack_require__(87);
26526   PDFPage = __webpack_require__(161);
26528   PDFDocument = (function(superClass) {
26529     var mixin;
26531     extend(PDFDocument, superClass);
26533     function PDFDocument(options1) {
26534       var key, ref1, ref2, val;
26535       this.options = options1 != null ? options1 : {};
26536       PDFDocument.__super__.constructor.apply(this, arguments);
26537       this.version = 1.3;
26538       this.compress = (ref1 = this.options.compress) != null ? ref1 : true;
26539       this._pageBuffer = [];
26540       this._pageBufferStart = 0;
26541       this._offsets = [];
26542       this._waiting = 0;
26543       this._ended = false;
26544       this._offset = 0;
26545       this._root = this.ref({
26546         Type: 'Catalog',
26547         Pages: this.ref({
26548           Type: 'Pages',
26549           Count: 0,
26550           Kids: []
26551         })
26552       });
26553       this.page = null;
26554       this.initColor();
26555       this.initVector();
26556       this.initFonts();
26557       this.initText();
26558       this.initImages();
26559       this.info = {
26560         Producer: 'PDFKit',
26561         Creator: 'PDFKit',
26562         CreationDate: new Date()
26563       };
26564       if (this.options.info) {
26565         ref2 = this.options.info;
26566         for (key in ref2) {
26567           val = ref2[key];
26568           this.info[key] = val;
26569         }
26570       }
26571       this._write("%PDF-" + this.version);
26572       this._write("%\xFF\xFF\xFF\xFF");
26573       if (this.options.autoFirstPage !== false) {
26574         this.addPage();
26575       }
26576     }
26578     mixin = function(methods) {
26579       var method, name, results;
26580       results = [];
26581       for (name in methods) {
26582         method = methods[name];
26583         results.push(PDFDocument.prototype[name] = method);
26584       }
26585       return results;
26586     };
26588     mixin(__webpack_require__(162));
26590     mixin(__webpack_require__(164));
26592     mixin(__webpack_require__(166));
26594     mixin(__webpack_require__(295));
26596     mixin(__webpack_require__(297));
26598     mixin(__webpack_require__(302));
26600     PDFDocument.prototype.addPage = function(options) {
26601       var pages;
26602       if (options == null) {
26603         options = this.options;
26604       }
26605       if (!this.options.bufferPages) {
26606         this.flushPages();
26607       }
26608       this.page = new PDFPage(this, options);
26609       this._pageBuffer.push(this.page);
26610       pages = this._root.data.Pages.data;
26611       pages.Kids.push(this.page.dictionary);
26612       pages.Count++;
26613       this.x = this.page.margins.left;
26614       this.y = this.page.margins.top;
26615       this._ctm = [1, 0, 0, 1, 0, 0];
26616       this.transform(1, 0, 0, -1, 0, this.page.height);
26617       this.emit('pageAdded');
26618       return this;
26619     };
26621     PDFDocument.prototype.bufferedPageRange = function() {
26622       return {
26623         start: this._pageBufferStart,
26624         count: this._pageBuffer.length
26625       };
26626     };
26628     PDFDocument.prototype.switchToPage = function(n) {
26629       var page;
26630       if (!(page = this._pageBuffer[n - this._pageBufferStart])) {
26631         throw new Error("switchToPage(" + n + ") out of bounds, current buffer covers pages " + this._pageBufferStart + " to " + (this._pageBufferStart + this._pageBuffer.length - 1));
26632       }
26633       return this.page = page;
26634     };
26636     PDFDocument.prototype.flushPages = function() {
26637       var i, len, page, pages;
26638       pages = this._pageBuffer;
26639       this._pageBuffer = [];
26640       this._pageBufferStart += pages.length;
26641       for (i = 0, len = pages.length; i < len; i++) {
26642         page = pages[i];
26643         page.end();
26644       }
26645     };
26647     PDFDocument.prototype.ref = function(data) {
26648       var ref;
26649       ref = new PDFReference(this, this._offsets.length + 1, data);
26650       this._offsets.push(null);
26651       this._waiting++;
26652       return ref;
26653     };
26655     PDFDocument.prototype._read = function() {};
26657     PDFDocument.prototype._write = function(data) {
26658       if (!Buffer.isBuffer(data)) {
26659         data = new Buffer(data + '\n', 'binary');
26660       }
26661       this.push(data);
26662       return this._offset += data.length;
26663     };
26665     PDFDocument.prototype.addContent = function(data) {
26666       this.page.write(data);
26667       return this;
26668     };
26670     PDFDocument.prototype._refEnd = function(ref) {
26671       this._offsets[ref.id - 1] = ref.offset;
26672       if (--this._waiting === 0 && this._ended) {
26673         this._finalize();
26674         return this._ended = false;
26675       }
26676     };
26678     PDFDocument.prototype.write = function(filename, fn) {
26679       var err;
26680       err = new Error('PDFDocument#write is deprecated, and will be removed in a future version of PDFKit. Please pipe the document into a Node stream.');
26681       console.warn(err.stack);
26682       this.pipe(fs.createWriteStream(filename));
26683       this.end();
26684       return this.once('end', fn);
26685     };
26687     PDFDocument.prototype.output = function(fn) {
26688       throw new Error('PDFDocument#output is deprecated, and has been removed from PDFKit. Please pipe the document into a Node stream.');
26689     };
26691     PDFDocument.prototype.end = function() {
26692       var font, key, name, ref1, ref2, val;
26693       this.flushPages();
26694       this._info = this.ref();
26695       ref1 = this.info;
26696       for (key in ref1) {
26697         val = ref1[key];
26698         if (typeof val === 'string') {
26699           val = new String(val);
26700         }
26701         this._info.data[key] = val;
26702       }
26703       this._info.end();
26704       ref2 = this._fontFamilies;
26705       for (name in ref2) {
26706         font = ref2[name];
26707         font.finalize();
26708       }
26709       this._root.end();
26710       this._root.data.Pages.end();
26711       if (this._waiting === 0) {
26712         return this._finalize();
26713       } else {
26714         return this._ended = true;
26715       }
26716     };
26718     PDFDocument.prototype._finalize = function(fn) {
26719       var i, len, offset, ref1, xRefOffset;
26720       xRefOffset = this._offset;
26721       this._write("xref");
26722       this._write("0 " + (this._offsets.length + 1));
26723       this._write("0000000000 65535 f ");
26724       ref1 = this._offsets;
26725       for (i = 0, len = ref1.length; i < len; i++) {
26726         offset = ref1[i];
26727         offset = ('0000000000' + offset).slice(-10);
26728         this._write(offset + ' 00000 n ');
26729       }
26730       this._write('trailer');
26731       this._write(PDFObject.convert({
26732         Size: this._offsets.length + 1,
26733         Root: this._root,
26734         Info: this._info
26735       }));
26736       this._write('startxref');
26737       this._write("" + xRefOffset);
26738       this._write('%%EOF');
26739       return this.push(null);
26740     };
26742     PDFDocument.prototype.toString = function() {
26743       return "[object PDFDocument]";
26744     };
26746     return PDFDocument;
26748   })(stream.Readable);
26750   module.exports = PDFDocument;
26752 }).call(this);
26754 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
26756 /***/ }),
26757 /* 139 */
26758 /***/ (function(module, exports) {
26760 /* (ignored) */
26762 /***/ }),
26763 /* 140 */
26764 /***/ (function(module, exports, __webpack_require__) {
26766 "use strict";
26769 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
26771 var Buffer = __webpack_require__(33).Buffer;
26772 var util = __webpack_require__(141);
26774 function copyBuffer(src, target, offset) {
26775   src.copy(target, offset);
26778 module.exports = function () {
26779   function BufferList() {
26780     _classCallCheck(this, BufferList);
26782     this.head = null;
26783     this.tail = null;
26784     this.length = 0;
26785   }
26787   BufferList.prototype.push = function push(v) {
26788     var entry = { data: v, next: null };
26789     if (this.length > 0) this.tail.next = entry;else this.head = entry;
26790     this.tail = entry;
26791     ++this.length;
26792   };
26794   BufferList.prototype.unshift = function unshift(v) {
26795     var entry = { data: v, next: this.head };
26796     if (this.length === 0) this.tail = entry;
26797     this.head = entry;
26798     ++this.length;
26799   };
26801   BufferList.prototype.shift = function shift() {
26802     if (this.length === 0) return;
26803     var ret = this.head.data;
26804     if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
26805     --this.length;
26806     return ret;
26807   };
26809   BufferList.prototype.clear = function clear() {
26810     this.head = this.tail = null;
26811     this.length = 0;
26812   };
26814   BufferList.prototype.join = function join(s) {
26815     if (this.length === 0) return '';
26816     var p = this.head;
26817     var ret = '' + p.data;
26818     while (p = p.next) {
26819       ret += s + p.data;
26820     }return ret;
26821   };
26823   BufferList.prototype.concat = function concat(n) {
26824     if (this.length === 0) return Buffer.alloc(0);
26825     if (this.length === 1) return this.head.data;
26826     var ret = Buffer.allocUnsafe(n >>> 0);
26827     var p = this.head;
26828     var i = 0;
26829     while (p) {
26830       copyBuffer(p.data, ret, i);
26831       i += p.data.length;
26832       p = p.next;
26833     }
26834     return ret;
26835   };
26837   return BufferList;
26838 }();
26840 if (util && util.inspect && util.inspect.custom) {
26841   module.exports.prototype[util.inspect.custom] = function () {
26842     var obj = util.inspect({ length: this.length });
26843     return this.constructor.name + ' ' + obj;
26844   };
26847 /***/ }),
26848 /* 141 */
26849 /***/ (function(module, exports) {
26851 /* (ignored) */
26853 /***/ }),
26854 /* 142 */
26855 /***/ (function(module, exports, __webpack_require__) {
26857 /* WEBPACK VAR INJECTION */(function(global) {var apply = Function.prototype.apply;
26859 // DOM APIs, for completeness
26861 exports.setTimeout = function() {
26862   return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);
26864 exports.setInterval = function() {
26865   return new Timeout(apply.call(setInterval, window, arguments), clearInterval);
26867 exports.clearTimeout =
26868 exports.clearInterval = function(timeout) {
26869   if (timeout) {
26870     timeout.close();
26871   }
26874 function Timeout(id, clearFn) {
26875   this._id = id;
26876   this._clearFn = clearFn;
26878 Timeout.prototype.unref = Timeout.prototype.ref = function() {};
26879 Timeout.prototype.close = function() {
26880   this._clearFn.call(window, this._id);
26883 // Does not start the time, just sets up the members needed.
26884 exports.enroll = function(item, msecs) {
26885   clearTimeout(item._idleTimeoutId);
26886   item._idleTimeout = msecs;
26889 exports.unenroll = function(item) {
26890   clearTimeout(item._idleTimeoutId);
26891   item._idleTimeout = -1;
26894 exports._unrefActive = exports.active = function(item) {
26895   clearTimeout(item._idleTimeoutId);
26897   var msecs = item._idleTimeout;
26898   if (msecs >= 0) {
26899     item._idleTimeoutId = setTimeout(function onTimeout() {
26900       if (item._onTimeout)
26901         item._onTimeout();
26902     }, msecs);
26903   }
26906 // setimmediate attaches itself to the global object
26907 __webpack_require__(143);
26908 // On some exotic environments, it's not clear which object `setimmeidate` was
26909 // able to install onto.  Search each possibility in the same order as the
26910 // `setimmediate` library.
26911 exports.setImmediate = (typeof self !== "undefined" && self.setImmediate) ||
26912                        (typeof global !== "undefined" && global.setImmediate) ||
26913                        (this && this.setImmediate);
26914 exports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) ||
26915                          (typeof global !== "undefined" && global.clearImmediate) ||
26916                          (this && this.clearImmediate);
26918 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7)))
26920 /***/ }),
26921 /* 143 */
26922 /***/ (function(module, exports, __webpack_require__) {
26924 /* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {
26925     "use strict";
26927     if (global.setImmediate) {
26928         return;
26929     }
26931     var nextHandle = 1; // Spec says greater than zero
26932     var tasksByHandle = {};
26933     var currentlyRunningATask = false;
26934     var doc = global.document;
26935     var registerImmediate;
26937     function setImmediate(callback) {
26938       // Callback can either be a function or a string
26939       if (typeof callback !== "function") {
26940         callback = new Function("" + callback);
26941       }
26942       // Copy function arguments
26943       var args = new Array(arguments.length - 1);
26944       for (var i = 0; i < args.length; i++) {
26945           args[i] = arguments[i + 1];
26946       }
26947       // Store and register the task
26948       var task = { callback: callback, args: args };
26949       tasksByHandle[nextHandle] = task;
26950       registerImmediate(nextHandle);
26951       return nextHandle++;
26952     }
26954     function clearImmediate(handle) {
26955         delete tasksByHandle[handle];
26956     }
26958     function run(task) {
26959         var callback = task.callback;
26960         var args = task.args;
26961         switch (args.length) {
26962         case 0:
26963             callback();
26964             break;
26965         case 1:
26966             callback(args[0]);
26967             break;
26968         case 2:
26969             callback(args[0], args[1]);
26970             break;
26971         case 3:
26972             callback(args[0], args[1], args[2]);
26973             break;
26974         default:
26975             callback.apply(undefined, args);
26976             break;
26977         }
26978     }
26980     function runIfPresent(handle) {
26981         // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
26982         // So if we're currently running a task, we'll need to delay this invocation.
26983         if (currentlyRunningATask) {
26984             // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
26985             // "too much recursion" error.
26986             setTimeout(runIfPresent, 0, handle);
26987         } else {
26988             var task = tasksByHandle[handle];
26989             if (task) {
26990                 currentlyRunningATask = true;
26991                 try {
26992                     run(task);
26993                 } finally {
26994                     clearImmediate(handle);
26995                     currentlyRunningATask = false;
26996                 }
26997             }
26998         }
26999     }
27001     function installNextTickImplementation() {
27002         registerImmediate = function(handle) {
27003             process.nextTick(function () { runIfPresent(handle); });
27004         };
27005     }
27007     function canUsePostMessage() {
27008         // The test against `importScripts` prevents this implementation from being installed inside a web worker,
27009         // where `global.postMessage` means something completely different and can't be used for this purpose.
27010         if (global.postMessage && !global.importScripts) {
27011             var postMessageIsAsynchronous = true;
27012             var oldOnMessage = global.onmessage;
27013             global.onmessage = function() {
27014                 postMessageIsAsynchronous = false;
27015             };
27016             global.postMessage("", "*");
27017             global.onmessage = oldOnMessage;
27018             return postMessageIsAsynchronous;
27019         }
27020     }
27022     function installPostMessageImplementation() {
27023         // Installs an event handler on `global` for the `message` event: see
27024         // * https://developer.mozilla.org/en/DOM/window.postMessage
27025         // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
27027         var messagePrefix = "setImmediate$" + Math.random() + "$";
27028         var onGlobalMessage = function(event) {
27029             if (event.source === global &&
27030                 typeof event.data === "string" &&
27031                 event.data.indexOf(messagePrefix) === 0) {
27032                 runIfPresent(+event.data.slice(messagePrefix.length));
27033             }
27034         };
27036         if (global.addEventListener) {
27037             global.addEventListener("message", onGlobalMessage, false);
27038         } else {
27039             global.attachEvent("onmessage", onGlobalMessage);
27040         }
27042         registerImmediate = function(handle) {
27043             global.postMessage(messagePrefix + handle, "*");
27044         };
27045     }
27047     function installMessageChannelImplementation() {
27048         var channel = new MessageChannel();
27049         channel.port1.onmessage = function(event) {
27050             var handle = event.data;
27051             runIfPresent(handle);
27052         };
27054         registerImmediate = function(handle) {
27055             channel.port2.postMessage(handle);
27056         };
27057     }
27059     function installReadyStateChangeImplementation() {
27060         var html = doc.documentElement;
27061         registerImmediate = function(handle) {
27062             // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
27063             // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
27064             var script = doc.createElement("script");
27065             script.onreadystatechange = function () {
27066                 runIfPresent(handle);
27067                 script.onreadystatechange = null;
27068                 html.removeChild(script);
27069                 script = null;
27070             };
27071             html.appendChild(script);
27072         };
27073     }
27075     function installSetTimeoutImplementation() {
27076         registerImmediate = function(handle) {
27077             setTimeout(runIfPresent, 0, handle);
27078         };
27079     }
27081     // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
27082     var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
27083     attachTo = attachTo && attachTo.setTimeout ? attachTo : global;
27085     // Don't get fooled by e.g. browserify environments.
27086     if ({}.toString.call(global.process) === "[object process]") {
27087         // For Node.js before 0.9
27088         installNextTickImplementation();
27090     } else if (canUsePostMessage()) {
27091         // For non-IE10 modern browsers
27092         installPostMessageImplementation();
27094     } else if (global.MessageChannel) {
27095         // For web workers, where supported
27096         installMessageChannelImplementation();
27098     } else if (doc && "onreadystatechange" in doc.createElement("script")) {
27099         // For IE 6–8
27100         installReadyStateChangeImplementation();
27102     } else {
27103         // For older browsers
27104         installSetTimeoutImplementation();
27105     }
27107     attachTo.setImmediate = setImmediate;
27108     attachTo.clearImmediate = clearImmediate;
27109 }(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));
27111 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7), __webpack_require__(11)))
27113 /***/ }),
27114 /* 144 */
27115 /***/ (function(module, exports, __webpack_require__) {
27117 /* WEBPACK VAR INJECTION */(function(global) {
27119  * Module exports.
27120  */
27122 module.exports = deprecate;
27125  * Mark that a method should not be used.
27126  * Returns a modified function which warns once by default.
27128  * If `localStorage.noDeprecation = true` is set, then it is a no-op.
27130  * If `localStorage.throwDeprecation = true` is set, then deprecated functions
27131  * will throw an Error when invoked.
27133  * If `localStorage.traceDeprecation = true` is set, then deprecated functions
27134  * will invoke `console.trace()` instead of `console.error()`.
27136  * @param {Function} fn - the function to deprecate
27137  * @param {String} msg - the string to print to the console when `fn` is invoked
27138  * @returns {Function} a new "deprecated" version of `fn`
27139  * @api public
27140  */
27142 function deprecate (fn, msg) {
27143   if (config('noDeprecation')) {
27144     return fn;
27145   }
27147   var warned = false;
27148   function deprecated() {
27149     if (!warned) {
27150       if (config('throwDeprecation')) {
27151         throw new Error(msg);
27152       } else if (config('traceDeprecation')) {
27153         console.trace(msg);
27154       } else {
27155         console.warn(msg);
27156       }
27157       warned = true;
27158     }
27159     return fn.apply(this, arguments);
27160   }
27162   return deprecated;
27166  * Checks `localStorage` for boolean values for the given `name`.
27168  * @param {String} name
27169  * @returns {Boolean}
27170  * @api private
27171  */
27173 function config (name) {
27174   // accessing global.localStorage can trigger a DOMException in sandboxed iframes
27175   try {
27176     if (!global.localStorage) return false;
27177   } catch (_) {
27178     return false;
27179   }
27180   var val = global.localStorage[name];
27181   if (null == val) return false;
27182   return String(val).toLowerCase() === 'true';
27185 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7)))
27187 /***/ }),
27188 /* 145 */
27189 /***/ (function(module, exports, __webpack_require__) {
27191 "use strict";
27192 // Copyright Joyent, Inc. and other Node contributors.
27194 // Permission is hereby granted, free of charge, to any person obtaining a
27195 // copy of this software and associated documentation files (the
27196 // "Software"), to deal in the Software without restriction, including
27197 // without limitation the rights to use, copy, modify, merge, publish,
27198 // distribute, sublicense, and/or sell copies of the Software, and to permit
27199 // persons to whom the Software is furnished to do so, subject to the
27200 // following conditions:
27202 // The above copyright notice and this permission notice shall be included
27203 // in all copies or substantial portions of the Software.
27205 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
27206 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27207 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
27208 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
27209 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
27210 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
27211 // USE OR OTHER DEALINGS IN THE SOFTWARE.
27213 // a passthrough stream.
27214 // basically just the most minimal sort of Transform stream.
27215 // Every written chunk gets output as-is.
27219 module.exports = PassThrough;
27221 var Transform = __webpack_require__(86);
27223 /*<replacement>*/
27224 var util = __webpack_require__(25);
27225 util.inherits = __webpack_require__(21);
27226 /*</replacement>*/
27228 util.inherits(PassThrough, Transform);
27230 function PassThrough(options) {
27231   if (!(this instanceof PassThrough)) return new PassThrough(options);
27233   Transform.call(this, options);
27236 PassThrough.prototype._transform = function (chunk, encoding, cb) {
27237   cb(null, chunk);
27240 /***/ }),
27241 /* 146 */
27242 /***/ (function(module, exports, __webpack_require__) {
27244 module.exports = __webpack_require__(46);
27247 /***/ }),
27248 /* 147 */
27249 /***/ (function(module, exports, __webpack_require__) {
27251 module.exports = __webpack_require__(16);
27254 /***/ }),
27255 /* 148 */
27256 /***/ (function(module, exports, __webpack_require__) {
27258 module.exports = __webpack_require__(45).Transform
27261 /***/ }),
27262 /* 149 */
27263 /***/ (function(module, exports, __webpack_require__) {
27265 module.exports = __webpack_require__(45).PassThrough
27268 /***/ }),
27269 /* 150 */
27270 /***/ (function(module, exports, __webpack_require__) {
27272 "use strict";
27273 /* WEBPACK VAR INJECTION */(function(Buffer, process) {
27274 /* eslint camelcase: "off" */
27276 var assert = __webpack_require__(88);
27278 var Zstream = __webpack_require__(153);
27279 var zlib_deflate = __webpack_require__(154);
27280 var zlib_inflate = __webpack_require__(157);
27281 var constants = __webpack_require__(160);
27283 for (var key in constants) {
27284   exports[key] = constants[key];
27287 // zlib modes
27288 exports.NONE = 0;
27289 exports.DEFLATE = 1;
27290 exports.INFLATE = 2;
27291 exports.GZIP = 3;
27292 exports.GUNZIP = 4;
27293 exports.DEFLATERAW = 5;
27294 exports.INFLATERAW = 6;
27295 exports.UNZIP = 7;
27297 var GZIP_HEADER_ID1 = 0x1f;
27298 var GZIP_HEADER_ID2 = 0x8b;
27301  * Emulate Node's zlib C++ layer for use by the JS layer in index.js
27302  */
27303 function Zlib(mode) {
27304   if (typeof mode !== 'number' || mode < exports.DEFLATE || mode > exports.UNZIP) {
27305     throw new TypeError('Bad argument');
27306   }
27308   this.dictionary = null;
27309   this.err = 0;
27310   this.flush = 0;
27311   this.init_done = false;
27312   this.level = 0;
27313   this.memLevel = 0;
27314   this.mode = mode;
27315   this.strategy = 0;
27316   this.windowBits = 0;
27317   this.write_in_progress = false;
27318   this.pending_close = false;
27319   this.gzip_id_bytes_read = 0;
27322 Zlib.prototype.close = function () {
27323   if (this.write_in_progress) {
27324     this.pending_close = true;
27325     return;
27326   }
27328   this.pending_close = false;
27330   assert(this.init_done, 'close before init');
27331   assert(this.mode <= exports.UNZIP);
27333   if (this.mode === exports.DEFLATE || this.mode === exports.GZIP || this.mode === exports.DEFLATERAW) {
27334     zlib_deflate.deflateEnd(this.strm);
27335   } else if (this.mode === exports.INFLATE || this.mode === exports.GUNZIP || this.mode === exports.INFLATERAW || this.mode === exports.UNZIP) {
27336     zlib_inflate.inflateEnd(this.strm);
27337   }
27339   this.mode = exports.NONE;
27341   this.dictionary = null;
27344 Zlib.prototype.write = function (flush, input, in_off, in_len, out, out_off, out_len) {
27345   return this._write(true, flush, input, in_off, in_len, out, out_off, out_len);
27348 Zlib.prototype.writeSync = function (flush, input, in_off, in_len, out, out_off, out_len) {
27349   return this._write(false, flush, input, in_off, in_len, out, out_off, out_len);
27352 Zlib.prototype._write = function (async, flush, input, in_off, in_len, out, out_off, out_len) {
27353   assert.equal(arguments.length, 8);
27355   assert(this.init_done, 'write before init');
27356   assert(this.mode !== exports.NONE, 'already finalized');
27357   assert.equal(false, this.write_in_progress, 'write already in progress');
27358   assert.equal(false, this.pending_close, 'close is pending');
27360   this.write_in_progress = true;
27362   assert.equal(false, flush === undefined, 'must provide flush value');
27364   this.write_in_progress = true;
27366   if (flush !== exports.Z_NO_FLUSH && flush !== exports.Z_PARTIAL_FLUSH && flush !== exports.Z_SYNC_FLUSH && flush !== exports.Z_FULL_FLUSH && flush !== exports.Z_FINISH && flush !== exports.Z_BLOCK) {
27367     throw new Error('Invalid flush value');
27368   }
27370   if (input == null) {
27371     input = Buffer.alloc(0);
27372     in_len = 0;
27373     in_off = 0;
27374   }
27376   this.strm.avail_in = in_len;
27377   this.strm.input = input;
27378   this.strm.next_in = in_off;
27379   this.strm.avail_out = out_len;
27380   this.strm.output = out;
27381   this.strm.next_out = out_off;
27382   this.flush = flush;
27384   if (!async) {
27385     // sync version
27386     this._process();
27388     if (this._checkError()) {
27389       return this._afterSync();
27390     }
27391     return;
27392   }
27394   // async version
27395   var self = this;
27396   process.nextTick(function () {
27397     self._process();
27398     self._after();
27399   });
27401   return this;
27404 Zlib.prototype._afterSync = function () {
27405   var avail_out = this.strm.avail_out;
27406   var avail_in = this.strm.avail_in;
27408   this.write_in_progress = false;
27410   return [avail_in, avail_out];
27413 Zlib.prototype._process = function () {
27414   var next_expected_header_byte = null;
27416   // If the avail_out is left at 0, then it means that it ran out
27417   // of room.  If there was avail_out left over, then it means
27418   // that all of the input was consumed.
27419   switch (this.mode) {
27420     case exports.DEFLATE:
27421     case exports.GZIP:
27422     case exports.DEFLATERAW:
27423       this.err = zlib_deflate.deflate(this.strm, this.flush);
27424       break;
27425     case exports.UNZIP:
27426       if (this.strm.avail_in > 0) {
27427         next_expected_header_byte = this.strm.next_in;
27428       }
27430       switch (this.gzip_id_bytes_read) {
27431         case 0:
27432           if (next_expected_header_byte === null) {
27433             break;
27434           }
27436           if (this.strm.input[next_expected_header_byte] === GZIP_HEADER_ID1) {
27437             this.gzip_id_bytes_read = 1;
27438             next_expected_header_byte++;
27440             if (this.strm.avail_in === 1) {
27441               // The only available byte was already read.
27442               break;
27443             }
27444           } else {
27445             this.mode = exports.INFLATE;
27446             break;
27447           }
27449         // fallthrough
27450         case 1:
27451           if (next_expected_header_byte === null) {
27452             break;
27453           }
27455           if (this.strm.input[next_expected_header_byte] === GZIP_HEADER_ID2) {
27456             this.gzip_id_bytes_read = 2;
27457             this.mode = exports.GUNZIP;
27458           } else {
27459             // There is no actual difference between INFLATE and INFLATERAW
27460             // (after initialization).
27461             this.mode = exports.INFLATE;
27462           }
27464           break;
27465         default:
27466           throw new Error('invalid number of gzip magic number bytes read');
27467       }
27469     // fallthrough
27470     case exports.INFLATE:
27471     case exports.GUNZIP:
27472     case exports.INFLATERAW:
27473       this.err = zlib_inflate.inflate(this.strm, this.flush
27475       // If data was encoded with dictionary
27476       );if (this.err === exports.Z_NEED_DICT && this.dictionary) {
27477         // Load it
27478         this.err = zlib_inflate.inflateSetDictionary(this.strm, this.dictionary);
27479         if (this.err === exports.Z_OK) {
27480           // And try to decode again
27481           this.err = zlib_inflate.inflate(this.strm, this.flush);
27482         } else if (this.err === exports.Z_DATA_ERROR) {
27483           // Both inflateSetDictionary() and inflate() return Z_DATA_ERROR.
27484           // Make it possible for After() to tell a bad dictionary from bad
27485           // input.
27486           this.err = exports.Z_NEED_DICT;
27487         }
27488       }
27489       while (this.strm.avail_in > 0 && this.mode === exports.GUNZIP && this.err === exports.Z_STREAM_END && this.strm.next_in[0] !== 0x00) {
27490         // Bytes remain in input buffer. Perhaps this is another compressed
27491         // member in the same archive, or just trailing garbage.
27492         // Trailing zero bytes are okay, though, since they are frequently
27493         // used for padding.
27495         this.reset();
27496         this.err = zlib_inflate.inflate(this.strm, this.flush);
27497       }
27498       break;
27499     default:
27500       throw new Error('Unknown mode ' + this.mode);
27501   }
27504 Zlib.prototype._checkError = function () {
27505   // Acceptable error states depend on the type of zlib stream.
27506   switch (this.err) {
27507     case exports.Z_OK:
27508     case exports.Z_BUF_ERROR:
27509       if (this.strm.avail_out !== 0 && this.flush === exports.Z_FINISH) {
27510         this._error('unexpected end of file');
27511         return false;
27512       }
27513       break;
27514     case exports.Z_STREAM_END:
27515       // normal statuses, not fatal
27516       break;
27517     case exports.Z_NEED_DICT:
27518       if (this.dictionary == null) {
27519         this._error('Missing dictionary');
27520       } else {
27521         this._error('Bad dictionary');
27522       }
27523       return false;
27524     default:
27525       // something else.
27526       this._error('Zlib error');
27527       return false;
27528   }
27530   return true;
27533 Zlib.prototype._after = function () {
27534   if (!this._checkError()) {
27535     return;
27536   }
27538   var avail_out = this.strm.avail_out;
27539   var avail_in = this.strm.avail_in;
27541   this.write_in_progress = false;
27543   // call the write() cb
27544   this.callback(avail_in, avail_out);
27546   if (this.pending_close) {
27547     this.close();
27548   }
27551 Zlib.prototype._error = function (message) {
27552   if (this.strm.msg) {
27553     message = this.strm.msg;
27554   }
27555   this.onerror(message, this.err
27557   // no hope of rescue.
27558   );this.write_in_progress = false;
27559   if (this.pending_close) {
27560     this.close();
27561   }
27564 Zlib.prototype.init = function (windowBits, level, memLevel, strategy, dictionary) {
27565   assert(arguments.length === 4 || arguments.length === 5, 'init(windowBits, level, memLevel, strategy, [dictionary])');
27567   assert(windowBits >= 8 && windowBits <= 15, 'invalid windowBits');
27568   assert(level >= -1 && level <= 9, 'invalid compression level');
27570   assert(memLevel >= 1 && memLevel <= 9, 'invalid memlevel');
27572   assert(strategy === exports.Z_FILTERED || strategy === exports.Z_HUFFMAN_ONLY || strategy === exports.Z_RLE || strategy === exports.Z_FIXED || strategy === exports.Z_DEFAULT_STRATEGY, 'invalid strategy');
27574   this._init(level, windowBits, memLevel, strategy, dictionary);
27575   this._setDictionary();
27578 Zlib.prototype.params = function () {
27579   throw new Error('deflateParams Not supported');
27582 Zlib.prototype.reset = function () {
27583   this._reset();
27584   this._setDictionary();
27587 Zlib.prototype._init = function (level, windowBits, memLevel, strategy, dictionary) {
27588   this.level = level;
27589   this.windowBits = windowBits;
27590   this.memLevel = memLevel;
27591   this.strategy = strategy;
27593   this.flush = exports.Z_NO_FLUSH;
27595   this.err = exports.Z_OK;
27597   if (this.mode === exports.GZIP || this.mode === exports.GUNZIP) {
27598     this.windowBits += 16;
27599   }
27601   if (this.mode === exports.UNZIP) {
27602     this.windowBits += 32;
27603   }
27605   if (this.mode === exports.DEFLATERAW || this.mode === exports.INFLATERAW) {
27606     this.windowBits = -1 * this.windowBits;
27607   }
27609   this.strm = new Zstream();
27611   switch (this.mode) {
27612     case exports.DEFLATE:
27613     case exports.GZIP:
27614     case exports.DEFLATERAW:
27615       this.err = zlib_deflate.deflateInit2(this.strm, this.level, exports.Z_DEFLATED, this.windowBits, this.memLevel, this.strategy);
27616       break;
27617     case exports.INFLATE:
27618     case exports.GUNZIP:
27619     case exports.INFLATERAW:
27620     case exports.UNZIP:
27621       this.err = zlib_inflate.inflateInit2(this.strm, this.windowBits);
27622       break;
27623     default:
27624       throw new Error('Unknown mode ' + this.mode);
27625   }
27627   if (this.err !== exports.Z_OK) {
27628     this._error('Init error');
27629   }
27631   this.dictionary = dictionary;
27633   this.write_in_progress = false;
27634   this.init_done = true;
27637 Zlib.prototype._setDictionary = function () {
27638   if (this.dictionary == null) {
27639     return;
27640   }
27642   this.err = exports.Z_OK;
27644   switch (this.mode) {
27645     case exports.DEFLATE:
27646     case exports.DEFLATERAW:
27647       this.err = zlib_deflate.deflateSetDictionary(this.strm, this.dictionary);
27648       break;
27649     default:
27650       break;
27651   }
27653   if (this.err !== exports.Z_OK) {
27654     this._error('Failed to set dictionary');
27655   }
27658 Zlib.prototype._reset = function () {
27659   this.err = exports.Z_OK;
27661   switch (this.mode) {
27662     case exports.DEFLATE:
27663     case exports.DEFLATERAW:
27664     case exports.GZIP:
27665       this.err = zlib_deflate.deflateReset(this.strm);
27666       break;
27667     case exports.INFLATE:
27668     case exports.INFLATERAW:
27669     case exports.GUNZIP:
27670       this.err = zlib_inflate.inflateReset(this.strm);
27671       break;
27672     default:
27673       break;
27674   }
27676   if (this.err !== exports.Z_OK) {
27677     this._error('Failed to reset stream');
27678   }
27681 exports.Zlib = Zlib;
27682 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer, __webpack_require__(11)))
27684 /***/ }),
27685 /* 151 */
27686 /***/ (function(module, exports) {
27688 module.exports = function isBuffer(arg) {
27689   return arg && typeof arg === 'object'
27690     && typeof arg.copy === 'function'
27691     && typeof arg.fill === 'function'
27692     && typeof arg.readUInt8 === 'function';
27695 /***/ }),
27696 /* 152 */
27697 /***/ (function(module, exports) {
27699 if (typeof Object.create === 'function') {
27700   // implementation from standard node.js 'util' module
27701   module.exports = function inherits(ctor, superCtor) {
27702     ctor.super_ = superCtor
27703     ctor.prototype = Object.create(superCtor.prototype, {
27704       constructor: {
27705         value: ctor,
27706         enumerable: false,
27707         writable: true,
27708         configurable: true
27709       }
27710     });
27711   };
27712 } else {
27713   // old school shim for old browsers
27714   module.exports = function inherits(ctor, superCtor) {
27715     ctor.super_ = superCtor
27716     var TempCtor = function () {}
27717     TempCtor.prototype = superCtor.prototype
27718     ctor.prototype = new TempCtor()
27719     ctor.prototype.constructor = ctor
27720   }
27724 /***/ }),
27725 /* 153 */
27726 /***/ (function(module, exports, __webpack_require__) {
27728 "use strict";
27731 // (C) 1995-2013 Jean-loup Gailly and Mark Adler
27732 // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
27734 // This software is provided 'as-is', without any express or implied
27735 // warranty. In no event will the authors be held liable for any damages
27736 // arising from the use of this software.
27738 // Permission is granted to anyone to use this software for any purpose,
27739 // including commercial applications, and to alter it and redistribute it
27740 // freely, subject to the following restrictions:
27742 // 1. The origin of this software must not be misrepresented; you must not
27743 //   claim that you wrote the original software. If you use this software
27744 //   in a product, an acknowledgment in the product documentation would be
27745 //   appreciated but is not required.
27746 // 2. Altered source versions must be plainly marked as such, and must not be
27747 //   misrepresented as being the original software.
27748 // 3. This notice may not be removed or altered from any source distribution.
27750 function ZStream() {
27751   /* next input byte */
27752   this.input = null; // JS specific, because we have no pointers
27753   this.next_in = 0;
27754   /* number of bytes available at input */
27755   this.avail_in = 0;
27756   /* total number of input bytes read so far */
27757   this.total_in = 0;
27758   /* next output byte should be put there */
27759   this.output = null; // JS specific, because we have no pointers
27760   this.next_out = 0;
27761   /* remaining free space at output */
27762   this.avail_out = 0;
27763   /* total number of bytes output so far */
27764   this.total_out = 0;
27765   /* last error message, NULL if no error */
27766   this.msg = ''/*Z_NULL*/;
27767   /* not visible by applications */
27768   this.state = null;
27769   /* best guess about the data type: binary or text */
27770   this.data_type = 2/*Z_UNKNOWN*/;
27771   /* adler32 value of the uncompressed data */
27772   this.adler = 0;
27775 module.exports = ZStream;
27778 /***/ }),
27779 /* 154 */
27780 /***/ (function(module, exports, __webpack_require__) {
27782 "use strict";
27785 // (C) 1995-2013 Jean-loup Gailly and Mark Adler
27786 // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
27788 // This software is provided 'as-is', without any express or implied
27789 // warranty. In no event will the authors be held liable for any damages
27790 // arising from the use of this software.
27792 // Permission is granted to anyone to use this software for any purpose,
27793 // including commercial applications, and to alter it and redistribute it
27794 // freely, subject to the following restrictions:
27796 // 1. The origin of this software must not be misrepresented; you must not
27797 //   claim that you wrote the original software. If you use this software
27798 //   in a product, an acknowledgment in the product documentation would be
27799 //   appreciated but is not required.
27800 // 2. Altered source versions must be plainly marked as such, and must not be
27801 //   misrepresented as being the original software.
27802 // 3. This notice may not be removed or altered from any source distribution.
27804 var utils   = __webpack_require__(34);
27805 var trees   = __webpack_require__(155);
27806 var adler32 = __webpack_require__(89);
27807 var crc32   = __webpack_require__(90);
27808 var msg     = __webpack_require__(156);
27810 /* Public constants ==========================================================*/
27811 /* ===========================================================================*/
27814 /* Allowed flush values; see deflate() and inflate() below for details */
27815 var Z_NO_FLUSH      = 0;
27816 var Z_PARTIAL_FLUSH = 1;
27817 //var Z_SYNC_FLUSH    = 2;
27818 var Z_FULL_FLUSH    = 3;
27819 var Z_FINISH        = 4;
27820 var Z_BLOCK         = 5;
27821 //var Z_TREES         = 6;
27824 /* Return codes for the compression/decompression functions. Negative values
27825  * are errors, positive values are used for special but normal events.
27826  */
27827 var Z_OK            = 0;
27828 var Z_STREAM_END    = 1;
27829 //var Z_NEED_DICT     = 2;
27830 //var Z_ERRNO         = -1;
27831 var Z_STREAM_ERROR  = -2;
27832 var Z_DATA_ERROR    = -3;
27833 //var Z_MEM_ERROR     = -4;
27834 var Z_BUF_ERROR     = -5;
27835 //var Z_VERSION_ERROR = -6;
27838 /* compression levels */
27839 //var Z_NO_COMPRESSION      = 0;
27840 //var Z_BEST_SPEED          = 1;
27841 //var Z_BEST_COMPRESSION    = 9;
27842 var Z_DEFAULT_COMPRESSION = -1;
27845 var Z_FILTERED            = 1;
27846 var Z_HUFFMAN_ONLY        = 2;
27847 var Z_RLE                 = 3;
27848 var Z_FIXED               = 4;
27849 var Z_DEFAULT_STRATEGY    = 0;
27851 /* Possible values of the data_type field (though see inflate()) */
27852 //var Z_BINARY              = 0;
27853 //var Z_TEXT                = 1;
27854 //var Z_ASCII               = 1; // = Z_TEXT
27855 var Z_UNKNOWN             = 2;
27858 /* The deflate compression method */
27859 var Z_DEFLATED  = 8;
27861 /*============================================================================*/
27864 var MAX_MEM_LEVEL = 9;
27865 /* Maximum value for memLevel in deflateInit2 */
27866 var MAX_WBITS = 15;
27867 /* 32K LZ77 window */
27868 var DEF_MEM_LEVEL = 8;
27871 var LENGTH_CODES  = 29;
27872 /* number of length codes, not counting the special END_BLOCK code */
27873 var LITERALS      = 256;
27874 /* number of literal bytes 0..255 */
27875 var L_CODES       = LITERALS + 1 + LENGTH_CODES;
27876 /* number of Literal or Length codes, including the END_BLOCK code */
27877 var D_CODES       = 30;
27878 /* number of distance codes */
27879 var BL_CODES      = 19;
27880 /* number of codes used to transfer the bit lengths */
27881 var HEAP_SIZE     = 2 * L_CODES + 1;
27882 /* maximum heap size */
27883 var MAX_BITS  = 15;
27884 /* All codes must not exceed MAX_BITS bits */
27886 var MIN_MATCH = 3;
27887 var MAX_MATCH = 258;
27888 var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
27890 var PRESET_DICT = 0x20;
27892 var INIT_STATE = 42;
27893 var EXTRA_STATE = 69;
27894 var NAME_STATE = 73;
27895 var COMMENT_STATE = 91;
27896 var HCRC_STATE = 103;
27897 var BUSY_STATE = 113;
27898 var FINISH_STATE = 666;
27900 var BS_NEED_MORE      = 1; /* block not completed, need more input or more output */
27901 var BS_BLOCK_DONE     = 2; /* block flush performed */
27902 var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
27903 var BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */
27905 var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.
27907 function err(strm, errorCode) {
27908   strm.msg = msg[errorCode];
27909   return errorCode;
27912 function rank(f) {
27913   return ((f) << 1) - ((f) > 4 ? 9 : 0);
27916 function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
27919 /* =========================================================================
27920  * Flush as much pending output as possible. All deflate() output goes
27921  * through this function so some applications may wish to modify it
27922  * to avoid allocating a large strm->output buffer and copying into it.
27923  * (See also read_buf()).
27924  */
27925 function flush_pending(strm) {
27926   var s = strm.state;
27928   //_tr_flush_bits(s);
27929   var len = s.pending;
27930   if (len > strm.avail_out) {
27931     len = strm.avail_out;
27932   }
27933   if (len === 0) { return; }
27935   utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
27936   strm.next_out += len;
27937   s.pending_out += len;
27938   strm.total_out += len;
27939   strm.avail_out -= len;
27940   s.pending -= len;
27941   if (s.pending === 0) {
27942     s.pending_out = 0;
27943   }
27947 function flush_block_only(s, last) {
27948   trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
27949   s.block_start = s.strstart;
27950   flush_pending(s.strm);
27954 function put_byte(s, b) {
27955   s.pending_buf[s.pending++] = b;
27959 /* =========================================================================
27960  * Put a short in the pending buffer. The 16-bit value is put in MSB order.
27961  * IN assertion: the stream state is correct and there is enough room in
27962  * pending_buf.
27963  */
27964 function putShortMSB(s, b) {
27965 //  put_byte(s, (Byte)(b >> 8));
27966 //  put_byte(s, (Byte)(b & 0xff));
27967   s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
27968   s.pending_buf[s.pending++] = b & 0xff;
27972 /* ===========================================================================
27973  * Read a new buffer from the current input stream, update the adler32
27974  * and total number of bytes read.  All deflate() input goes through
27975  * this function so some applications may wish to modify it to avoid
27976  * allocating a large strm->input buffer and copying from it.
27977  * (See also flush_pending()).
27978  */
27979 function read_buf(strm, buf, start, size) {
27980   var len = strm.avail_in;
27982   if (len > size) { len = size; }
27983   if (len === 0) { return 0; }
27985   strm.avail_in -= len;
27987   // zmemcpy(buf, strm->next_in, len);
27988   utils.arraySet(buf, strm.input, strm.next_in, len, start);
27989   if (strm.state.wrap === 1) {
27990     strm.adler = adler32(strm.adler, buf, len, start);
27991   }
27993   else if (strm.state.wrap === 2) {
27994     strm.adler = crc32(strm.adler, buf, len, start);
27995   }
27997   strm.next_in += len;
27998   strm.total_in += len;
28000   return len;
28004 /* ===========================================================================
28005  * Set match_start to the longest match starting at the given string and
28006  * return its length. Matches shorter or equal to prev_length are discarded,
28007  * in which case the result is equal to prev_length and match_start is
28008  * garbage.
28009  * IN assertions: cur_match is the head of the hash chain for the current
28010  *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
28011  * OUT assertion: the match length is not greater than s->lookahead.
28012  */
28013 function longest_match(s, cur_match) {
28014   var chain_length = s.max_chain_length;      /* max hash chain length */
28015   var scan = s.strstart; /* current string */
28016   var match;                       /* matched string */
28017   var len;                           /* length of current match */
28018   var best_len = s.prev_length;              /* best match length so far */
28019   var nice_match = s.nice_match;             /* stop if match long enough */
28020   var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
28021       s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;
28023   var _win = s.window; // shortcut
28025   var wmask = s.w_mask;
28026   var prev  = s.prev;
28028   /* Stop when cur_match becomes <= limit. To simplify the code,
28029    * we prevent matches with the string of window index 0.
28030    */
28032   var strend = s.strstart + MAX_MATCH;
28033   var scan_end1  = _win[scan + best_len - 1];
28034   var scan_end   = _win[scan + best_len];
28036   /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
28037    * It is easy to get rid of this optimization if necessary.
28038    */
28039   // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
28041   /* Do not waste too much time if we already have a good match: */
28042   if (s.prev_length >= s.good_match) {
28043     chain_length >>= 2;
28044   }
28045   /* Do not look for matches beyond the end of the input. This is necessary
28046    * to make deflate deterministic.
28047    */
28048   if (nice_match > s.lookahead) { nice_match = s.lookahead; }
28050   // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
28052   do {
28053     // Assert(cur_match < s->strstart, "no future");
28054     match = cur_match;
28056     /* Skip to next match if the match length cannot increase
28057      * or if the match length is less than 2.  Note that the checks below
28058      * for insufficient lookahead only occur occasionally for performance
28059      * reasons.  Therefore uninitialized memory will be accessed, and
28060      * conditional jumps will be made that depend on those values.
28061      * However the length of the match is limited to the lookahead, so
28062      * the output of deflate is not affected by the uninitialized values.
28063      */
28065     if (_win[match + best_len]     !== scan_end  ||
28066         _win[match + best_len - 1] !== scan_end1 ||
28067         _win[match]                !== _win[scan] ||
28068         _win[++match]              !== _win[scan + 1]) {
28069       continue;
28070     }
28072     /* The check at best_len-1 can be removed because it will be made
28073      * again later. (This heuristic is not always a win.)
28074      * It is not necessary to compare scan[2] and match[2] since they
28075      * are always equal when the other bytes match, given that
28076      * the hash keys are equal and that HASH_BITS >= 8.
28077      */
28078     scan += 2;
28079     match++;
28080     // Assert(*scan == *match, "match[2]?");
28082     /* We check for insufficient lookahead only every 8th comparison;
28083      * the 256th check will be made at strstart+258.
28084      */
28085     do {
28086       /*jshint noempty:false*/
28087     } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
28088              _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
28089              _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
28090              _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
28091              scan < strend);
28093     // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
28095     len = MAX_MATCH - (strend - scan);
28096     scan = strend - MAX_MATCH;
28098     if (len > best_len) {
28099       s.match_start = cur_match;
28100       best_len = len;
28101       if (len >= nice_match) {
28102         break;
28103       }
28104       scan_end1  = _win[scan + best_len - 1];
28105       scan_end   = _win[scan + best_len];
28106     }
28107   } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
28109   if (best_len <= s.lookahead) {
28110     return best_len;
28111   }
28112   return s.lookahead;
28116 /* ===========================================================================
28117  * Fill the window when the lookahead becomes insufficient.
28118  * Updates strstart and lookahead.
28120  * IN assertion: lookahead < MIN_LOOKAHEAD
28121  * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
28122  *    At least one byte has been read, or avail_in == 0; reads are
28123  *    performed for at least two bytes (required for the zip translate_eol
28124  *    option -- not supported here).
28125  */
28126 function fill_window(s) {
28127   var _w_size = s.w_size;
28128   var p, n, m, more, str;
28130   //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
28132   do {
28133     more = s.window_size - s.lookahead - s.strstart;
28135     // JS ints have 32 bit, block below not needed
28136     /* Deal with !@#$% 64K limit: */
28137     //if (sizeof(int) <= 2) {
28138     //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
28139     //        more = wsize;
28140     //
28141     //  } else if (more == (unsigned)(-1)) {
28142     //        /* Very unlikely, but possible on 16 bit machine if
28143     //         * strstart == 0 && lookahead == 1 (input done a byte at time)
28144     //         */
28145     //        more--;
28146     //    }
28147     //}
28150     /* If the window is almost full and there is insufficient lookahead,
28151      * move the upper half to the lower one to make room in the upper half.
28152      */
28153     if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
28155       utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
28156       s.match_start -= _w_size;
28157       s.strstart -= _w_size;
28158       /* we now have strstart >= MAX_DIST */
28159       s.block_start -= _w_size;
28161       /* Slide the hash table (could be avoided with 32 bit values
28162        at the expense of memory usage). We slide even when level == 0
28163        to keep the hash table consistent if we switch back to level > 0
28164        later. (Using level 0 permanently is not an optimal usage of
28165        zlib, so we don't care about this pathological case.)
28166        */
28168       n = s.hash_size;
28169       p = n;
28170       do {
28171         m = s.head[--p];
28172         s.head[p] = (m >= _w_size ? m - _w_size : 0);
28173       } while (--n);
28175       n = _w_size;
28176       p = n;
28177       do {
28178         m = s.prev[--p];
28179         s.prev[p] = (m >= _w_size ? m - _w_size : 0);
28180         /* If n is not on any hash chain, prev[n] is garbage but
28181          * its value will never be used.
28182          */
28183       } while (--n);
28185       more += _w_size;
28186     }
28187     if (s.strm.avail_in === 0) {
28188       break;
28189     }
28191     /* If there was no sliding:
28192      *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
28193      *    more == window_size - lookahead - strstart
28194      * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
28195      * => more >= window_size - 2*WSIZE + 2
28196      * In the BIG_MEM or MMAP case (not yet supported),
28197      *   window_size == input_size + MIN_LOOKAHEAD  &&
28198      *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
28199      * Otherwise, window_size == 2*WSIZE so more >= 2.
28200      * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
28201      */
28202     //Assert(more >= 2, "more < 2");
28203     n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
28204     s.lookahead += n;
28206     /* Initialize the hash value now that we have some input: */
28207     if (s.lookahead + s.insert >= MIN_MATCH) {
28208       str = s.strstart - s.insert;
28209       s.ins_h = s.window[str];
28211       /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
28212       s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
28213 //#if MIN_MATCH != 3
28214 //        Call update_hash() MIN_MATCH-3 more times
28215 //#endif
28216       while (s.insert) {
28217         /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
28218         s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
28220         s.prev[str & s.w_mask] = s.head[s.ins_h];
28221         s.head[s.ins_h] = str;
28222         str++;
28223         s.insert--;
28224         if (s.lookahead + s.insert < MIN_MATCH) {
28225           break;
28226         }
28227       }
28228     }
28229     /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
28230      * but this is not important since only literal bytes will be emitted.
28231      */
28233   } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
28235   /* If the WIN_INIT bytes after the end of the current data have never been
28236    * written, then zero those bytes in order to avoid memory check reports of
28237    * the use of uninitialized (or uninitialised as Julian writes) bytes by
28238    * the longest match routines.  Update the high water mark for the next
28239    * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
28240    * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
28241    */
28242 //  if (s.high_water < s.window_size) {
28243 //    var curr = s.strstart + s.lookahead;
28244 //    var init = 0;
28246 //    if (s.high_water < curr) {
28247 //      /* Previous high water mark below current data -- zero WIN_INIT
28248 //       * bytes or up to end of window, whichever is less.
28249 //       */
28250 //      init = s.window_size - curr;
28251 //      if (init > WIN_INIT)
28252 //        init = WIN_INIT;
28253 //      zmemzero(s->window + curr, (unsigned)init);
28254 //      s->high_water = curr + init;
28255 //    }
28256 //    else if (s->high_water < (ulg)curr + WIN_INIT) {
28257 //      /* High water mark at or above current data, but below current data
28258 //       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
28259 //       * to end of window, whichever is less.
28260 //       */
28261 //      init = (ulg)curr + WIN_INIT - s->high_water;
28262 //      if (init > s->window_size - s->high_water)
28263 //        init = s->window_size - s->high_water;
28264 //      zmemzero(s->window + s->high_water, (unsigned)init);
28265 //      s->high_water += init;
28266 //    }
28267 //  }
28269 //  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
28270 //    "not enough room for search");
28273 /* ===========================================================================
28274  * Copy without compression as much as possible from the input stream, return
28275  * the current block state.
28276  * This function does not insert new strings in the dictionary since
28277  * uncompressible data is probably not useful. This function is used
28278  * only for the level=0 compression option.
28279  * NOTE: this function should be optimized to avoid extra copying from
28280  * window to pending_buf.
28281  */
28282 function deflate_stored(s, flush) {
28283   /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
28284    * to pending_buf_size, and each stored block has a 5 byte header:
28285    */
28286   var max_block_size = 0xffff;
28288   if (max_block_size > s.pending_buf_size - 5) {
28289     max_block_size = s.pending_buf_size - 5;
28290   }
28292   /* Copy as much as possible from input to output: */
28293   for (;;) {
28294     /* Fill the window as much as possible: */
28295     if (s.lookahead <= 1) {
28297       //Assert(s->strstart < s->w_size+MAX_DIST(s) ||
28298       //  s->block_start >= (long)s->w_size, "slide too late");
28299 //      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
28300 //        s.block_start >= s.w_size)) {
28301 //        throw  new Error("slide too late");
28302 //      }
28304       fill_window(s);
28305       if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
28306         return BS_NEED_MORE;
28307       }
28309       if (s.lookahead === 0) {
28310         break;
28311       }
28312       /* flush the current block */
28313     }
28314     //Assert(s->block_start >= 0L, "block gone");
28315 //    if (s.block_start < 0) throw new Error("block gone");
28317     s.strstart += s.lookahead;
28318     s.lookahead = 0;
28320     /* Emit a stored block if pending_buf will be full: */
28321     var max_start = s.block_start + max_block_size;
28323     if (s.strstart === 0 || s.strstart >= max_start) {
28324       /* strstart == 0 is possible when wraparound on 16-bit machine */
28325       s.lookahead = s.strstart - max_start;
28326       s.strstart = max_start;
28327       /*** FLUSH_BLOCK(s, 0); ***/
28328       flush_block_only(s, false);
28329       if (s.strm.avail_out === 0) {
28330         return BS_NEED_MORE;
28331       }
28332       /***/
28335     }
28336     /* Flush if we may have to slide, otherwise block_start may become
28337      * negative and the data will be gone:
28338      */
28339     if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
28340       /*** FLUSH_BLOCK(s, 0); ***/
28341       flush_block_only(s, false);
28342       if (s.strm.avail_out === 0) {
28343         return BS_NEED_MORE;
28344       }
28345       /***/
28346     }
28347   }
28349   s.insert = 0;
28351   if (flush === Z_FINISH) {
28352     /*** FLUSH_BLOCK(s, 1); ***/
28353     flush_block_only(s, true);
28354     if (s.strm.avail_out === 0) {
28355       return BS_FINISH_STARTED;
28356     }
28357     /***/
28358     return BS_FINISH_DONE;
28359   }
28361   if (s.strstart > s.block_start) {
28362     /*** FLUSH_BLOCK(s, 0); ***/
28363     flush_block_only(s, false);
28364     if (s.strm.avail_out === 0) {
28365       return BS_NEED_MORE;
28366     }
28367     /***/
28368   }
28370   return BS_NEED_MORE;
28373 /* ===========================================================================
28374  * Compress as much as possible from the input stream, return the current
28375  * block state.
28376  * This function does not perform lazy evaluation of matches and inserts
28377  * new strings in the dictionary only for unmatched strings or for short
28378  * matches. It is used only for the fast compression options.
28379  */
28380 function deflate_fast(s, flush) {
28381   var hash_head;        /* head of the hash chain */
28382   var bflush;           /* set if current block must be flushed */
28384   for (;;) {
28385     /* Make sure that we always have enough lookahead, except
28386      * at the end of the input file. We need MAX_MATCH bytes
28387      * for the next match, plus MIN_MATCH bytes to insert the
28388      * string following the next match.
28389      */
28390     if (s.lookahead < MIN_LOOKAHEAD) {
28391       fill_window(s);
28392       if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
28393         return BS_NEED_MORE;
28394       }
28395       if (s.lookahead === 0) {
28396         break; /* flush the current block */
28397       }
28398     }
28400     /* Insert the string window[strstart .. strstart+2] in the
28401      * dictionary, and set hash_head to the head of the hash chain:
28402      */
28403     hash_head = 0/*NIL*/;
28404     if (s.lookahead >= MIN_MATCH) {
28405       /*** INSERT_STRING(s, s.strstart, hash_head); ***/
28406       s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
28407       hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
28408       s.head[s.ins_h] = s.strstart;
28409       /***/
28410     }
28412     /* Find the longest match, discarding those <= prev_length.
28413      * At this point we have always match_length < MIN_MATCH
28414      */
28415     if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
28416       /* To simplify the code, we prevent matches with the string
28417        * of window index 0 (in particular we have to avoid a match
28418        * of the string with itself at the start of the input file).
28419        */
28420       s.match_length = longest_match(s, hash_head);
28421       /* longest_match() sets match_start */
28422     }
28423     if (s.match_length >= MIN_MATCH) {
28424       // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
28426       /*** _tr_tally_dist(s, s.strstart - s.match_start,
28427                      s.match_length - MIN_MATCH, bflush); ***/
28428       bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);
28430       s.lookahead -= s.match_length;
28432       /* Insert new strings in the hash table only if the match length
28433        * is not too large. This saves time but degrades compression.
28434        */
28435       if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {
28436         s.match_length--; /* string at strstart already in table */
28437         do {
28438           s.strstart++;
28439           /*** INSERT_STRING(s, s.strstart, hash_head); ***/
28440           s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
28441           hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
28442           s.head[s.ins_h] = s.strstart;
28443           /***/
28444           /* strstart never exceeds WSIZE-MAX_MATCH, so there are
28445            * always MIN_MATCH bytes ahead.
28446            */
28447         } while (--s.match_length !== 0);
28448         s.strstart++;
28449       } else
28450       {
28451         s.strstart += s.match_length;
28452         s.match_length = 0;
28453         s.ins_h = s.window[s.strstart];
28454         /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
28455         s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;
28457 //#if MIN_MATCH != 3
28458 //                Call UPDATE_HASH() MIN_MATCH-3 more times
28459 //#endif
28460         /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
28461          * matter since it will be recomputed at next deflate call.
28462          */
28463       }
28464     } else {
28465       /* No match, output a literal byte */
28466       //Tracevv((stderr,"%c", s.window[s.strstart]));
28467       /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
28468       bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
28470       s.lookahead--;
28471       s.strstart++;
28472     }
28473     if (bflush) {
28474       /*** FLUSH_BLOCK(s, 0); ***/
28475       flush_block_only(s, false);
28476       if (s.strm.avail_out === 0) {
28477         return BS_NEED_MORE;
28478       }
28479       /***/
28480     }
28481   }
28482   s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);
28483   if (flush === Z_FINISH) {
28484     /*** FLUSH_BLOCK(s, 1); ***/
28485     flush_block_only(s, true);
28486     if (s.strm.avail_out === 0) {
28487       return BS_FINISH_STARTED;
28488     }
28489     /***/
28490     return BS_FINISH_DONE;
28491   }
28492   if (s.last_lit) {
28493     /*** FLUSH_BLOCK(s, 0); ***/
28494     flush_block_only(s, false);
28495     if (s.strm.avail_out === 0) {
28496       return BS_NEED_MORE;
28497     }
28498     /***/
28499   }
28500   return BS_BLOCK_DONE;
28503 /* ===========================================================================
28504  * Same as above, but achieves better compression. We use a lazy
28505  * evaluation for matches: a match is finally adopted only if there is
28506  * no better match at the next window position.
28507  */
28508 function deflate_slow(s, flush) {
28509   var hash_head;          /* head of hash chain */
28510   var bflush;              /* set if current block must be flushed */
28512   var max_insert;
28514   /* Process the input block. */
28515   for (;;) {
28516     /* Make sure that we always have enough lookahead, except
28517      * at the end of the input file. We need MAX_MATCH bytes
28518      * for the next match, plus MIN_MATCH bytes to insert the
28519      * string following the next match.
28520      */
28521     if (s.lookahead < MIN_LOOKAHEAD) {
28522       fill_window(s);
28523       if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
28524         return BS_NEED_MORE;
28525       }
28526       if (s.lookahead === 0) { break; } /* flush the current block */
28527     }
28529     /* Insert the string window[strstart .. strstart+2] in the
28530      * dictionary, and set hash_head to the head of the hash chain:
28531      */
28532     hash_head = 0/*NIL*/;
28533     if (s.lookahead >= MIN_MATCH) {
28534       /*** INSERT_STRING(s, s.strstart, hash_head); ***/
28535       s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
28536       hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
28537       s.head[s.ins_h] = s.strstart;
28538       /***/
28539     }
28541     /* Find the longest match, discarding those <= prev_length.
28542      */
28543     s.prev_length = s.match_length;
28544     s.prev_match = s.match_start;
28545     s.match_length = MIN_MATCH - 1;
28547     if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
28548         s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
28549       /* To simplify the code, we prevent matches with the string
28550        * of window index 0 (in particular we have to avoid a match
28551        * of the string with itself at the start of the input file).
28552        */
28553       s.match_length = longest_match(s, hash_head);
28554       /* longest_match() sets match_start */
28556       if (s.match_length <= 5 &&
28557          (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
28559         /* If prev_match is also MIN_MATCH, match_start is garbage
28560          * but we will ignore the current match anyway.
28561          */
28562         s.match_length = MIN_MATCH - 1;
28563       }
28564     }
28565     /* If there was a match at the previous step and the current
28566      * match is not better, output the previous match:
28567      */
28568     if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
28569       max_insert = s.strstart + s.lookahead - MIN_MATCH;
28570       /* Do not insert strings in hash table beyond this. */
28572       //check_match(s, s.strstart-1, s.prev_match, s.prev_length);
28574       /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
28575                      s.prev_length - MIN_MATCH, bflush);***/
28576       bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);
28577       /* Insert in hash table all strings up to the end of the match.
28578        * strstart-1 and strstart are already inserted. If there is not
28579        * enough lookahead, the last two strings are not inserted in
28580        * the hash table.
28581        */
28582       s.lookahead -= s.prev_length - 1;
28583       s.prev_length -= 2;
28584       do {
28585         if (++s.strstart <= max_insert) {
28586           /*** INSERT_STRING(s, s.strstart, hash_head); ***/
28587           s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
28588           hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
28589           s.head[s.ins_h] = s.strstart;
28590           /***/
28591         }
28592       } while (--s.prev_length !== 0);
28593       s.match_available = 0;
28594       s.match_length = MIN_MATCH - 1;
28595       s.strstart++;
28597       if (bflush) {
28598         /*** FLUSH_BLOCK(s, 0); ***/
28599         flush_block_only(s, false);
28600         if (s.strm.avail_out === 0) {
28601           return BS_NEED_MORE;
28602         }
28603         /***/
28604       }
28606     } else if (s.match_available) {
28607       /* If there was no match at the previous position, output a
28608        * single literal. If there was a match but the current match
28609        * is longer, truncate the previous match to a single literal.
28610        */
28611       //Tracevv((stderr,"%c", s->window[s->strstart-1]));
28612       /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
28613       bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
28615       if (bflush) {
28616         /*** FLUSH_BLOCK_ONLY(s, 0) ***/
28617         flush_block_only(s, false);
28618         /***/
28619       }
28620       s.strstart++;
28621       s.lookahead--;
28622       if (s.strm.avail_out === 0) {
28623         return BS_NEED_MORE;
28624       }
28625     } else {
28626       /* There is no previous match to compare with, wait for
28627        * the next step to decide.
28628        */
28629       s.match_available = 1;
28630       s.strstart++;
28631       s.lookahead--;
28632     }
28633   }
28634   //Assert (flush != Z_NO_FLUSH, "no flush?");
28635   if (s.match_available) {
28636     //Tracevv((stderr,"%c", s->window[s->strstart-1]));
28637     /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
28638     bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
28640     s.match_available = 0;
28641   }
28642   s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;
28643   if (flush === Z_FINISH) {
28644     /*** FLUSH_BLOCK(s, 1); ***/
28645     flush_block_only(s, true);
28646     if (s.strm.avail_out === 0) {
28647       return BS_FINISH_STARTED;
28648     }
28649     /***/
28650     return BS_FINISH_DONE;
28651   }
28652   if (s.last_lit) {
28653     /*** FLUSH_BLOCK(s, 0); ***/
28654     flush_block_only(s, false);
28655     if (s.strm.avail_out === 0) {
28656       return BS_NEED_MORE;
28657     }
28658     /***/
28659   }
28661   return BS_BLOCK_DONE;
28665 /* ===========================================================================
28666  * For Z_RLE, simply look for runs of bytes, generate matches only of distance
28667  * one.  Do not maintain a hash table.  (It will be regenerated if this run of
28668  * deflate switches away from Z_RLE.)
28669  */
28670 function deflate_rle(s, flush) {
28671   var bflush;            /* set if current block must be flushed */
28672   var prev;              /* byte at distance one to match */
28673   var scan, strend;      /* scan goes up to strend for length of run */
28675   var _win = s.window;
28677   for (;;) {
28678     /* Make sure that we always have enough lookahead, except
28679      * at the end of the input file. We need MAX_MATCH bytes
28680      * for the longest run, plus one for the unrolled loop.
28681      */
28682     if (s.lookahead <= MAX_MATCH) {
28683       fill_window(s);
28684       if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
28685         return BS_NEED_MORE;
28686       }
28687       if (s.lookahead === 0) { break; } /* flush the current block */
28688     }
28690     /* See how many times the previous byte repeats */
28691     s.match_length = 0;
28692     if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
28693       scan = s.strstart - 1;
28694       prev = _win[scan];
28695       if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
28696         strend = s.strstart + MAX_MATCH;
28697         do {
28698           /*jshint noempty:false*/
28699         } while (prev === _win[++scan] && prev === _win[++scan] &&
28700                  prev === _win[++scan] && prev === _win[++scan] &&
28701                  prev === _win[++scan] && prev === _win[++scan] &&
28702                  prev === _win[++scan] && prev === _win[++scan] &&
28703                  scan < strend);
28704         s.match_length = MAX_MATCH - (strend - scan);
28705         if (s.match_length > s.lookahead) {
28706           s.match_length = s.lookahead;
28707         }
28708       }
28709       //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
28710     }
28712     /* Emit match if have run of MIN_MATCH or longer, else emit literal */
28713     if (s.match_length >= MIN_MATCH) {
28714       //check_match(s, s.strstart, s.strstart - 1, s.match_length);
28716       /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
28717       bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);
28719       s.lookahead -= s.match_length;
28720       s.strstart += s.match_length;
28721       s.match_length = 0;
28722     } else {
28723       /* No match, output a literal byte */
28724       //Tracevv((stderr,"%c", s->window[s->strstart]));
28725       /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
28726       bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
28728       s.lookahead--;
28729       s.strstart++;
28730     }
28731     if (bflush) {
28732       /*** FLUSH_BLOCK(s, 0); ***/
28733       flush_block_only(s, false);
28734       if (s.strm.avail_out === 0) {
28735         return BS_NEED_MORE;
28736       }
28737       /***/
28738     }
28739   }
28740   s.insert = 0;
28741   if (flush === Z_FINISH) {
28742     /*** FLUSH_BLOCK(s, 1); ***/
28743     flush_block_only(s, true);
28744     if (s.strm.avail_out === 0) {
28745       return BS_FINISH_STARTED;
28746     }
28747     /***/
28748     return BS_FINISH_DONE;
28749   }
28750   if (s.last_lit) {
28751     /*** FLUSH_BLOCK(s, 0); ***/
28752     flush_block_only(s, false);
28753     if (s.strm.avail_out === 0) {
28754       return BS_NEED_MORE;
28755     }
28756     /***/
28757   }
28758   return BS_BLOCK_DONE;
28761 /* ===========================================================================
28762  * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.
28763  * (It will be regenerated if this run of deflate switches away from Huffman.)
28764  */
28765 function deflate_huff(s, flush) {
28766   var bflush;             /* set if current block must be flushed */
28768   for (;;) {
28769     /* Make sure that we have a literal to write. */
28770     if (s.lookahead === 0) {
28771       fill_window(s);
28772       if (s.lookahead === 0) {
28773         if (flush === Z_NO_FLUSH) {
28774           return BS_NEED_MORE;
28775         }
28776         break;      /* flush the current block */
28777       }
28778     }
28780     /* Output a literal byte */
28781     s.match_length = 0;
28782     //Tracevv((stderr,"%c", s->window[s->strstart]));
28783     /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
28784     bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
28785     s.lookahead--;
28786     s.strstart++;
28787     if (bflush) {
28788       /*** FLUSH_BLOCK(s, 0); ***/
28789       flush_block_only(s, false);
28790       if (s.strm.avail_out === 0) {
28791         return BS_NEED_MORE;
28792       }
28793       /***/
28794     }
28795   }
28796   s.insert = 0;
28797   if (flush === Z_FINISH) {
28798     /*** FLUSH_BLOCK(s, 1); ***/
28799     flush_block_only(s, true);
28800     if (s.strm.avail_out === 0) {
28801       return BS_FINISH_STARTED;
28802     }
28803     /***/
28804     return BS_FINISH_DONE;
28805   }
28806   if (s.last_lit) {
28807     /*** FLUSH_BLOCK(s, 0); ***/
28808     flush_block_only(s, false);
28809     if (s.strm.avail_out === 0) {
28810       return BS_NEED_MORE;
28811     }
28812     /***/
28813   }
28814   return BS_BLOCK_DONE;
28817 /* Values for max_lazy_match, good_match and max_chain_length, depending on
28818  * the desired pack level (0..9). The values given below have been tuned to
28819  * exclude worst case performance for pathological files. Better values may be
28820  * found for specific files.
28821  */
28822 function Config(good_length, max_lazy, nice_length, max_chain, func) {
28823   this.good_length = good_length;
28824   this.max_lazy = max_lazy;
28825   this.nice_length = nice_length;
28826   this.max_chain = max_chain;
28827   this.func = func;
28830 var configuration_table;
28832 configuration_table = [
28833   /*      good lazy nice chain */
28834   new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */
28835   new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */
28836   new Config(4, 5, 16, 8, deflate_fast),           /* 2 */
28837   new Config(4, 6, 32, 32, deflate_fast),          /* 3 */
28839   new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */
28840   new Config(8, 16, 32, 32, deflate_slow),         /* 5 */
28841   new Config(8, 16, 128, 128, deflate_slow),       /* 6 */
28842   new Config(8, 32, 128, 256, deflate_slow),       /* 7 */
28843   new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */
28844   new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */
28848 /* ===========================================================================
28849  * Initialize the "longest match" routines for a new zlib stream
28850  */
28851 function lm_init(s) {
28852   s.window_size = 2 * s.w_size;
28854   /*** CLEAR_HASH(s); ***/
28855   zero(s.head); // Fill with NIL (= 0);
28857   /* Set the default configuration parameters:
28858    */
28859   s.max_lazy_match = configuration_table[s.level].max_lazy;
28860   s.good_match = configuration_table[s.level].good_length;
28861   s.nice_match = configuration_table[s.level].nice_length;
28862   s.max_chain_length = configuration_table[s.level].max_chain;
28864   s.strstart = 0;
28865   s.block_start = 0;
28866   s.lookahead = 0;
28867   s.insert = 0;
28868   s.match_length = s.prev_length = MIN_MATCH - 1;
28869   s.match_available = 0;
28870   s.ins_h = 0;
28874 function DeflateState() {
28875   this.strm = null;            /* pointer back to this zlib stream */
28876   this.status = 0;            /* as the name implies */
28877   this.pending_buf = null;      /* output still pending */
28878   this.pending_buf_size = 0;  /* size of pending_buf */
28879   this.pending_out = 0;       /* next pending byte to output to the stream */
28880   this.pending = 0;           /* nb of bytes in the pending buffer */
28881   this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
28882   this.gzhead = null;         /* gzip header information to write */
28883   this.gzindex = 0;           /* where in extra, name, or comment */
28884   this.method = Z_DEFLATED; /* can only be DEFLATED */
28885   this.last_flush = -1;   /* value of flush param for previous deflate call */
28887   this.w_size = 0;  /* LZ77 window size (32K by default) */
28888   this.w_bits = 0;  /* log2(w_size)  (8..16) */
28889   this.w_mask = 0;  /* w_size - 1 */
28891   this.window = null;
28892   /* Sliding window. Input bytes are read into the second half of the window,
28893    * and move to the first half later to keep a dictionary of at least wSize
28894    * bytes. With this organization, matches are limited to a distance of
28895    * wSize-MAX_MATCH bytes, but this ensures that IO is always
28896    * performed with a length multiple of the block size.
28897    */
28899   this.window_size = 0;
28900   /* Actual size of window: 2*wSize, except when the user input buffer
28901    * is directly used as sliding window.
28902    */
28904   this.prev = null;
28905   /* Link to older string with same hash index. To limit the size of this
28906    * array to 64K, this link is maintained only for the last 32K strings.
28907    * An index in this array is thus a window index modulo 32K.
28908    */
28910   this.head = null;   /* Heads of the hash chains or NIL. */
28912   this.ins_h = 0;       /* hash index of string to be inserted */
28913   this.hash_size = 0;   /* number of elements in hash table */
28914   this.hash_bits = 0;   /* log2(hash_size) */
28915   this.hash_mask = 0;   /* hash_size-1 */
28917   this.hash_shift = 0;
28918   /* Number of bits by which ins_h must be shifted at each input
28919    * step. It must be such that after MIN_MATCH steps, the oldest
28920    * byte no longer takes part in the hash key, that is:
28921    *   hash_shift * MIN_MATCH >= hash_bits
28922    */
28924   this.block_start = 0;
28925   /* Window position at the beginning of the current output block. Gets
28926    * negative when the window is moved backwards.
28927    */
28929   this.match_length = 0;      /* length of best match */
28930   this.prev_match = 0;        /* previous match */
28931   this.match_available = 0;   /* set if previous match exists */
28932   this.strstart = 0;          /* start of string to insert */
28933   this.match_start = 0;       /* start of matching string */
28934   this.lookahead = 0;         /* number of valid bytes ahead in window */
28936   this.prev_length = 0;
28937   /* Length of the best match at previous step. Matches not greater than this
28938    * are discarded. This is used in the lazy match evaluation.
28939    */
28941   this.max_chain_length = 0;
28942   /* To speed up deflation, hash chains are never searched beyond this
28943    * length.  A higher limit improves compression ratio but degrades the
28944    * speed.
28945    */
28947   this.max_lazy_match = 0;
28948   /* Attempt to find a better match only when the current match is strictly
28949    * smaller than this value. This mechanism is used only for compression
28950    * levels >= 4.
28951    */
28952   // That's alias to max_lazy_match, don't use directly
28953   //this.max_insert_length = 0;
28954   /* Insert new strings in the hash table only if the match length is not
28955    * greater than this length. This saves time but degrades compression.
28956    * max_insert_length is used only for compression levels <= 3.
28957    */
28959   this.level = 0;     /* compression level (1..9) */
28960   this.strategy = 0;  /* favor or force Huffman coding*/
28962   this.good_match = 0;
28963   /* Use a faster search when the previous match is longer than this */
28965   this.nice_match = 0; /* Stop searching when current match exceeds this */
28967               /* used by trees.c: */
28969   /* Didn't use ct_data typedef below to suppress compiler warning */
28971   // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
28972   // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
28973   // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */
28975   // Use flat array of DOUBLE size, with interleaved fata,
28976   // because JS does not support effective
28977   this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);
28978   this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);
28979   this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);
28980   zero(this.dyn_ltree);
28981   zero(this.dyn_dtree);
28982   zero(this.bl_tree);
28984   this.l_desc   = null;         /* desc. for literal tree */
28985   this.d_desc   = null;         /* desc. for distance tree */
28986   this.bl_desc  = null;         /* desc. for bit length tree */
28988   //ush bl_count[MAX_BITS+1];
28989   this.bl_count = new utils.Buf16(MAX_BITS + 1);
28990   /* number of codes at each bit length for an optimal tree */
28992   //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
28993   this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */
28994   zero(this.heap);
28996   this.heap_len = 0;               /* number of elements in the heap */
28997   this.heap_max = 0;               /* element of largest frequency */
28998   /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
28999    * The same heap array is used to build all trees.
29000    */
29002   this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];
29003   zero(this.depth);
29004   /* Depth of each subtree used as tie breaker for trees of equal frequency
29005    */
29007   this.l_buf = 0;          /* buffer index for literals or lengths */
29009   this.lit_bufsize = 0;
29010   /* Size of match buffer for literals/lengths.  There are 4 reasons for
29011    * limiting lit_bufsize to 64K:
29012    *   - frequencies can be kept in 16 bit counters
29013    *   - if compression is not successful for the first block, all input
29014    *     data is still in the window so we can still emit a stored block even
29015    *     when input comes from standard input.  (This can also be done for
29016    *     all blocks if lit_bufsize is not greater than 32K.)
29017    *   - if compression is not successful for a file smaller than 64K, we can
29018    *     even emit a stored file instead of a stored block (saving 5 bytes).
29019    *     This is applicable only for zip (not gzip or zlib).
29020    *   - creating new Huffman trees less frequently may not provide fast
29021    *     adaptation to changes in the input data statistics. (Take for
29022    *     example a binary file with poorly compressible code followed by
29023    *     a highly compressible string table.) Smaller buffer sizes give
29024    *     fast adaptation but have of course the overhead of transmitting
29025    *     trees more frequently.
29026    *   - I can't count above 4
29027    */
29029   this.last_lit = 0;      /* running index in l_buf */
29031   this.d_buf = 0;
29032   /* Buffer index for distances. To simplify the code, d_buf and l_buf have
29033    * the same number of elements. To use different lengths, an extra flag
29034    * array would be necessary.
29035    */
29037   this.opt_len = 0;       /* bit length of current block with optimal trees */
29038   this.static_len = 0;    /* bit length of current block with static trees */
29039   this.matches = 0;       /* number of string matches in current block */
29040   this.insert = 0;        /* bytes at end of window left to insert */
29043   this.bi_buf = 0;
29044   /* Output buffer. bits are inserted starting at the bottom (least
29045    * significant bits).
29046    */
29047   this.bi_valid = 0;
29048   /* Number of valid bits in bi_buf.  All bits above the last valid bit
29049    * are always zero.
29050    */
29052   // Used for window memory init. We safely ignore it for JS. That makes
29053   // sense only for pointers and memory check tools.
29054   //this.high_water = 0;
29055   /* High water mark offset in window for initialized bytes -- bytes above
29056    * this are set to zero in order to avoid memory check warnings when
29057    * longest match routines access bytes past the input.  This is then
29058    * updated to the new high water mark.
29059    */
29063 function deflateResetKeep(strm) {
29064   var s;
29066   if (!strm || !strm.state) {
29067     return err(strm, Z_STREAM_ERROR);
29068   }
29070   strm.total_in = strm.total_out = 0;
29071   strm.data_type = Z_UNKNOWN;
29073   s = strm.state;
29074   s.pending = 0;
29075   s.pending_out = 0;
29077   if (s.wrap < 0) {
29078     s.wrap = -s.wrap;
29079     /* was made negative by deflate(..., Z_FINISH); */
29080   }
29081   s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
29082   strm.adler = (s.wrap === 2) ?
29083     0  // crc32(0, Z_NULL, 0)
29084   :
29085     1; // adler32(0, Z_NULL, 0)
29086   s.last_flush = Z_NO_FLUSH;
29087   trees._tr_init(s);
29088   return Z_OK;
29092 function deflateReset(strm) {
29093   var ret = deflateResetKeep(strm);
29094   if (ret === Z_OK) {
29095     lm_init(strm.state);
29096   }
29097   return ret;
29101 function deflateSetHeader(strm, head) {
29102   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
29103   if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
29104   strm.state.gzhead = head;
29105   return Z_OK;
29109 function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
29110   if (!strm) { // === Z_NULL
29111     return Z_STREAM_ERROR;
29112   }
29113   var wrap = 1;
29115   if (level === Z_DEFAULT_COMPRESSION) {
29116     level = 6;
29117   }
29119   if (windowBits < 0) { /* suppress zlib wrapper */
29120     wrap = 0;
29121     windowBits = -windowBits;
29122   }
29124   else if (windowBits > 15) {
29125     wrap = 2;           /* write gzip wrapper instead */
29126     windowBits -= 16;
29127   }
29130   if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
29131     windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
29132     strategy < 0 || strategy > Z_FIXED) {
29133     return err(strm, Z_STREAM_ERROR);
29134   }
29137   if (windowBits === 8) {
29138     windowBits = 9;
29139   }
29140   /* until 256-byte window bug fixed */
29142   var s = new DeflateState();
29144   strm.state = s;
29145   s.strm = strm;
29147   s.wrap = wrap;
29148   s.gzhead = null;
29149   s.w_bits = windowBits;
29150   s.w_size = 1 << s.w_bits;
29151   s.w_mask = s.w_size - 1;
29153   s.hash_bits = memLevel + 7;
29154   s.hash_size = 1 << s.hash_bits;
29155   s.hash_mask = s.hash_size - 1;
29156   s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
29158   s.window = new utils.Buf8(s.w_size * 2);
29159   s.head = new utils.Buf16(s.hash_size);
29160   s.prev = new utils.Buf16(s.w_size);
29162   // Don't need mem init magic for JS.
29163   //s.high_water = 0;  /* nothing written to s->window yet */
29165   s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
29167   s.pending_buf_size = s.lit_bufsize * 4;
29169   //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
29170   //s->pending_buf = (uchf *) overlay;
29171   s.pending_buf = new utils.Buf8(s.pending_buf_size);
29173   // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)
29174   //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
29175   s.d_buf = 1 * s.lit_bufsize;
29177   //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
29178   s.l_buf = (1 + 2) * s.lit_bufsize;
29180   s.level = level;
29181   s.strategy = strategy;
29182   s.method = method;
29184   return deflateReset(strm);
29187 function deflateInit(strm, level) {
29188   return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
29192 function deflate(strm, flush) {
29193   var old_flush, s;
29194   var beg, val; // for gzip header write only
29196   if (!strm || !strm.state ||
29197     flush > Z_BLOCK || flush < 0) {
29198     return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
29199   }
29201   s = strm.state;
29203   if (!strm.output ||
29204       (!strm.input && strm.avail_in !== 0) ||
29205       (s.status === FINISH_STATE && flush !== Z_FINISH)) {
29206     return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
29207   }
29209   s.strm = strm; /* just in case */
29210   old_flush = s.last_flush;
29211   s.last_flush = flush;
29213   /* Write the header */
29214   if (s.status === INIT_STATE) {
29216     if (s.wrap === 2) { // GZIP header
29217       strm.adler = 0;  //crc32(0L, Z_NULL, 0);
29218       put_byte(s, 31);
29219       put_byte(s, 139);
29220       put_byte(s, 8);
29221       if (!s.gzhead) { // s->gzhead == Z_NULL
29222         put_byte(s, 0);
29223         put_byte(s, 0);
29224         put_byte(s, 0);
29225         put_byte(s, 0);
29226         put_byte(s, 0);
29227         put_byte(s, s.level === 9 ? 2 :
29228                     (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
29229                      4 : 0));
29230         put_byte(s, OS_CODE);
29231         s.status = BUSY_STATE;
29232       }
29233       else {
29234         put_byte(s, (s.gzhead.text ? 1 : 0) +
29235                     (s.gzhead.hcrc ? 2 : 0) +
29236                     (!s.gzhead.extra ? 0 : 4) +
29237                     (!s.gzhead.name ? 0 : 8) +
29238                     (!s.gzhead.comment ? 0 : 16)
29239                 );
29240         put_byte(s, s.gzhead.time & 0xff);
29241         put_byte(s, (s.gzhead.time >> 8) & 0xff);
29242         put_byte(s, (s.gzhead.time >> 16) & 0xff);
29243         put_byte(s, (s.gzhead.time >> 24) & 0xff);
29244         put_byte(s, s.level === 9 ? 2 :
29245                     (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
29246                      4 : 0));
29247         put_byte(s, s.gzhead.os & 0xff);
29248         if (s.gzhead.extra && s.gzhead.extra.length) {
29249           put_byte(s, s.gzhead.extra.length & 0xff);
29250           put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
29251         }
29252         if (s.gzhead.hcrc) {
29253           strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
29254         }
29255         s.gzindex = 0;
29256         s.status = EXTRA_STATE;
29257       }
29258     }
29259     else // DEFLATE header
29260     {
29261       var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
29262       var level_flags = -1;
29264       if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
29265         level_flags = 0;
29266       } else if (s.level < 6) {
29267         level_flags = 1;
29268       } else if (s.level === 6) {
29269         level_flags = 2;
29270       } else {
29271         level_flags = 3;
29272       }
29273       header |= (level_flags << 6);
29274       if (s.strstart !== 0) { header |= PRESET_DICT; }
29275       header += 31 - (header % 31);
29277       s.status = BUSY_STATE;
29278       putShortMSB(s, header);
29280       /* Save the adler32 of the preset dictionary: */
29281       if (s.strstart !== 0) {
29282         putShortMSB(s, strm.adler >>> 16);
29283         putShortMSB(s, strm.adler & 0xffff);
29284       }
29285       strm.adler = 1; // adler32(0L, Z_NULL, 0);
29286     }
29287   }
29289 //#ifdef GZIP
29290   if (s.status === EXTRA_STATE) {
29291     if (s.gzhead.extra/* != Z_NULL*/) {
29292       beg = s.pending;  /* start of bytes to update crc */
29294       while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
29295         if (s.pending === s.pending_buf_size) {
29296           if (s.gzhead.hcrc && s.pending > beg) {
29297             strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
29298           }
29299           flush_pending(strm);
29300           beg = s.pending;
29301           if (s.pending === s.pending_buf_size) {
29302             break;
29303           }
29304         }
29305         put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
29306         s.gzindex++;
29307       }
29308       if (s.gzhead.hcrc && s.pending > beg) {
29309         strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
29310       }
29311       if (s.gzindex === s.gzhead.extra.length) {
29312         s.gzindex = 0;
29313         s.status = NAME_STATE;
29314       }
29315     }
29316     else {
29317       s.status = NAME_STATE;
29318     }
29319   }
29320   if (s.status === NAME_STATE) {
29321     if (s.gzhead.name/* != Z_NULL*/) {
29322       beg = s.pending;  /* start of bytes to update crc */
29323       //int val;
29325       do {
29326         if (s.pending === s.pending_buf_size) {
29327           if (s.gzhead.hcrc && s.pending > beg) {
29328             strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
29329           }
29330           flush_pending(strm);
29331           beg = s.pending;
29332           if (s.pending === s.pending_buf_size) {
29333             val = 1;
29334             break;
29335           }
29336         }
29337         // JS specific: little magic to add zero terminator to end of string
29338         if (s.gzindex < s.gzhead.name.length) {
29339           val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
29340         } else {
29341           val = 0;
29342         }
29343         put_byte(s, val);
29344       } while (val !== 0);
29346       if (s.gzhead.hcrc && s.pending > beg) {
29347         strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
29348       }
29349       if (val === 0) {
29350         s.gzindex = 0;
29351         s.status = COMMENT_STATE;
29352       }
29353     }
29354     else {
29355       s.status = COMMENT_STATE;
29356     }
29357   }
29358   if (s.status === COMMENT_STATE) {
29359     if (s.gzhead.comment/* != Z_NULL*/) {
29360       beg = s.pending;  /* start of bytes to update crc */
29361       //int val;
29363       do {
29364         if (s.pending === s.pending_buf_size) {
29365           if (s.gzhead.hcrc && s.pending > beg) {
29366             strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
29367           }
29368           flush_pending(strm);
29369           beg = s.pending;
29370           if (s.pending === s.pending_buf_size) {
29371             val = 1;
29372             break;
29373           }
29374         }
29375         // JS specific: little magic to add zero terminator to end of string
29376         if (s.gzindex < s.gzhead.comment.length) {
29377           val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
29378         } else {
29379           val = 0;
29380         }
29381         put_byte(s, val);
29382       } while (val !== 0);
29384       if (s.gzhead.hcrc && s.pending > beg) {
29385         strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
29386       }
29387       if (val === 0) {
29388         s.status = HCRC_STATE;
29389       }
29390     }
29391     else {
29392       s.status = HCRC_STATE;
29393     }
29394   }
29395   if (s.status === HCRC_STATE) {
29396     if (s.gzhead.hcrc) {
29397       if (s.pending + 2 > s.pending_buf_size) {
29398         flush_pending(strm);
29399       }
29400       if (s.pending + 2 <= s.pending_buf_size) {
29401         put_byte(s, strm.adler & 0xff);
29402         put_byte(s, (strm.adler >> 8) & 0xff);
29403         strm.adler = 0; //crc32(0L, Z_NULL, 0);
29404         s.status = BUSY_STATE;
29405       }
29406     }
29407     else {
29408       s.status = BUSY_STATE;
29409     }
29410   }
29411 //#endif
29413   /* Flush as much pending output as possible */
29414   if (s.pending !== 0) {
29415     flush_pending(strm);
29416     if (strm.avail_out === 0) {
29417       /* Since avail_out is 0, deflate will be called again with
29418        * more output space, but possibly with both pending and
29419        * avail_in equal to zero. There won't be anything to do,
29420        * but this is not an error situation so make sure we
29421        * return OK instead of BUF_ERROR at next call of deflate:
29422        */
29423       s.last_flush = -1;
29424       return Z_OK;
29425     }
29427     /* Make sure there is something to do and avoid duplicate consecutive
29428      * flushes. For repeated and useless calls with Z_FINISH, we keep
29429      * returning Z_STREAM_END instead of Z_BUF_ERROR.
29430      */
29431   } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
29432     flush !== Z_FINISH) {
29433     return err(strm, Z_BUF_ERROR);
29434   }
29436   /* User must not provide more input after the first FINISH: */
29437   if (s.status === FINISH_STATE && strm.avail_in !== 0) {
29438     return err(strm, Z_BUF_ERROR);
29439   }
29441   /* Start a new block or continue the current one.
29442    */
29443   if (strm.avail_in !== 0 || s.lookahead !== 0 ||
29444     (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
29445     var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
29446       (s.strategy === Z_RLE ? deflate_rle(s, flush) :
29447         configuration_table[s.level].func(s, flush));
29449     if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
29450       s.status = FINISH_STATE;
29451     }
29452     if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
29453       if (strm.avail_out === 0) {
29454         s.last_flush = -1;
29455         /* avoid BUF_ERROR next call, see above */
29456       }
29457       return Z_OK;
29458       /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
29459        * of deflate should use the same flush parameter to make sure
29460        * that the flush is complete. So we don't have to output an
29461        * empty block here, this will be done at next call. This also
29462        * ensures that for a very small output buffer, we emit at most
29463        * one empty block.
29464        */
29465     }
29466     if (bstate === BS_BLOCK_DONE) {
29467       if (flush === Z_PARTIAL_FLUSH) {
29468         trees._tr_align(s);
29469       }
29470       else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
29472         trees._tr_stored_block(s, 0, 0, false);
29473         /* For a full flush, this empty block will be recognized
29474          * as a special marker by inflate_sync().
29475          */
29476         if (flush === Z_FULL_FLUSH) {
29477           /*** CLEAR_HASH(s); ***/             /* forget history */
29478           zero(s.head); // Fill with NIL (= 0);
29480           if (s.lookahead === 0) {
29481             s.strstart = 0;
29482             s.block_start = 0;
29483             s.insert = 0;
29484           }
29485         }
29486       }
29487       flush_pending(strm);
29488       if (strm.avail_out === 0) {
29489         s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
29490         return Z_OK;
29491       }
29492     }
29493   }
29494   //Assert(strm->avail_out > 0, "bug2");
29495   //if (strm.avail_out <= 0) { throw new Error("bug2");}
29497   if (flush !== Z_FINISH) { return Z_OK; }
29498   if (s.wrap <= 0) { return Z_STREAM_END; }
29500   /* Write the trailer */
29501   if (s.wrap === 2) {
29502     put_byte(s, strm.adler & 0xff);
29503     put_byte(s, (strm.adler >> 8) & 0xff);
29504     put_byte(s, (strm.adler >> 16) & 0xff);
29505     put_byte(s, (strm.adler >> 24) & 0xff);
29506     put_byte(s, strm.total_in & 0xff);
29507     put_byte(s, (strm.total_in >> 8) & 0xff);
29508     put_byte(s, (strm.total_in >> 16) & 0xff);
29509     put_byte(s, (strm.total_in >> 24) & 0xff);
29510   }
29511   else
29512   {
29513     putShortMSB(s, strm.adler >>> 16);
29514     putShortMSB(s, strm.adler & 0xffff);
29515   }
29517   flush_pending(strm);
29518   /* If avail_out is zero, the application will call deflate again
29519    * to flush the rest.
29520    */
29521   if (s.wrap > 0) { s.wrap = -s.wrap; }
29522   /* write the trailer only once! */
29523   return s.pending !== 0 ? Z_OK : Z_STREAM_END;
29526 function deflateEnd(strm) {
29527   var status;
29529   if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
29530     return Z_STREAM_ERROR;
29531   }
29533   status = strm.state.status;
29534   if (status !== INIT_STATE &&
29535     status !== EXTRA_STATE &&
29536     status !== NAME_STATE &&
29537     status !== COMMENT_STATE &&
29538     status !== HCRC_STATE &&
29539     status !== BUSY_STATE &&
29540     status !== FINISH_STATE
29541   ) {
29542     return err(strm, Z_STREAM_ERROR);
29543   }
29545   strm.state = null;
29547   return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
29551 /* =========================================================================
29552  * Initializes the compression dictionary from the given byte
29553  * sequence without producing any compressed output.
29554  */
29555 function deflateSetDictionary(strm, dictionary) {
29556   var dictLength = dictionary.length;
29558   var s;
29559   var str, n;
29560   var wrap;
29561   var avail;
29562   var next;
29563   var input;
29564   var tmpDict;
29566   if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
29567     return Z_STREAM_ERROR;
29568   }
29570   s = strm.state;
29571   wrap = s.wrap;
29573   if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {
29574     return Z_STREAM_ERROR;
29575   }
29577   /* when using zlib wrappers, compute Adler-32 for provided dictionary */
29578   if (wrap === 1) {
29579     /* adler32(strm->adler, dictionary, dictLength); */
29580     strm.adler = adler32(strm.adler, dictionary, dictLength, 0);
29581   }
29583   s.wrap = 0;   /* avoid computing Adler-32 in read_buf */
29585   /* if dictionary would fill window, just replace the history */
29586   if (dictLength >= s.w_size) {
29587     if (wrap === 0) {            /* already empty otherwise */
29588       /*** CLEAR_HASH(s); ***/
29589       zero(s.head); // Fill with NIL (= 0);
29590       s.strstart = 0;
29591       s.block_start = 0;
29592       s.insert = 0;
29593     }
29594     /* use the tail */
29595     // dictionary = dictionary.slice(dictLength - s.w_size);
29596     tmpDict = new utils.Buf8(s.w_size);
29597     utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);
29598     dictionary = tmpDict;
29599     dictLength = s.w_size;
29600   }
29601   /* insert dictionary into window and hash */
29602   avail = strm.avail_in;
29603   next = strm.next_in;
29604   input = strm.input;
29605   strm.avail_in = dictLength;
29606   strm.next_in = 0;
29607   strm.input = dictionary;
29608   fill_window(s);
29609   while (s.lookahead >= MIN_MATCH) {
29610     str = s.strstart;
29611     n = s.lookahead - (MIN_MATCH - 1);
29612     do {
29613       /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
29614       s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
29616       s.prev[str & s.w_mask] = s.head[s.ins_h];
29618       s.head[s.ins_h] = str;
29619       str++;
29620     } while (--n);
29621     s.strstart = str;
29622     s.lookahead = MIN_MATCH - 1;
29623     fill_window(s);
29624   }
29625   s.strstart += s.lookahead;
29626   s.block_start = s.strstart;
29627   s.insert = s.lookahead;
29628   s.lookahead = 0;
29629   s.match_length = s.prev_length = MIN_MATCH - 1;
29630   s.match_available = 0;
29631   strm.next_in = next;
29632   strm.input = input;
29633   strm.avail_in = avail;
29634   s.wrap = wrap;
29635   return Z_OK;
29639 exports.deflateInit = deflateInit;
29640 exports.deflateInit2 = deflateInit2;
29641 exports.deflateReset = deflateReset;
29642 exports.deflateResetKeep = deflateResetKeep;
29643 exports.deflateSetHeader = deflateSetHeader;
29644 exports.deflate = deflate;
29645 exports.deflateEnd = deflateEnd;
29646 exports.deflateSetDictionary = deflateSetDictionary;
29647 exports.deflateInfo = 'pako deflate (from Nodeca project)';
29649 /* Not implemented
29650 exports.deflateBound = deflateBound;
29651 exports.deflateCopy = deflateCopy;
29652 exports.deflateParams = deflateParams;
29653 exports.deflatePending = deflatePending;
29654 exports.deflatePrime = deflatePrime;
29655 exports.deflateTune = deflateTune;
29659 /***/ }),
29660 /* 155 */
29661 /***/ (function(module, exports, __webpack_require__) {
29663 "use strict";
29666 // (C) 1995-2013 Jean-loup Gailly and Mark Adler
29667 // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
29669 // This software is provided 'as-is', without any express or implied
29670 // warranty. In no event will the authors be held liable for any damages
29671 // arising from the use of this software.
29673 // Permission is granted to anyone to use this software for any purpose,
29674 // including commercial applications, and to alter it and redistribute it
29675 // freely, subject to the following restrictions:
29677 // 1. The origin of this software must not be misrepresented; you must not
29678 //   claim that you wrote the original software. If you use this software
29679 //   in a product, an acknowledgment in the product documentation would be
29680 //   appreciated but is not required.
29681 // 2. Altered source versions must be plainly marked as such, and must not be
29682 //   misrepresented as being the original software.
29683 // 3. This notice may not be removed or altered from any source distribution.
29685 var utils = __webpack_require__(34);
29687 /* Public constants ==========================================================*/
29688 /* ===========================================================================*/
29691 //var Z_FILTERED          = 1;
29692 //var Z_HUFFMAN_ONLY      = 2;
29693 //var Z_RLE               = 3;
29694 var Z_FIXED               = 4;
29695 //var Z_DEFAULT_STRATEGY  = 0;
29697 /* Possible values of the data_type field (though see inflate()) */
29698 var Z_BINARY              = 0;
29699 var Z_TEXT                = 1;
29700 //var Z_ASCII             = 1; // = Z_TEXT
29701 var Z_UNKNOWN             = 2;
29703 /*============================================================================*/
29706 function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
29708 // From zutil.h
29710 var STORED_BLOCK = 0;
29711 var STATIC_TREES = 1;
29712 var DYN_TREES    = 2;
29713 /* The three kinds of block type */
29715 var MIN_MATCH    = 3;
29716 var MAX_MATCH    = 258;
29717 /* The minimum and maximum match lengths */
29719 // From deflate.h
29720 /* ===========================================================================
29721  * Internal compression state.
29722  */
29724 var LENGTH_CODES  = 29;
29725 /* number of length codes, not counting the special END_BLOCK code */
29727 var LITERALS      = 256;
29728 /* number of literal bytes 0..255 */
29730 var L_CODES       = LITERALS + 1 + LENGTH_CODES;
29731 /* number of Literal or Length codes, including the END_BLOCK code */
29733 var D_CODES       = 30;
29734 /* number of distance codes */
29736 var BL_CODES      = 19;
29737 /* number of codes used to transfer the bit lengths */
29739 var HEAP_SIZE     = 2 * L_CODES + 1;
29740 /* maximum heap size */
29742 var MAX_BITS      = 15;
29743 /* All codes must not exceed MAX_BITS bits */
29745 var Buf_size      = 16;
29746 /* size of bit buffer in bi_buf */
29749 /* ===========================================================================
29750  * Constants
29751  */
29753 var MAX_BL_BITS = 7;
29754 /* Bit length codes must not exceed MAX_BL_BITS bits */
29756 var END_BLOCK   = 256;
29757 /* end of block literal code */
29759 var REP_3_6     = 16;
29760 /* repeat previous bit length 3-6 times (2 bits of repeat count) */
29762 var REPZ_3_10   = 17;
29763 /* repeat a zero length 3-10 times  (3 bits of repeat count) */
29765 var REPZ_11_138 = 18;
29766 /* repeat a zero length 11-138 times  (7 bits of repeat count) */
29768 /* eslint-disable comma-spacing,array-bracket-spacing */
29769 var extra_lbits =   /* extra bits for each length code */
29770   [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];
29772 var extra_dbits =   /* extra bits for each distance code */
29773   [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];
29775 var extra_blbits =  /* extra bits for each bit length code */
29776   [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
29778 var bl_order =
29779   [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
29780 /* eslint-enable comma-spacing,array-bracket-spacing */
29782 /* The lengths of the bit length codes are sent in order of decreasing
29783  * probability, to avoid transmitting the lengths for unused bit length codes.
29784  */
29786 /* ===========================================================================
29787  * Local data. These are initialized only once.
29788  */
29790 // We pre-fill arrays with 0 to avoid uninitialized gaps
29792 var DIST_CODE_LEN = 512; /* see definition of array dist_code below */
29794 // !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1
29795 var static_ltree  = new Array((L_CODES + 2) * 2);
29796 zero(static_ltree);
29797 /* The static literal tree. Since the bit lengths are imposed, there is no
29798  * need for the L_CODES extra codes used during heap construction. However
29799  * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
29800  * below).
29801  */
29803 var static_dtree  = new Array(D_CODES * 2);
29804 zero(static_dtree);
29805 /* The static distance tree. (Actually a trivial tree since all codes use
29806  * 5 bits.)
29807  */
29809 var _dist_code    = new Array(DIST_CODE_LEN);
29810 zero(_dist_code);
29811 /* Distance codes. The first 256 values correspond to the distances
29812  * 3 .. 258, the last 256 values correspond to the top 8 bits of
29813  * the 15 bit distances.
29814  */
29816 var _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);
29817 zero(_length_code);
29818 /* length code for each normalized match length (0 == MIN_MATCH) */
29820 var base_length   = new Array(LENGTH_CODES);
29821 zero(base_length);
29822 /* First normalized length for each code (0 = MIN_MATCH) */
29824 var base_dist     = new Array(D_CODES);
29825 zero(base_dist);
29826 /* First normalized distance for each code (0 = distance of 1) */
29829 function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {
29831   this.static_tree  = static_tree;  /* static tree or NULL */
29832   this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */
29833   this.extra_base   = extra_base;   /* base index for extra_bits */
29834   this.elems        = elems;        /* max number of elements in the tree */
29835   this.max_length   = max_length;   /* max bit length for the codes */
29837   // show if `static_tree` has data or dummy - needed for monomorphic objects
29838   this.has_stree    = static_tree && static_tree.length;
29842 var static_l_desc;
29843 var static_d_desc;
29844 var static_bl_desc;
29847 function TreeDesc(dyn_tree, stat_desc) {
29848   this.dyn_tree = dyn_tree;     /* the dynamic tree */
29849   this.max_code = 0;            /* largest code with non zero frequency */
29850   this.stat_desc = stat_desc;   /* the corresponding static tree */
29855 function d_code(dist) {
29856   return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
29860 /* ===========================================================================
29861  * Output a short LSB first on the stream.
29862  * IN assertion: there is enough room in pendingBuf.
29863  */
29864 function put_short(s, w) {
29865 //    put_byte(s, (uch)((w) & 0xff));
29866 //    put_byte(s, (uch)((ush)(w) >> 8));
29867   s.pending_buf[s.pending++] = (w) & 0xff;
29868   s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
29872 /* ===========================================================================
29873  * Send a value on a given number of bits.
29874  * IN assertion: length <= 16 and value fits in length bits.
29875  */
29876 function send_bits(s, value, length) {
29877   if (s.bi_valid > (Buf_size - length)) {
29878     s.bi_buf |= (value << s.bi_valid) & 0xffff;
29879     put_short(s, s.bi_buf);
29880     s.bi_buf = value >> (Buf_size - s.bi_valid);
29881     s.bi_valid += length - Buf_size;
29882   } else {
29883     s.bi_buf |= (value << s.bi_valid) & 0xffff;
29884     s.bi_valid += length;
29885   }
29889 function send_code(s, c, tree) {
29890   send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);
29894 /* ===========================================================================
29895  * Reverse the first len bits of a code, using straightforward code (a faster
29896  * method would use a table)
29897  * IN assertion: 1 <= len <= 15
29898  */
29899 function bi_reverse(code, len) {
29900   var res = 0;
29901   do {
29902     res |= code & 1;
29903     code >>>= 1;
29904     res <<= 1;
29905   } while (--len > 0);
29906   return res >>> 1;
29910 /* ===========================================================================
29911  * Flush the bit buffer, keeping at most 7 bits in it.
29912  */
29913 function bi_flush(s) {
29914   if (s.bi_valid === 16) {
29915     put_short(s, s.bi_buf);
29916     s.bi_buf = 0;
29917     s.bi_valid = 0;
29919   } else if (s.bi_valid >= 8) {
29920     s.pending_buf[s.pending++] = s.bi_buf & 0xff;
29921     s.bi_buf >>= 8;
29922     s.bi_valid -= 8;
29923   }
29927 /* ===========================================================================
29928  * Compute the optimal bit lengths for a tree and update the total bit length
29929  * for the current block.
29930  * IN assertion: the fields freq and dad are set, heap[heap_max] and
29931  *    above are the tree nodes sorted by increasing frequency.
29932  * OUT assertions: the field len is set to the optimal bit length, the
29933  *     array bl_count contains the frequencies for each bit length.
29934  *     The length opt_len is updated; static_len is also updated if stree is
29935  *     not null.
29936  */
29937 function gen_bitlen(s, desc)
29938 //    deflate_state *s;
29939 //    tree_desc *desc;    /* the tree descriptor */
29941   var tree            = desc.dyn_tree;
29942   var max_code        = desc.max_code;
29943   var stree           = desc.stat_desc.static_tree;
29944   var has_stree       = desc.stat_desc.has_stree;
29945   var extra           = desc.stat_desc.extra_bits;
29946   var base            = desc.stat_desc.extra_base;
29947   var max_length      = desc.stat_desc.max_length;
29948   var h;              /* heap index */
29949   var n, m;           /* iterate over the tree elements */
29950   var bits;           /* bit length */
29951   var xbits;          /* extra bits */
29952   var f;              /* frequency */
29953   var overflow = 0;   /* number of elements with bit length too large */
29955   for (bits = 0; bits <= MAX_BITS; bits++) {
29956     s.bl_count[bits] = 0;
29957   }
29959   /* In a first pass, compute the optimal bit lengths (which may
29960    * overflow in the case of the bit length tree).
29961    */
29962   tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */
29964   for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {
29965     n = s.heap[h];
29966     bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
29967     if (bits > max_length) {
29968       bits = max_length;
29969       overflow++;
29970     }
29971     tree[n * 2 + 1]/*.Len*/ = bits;
29972     /* We overwrite tree[n].Dad which is no longer needed */
29974     if (n > max_code) { continue; } /* not a leaf node */
29976     s.bl_count[bits]++;
29977     xbits = 0;
29978     if (n >= base) {
29979       xbits = extra[n - base];
29980     }
29981     f = tree[n * 2]/*.Freq*/;
29982     s.opt_len += f * (bits + xbits);
29983     if (has_stree) {
29984       s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);
29985     }
29986   }
29987   if (overflow === 0) { return; }
29989   // Trace((stderr,"\nbit length overflow\n"));
29990   /* This happens for example on obj2 and pic of the Calgary corpus */
29992   /* Find the first bit length which could increase: */
29993   do {
29994     bits = max_length - 1;
29995     while (s.bl_count[bits] === 0) { bits--; }
29996     s.bl_count[bits]--;      /* move one leaf down the tree */
29997     s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */
29998     s.bl_count[max_length]--;
29999     /* The brother of the overflow item also moves one step up,
30000      * but this does not affect bl_count[max_length]
30001      */
30002     overflow -= 2;
30003   } while (overflow > 0);
30005   /* Now recompute all bit lengths, scanning in increasing frequency.
30006    * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
30007    * lengths instead of fixing only the wrong ones. This idea is taken
30008    * from 'ar' written by Haruhiko Okumura.)
30009    */
30010   for (bits = max_length; bits !== 0; bits--) {
30011     n = s.bl_count[bits];
30012     while (n !== 0) {
30013       m = s.heap[--h];
30014       if (m > max_code) { continue; }
30015       if (tree[m * 2 + 1]/*.Len*/ !== bits) {
30016         // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
30017         s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;
30018         tree[m * 2 + 1]/*.Len*/ = bits;
30019       }
30020       n--;
30021     }
30022   }
30026 /* ===========================================================================
30027  * Generate the codes for a given tree and bit counts (which need not be
30028  * optimal).
30029  * IN assertion: the array bl_count contains the bit length statistics for
30030  * the given tree and the field len is set for all tree elements.
30031  * OUT assertion: the field code is set for all tree elements of non
30032  *     zero code length.
30033  */
30034 function gen_codes(tree, max_code, bl_count)
30035 //    ct_data *tree;             /* the tree to decorate */
30036 //    int max_code;              /* largest code with non zero frequency */
30037 //    ushf *bl_count;            /* number of codes at each bit length */
30039   var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */
30040   var code = 0;              /* running code value */
30041   var bits;                  /* bit index */
30042   var n;                     /* code index */
30044   /* The distribution counts are first used to generate the code values
30045    * without bit reversal.
30046    */
30047   for (bits = 1; bits <= MAX_BITS; bits++) {
30048     next_code[bits] = code = (code + bl_count[bits - 1]) << 1;
30049   }
30050   /* Check that the bit counts in bl_count are consistent. The last code
30051    * must be all ones.
30052    */
30053   //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
30054   //        "inconsistent bit counts");
30055   //Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
30057   for (n = 0;  n <= max_code; n++) {
30058     var len = tree[n * 2 + 1]/*.Len*/;
30059     if (len === 0) { continue; }
30060     /* Now reverse the bits */
30061     tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);
30063     //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
30064     //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
30065   }
30069 /* ===========================================================================
30070  * Initialize the various 'constant' tables.
30071  */
30072 function tr_static_init() {
30073   var n;        /* iterates over tree elements */
30074   var bits;     /* bit counter */
30075   var length;   /* length value */
30076   var code;     /* code value */
30077   var dist;     /* distance index */
30078   var bl_count = new Array(MAX_BITS + 1);
30079   /* number of codes at each bit length for an optimal tree */
30081   // do check in _tr_init()
30082   //if (static_init_done) return;
30084   /* For some embedded targets, global variables are not initialized: */
30085 /*#ifdef NO_INIT_GLOBAL_POINTERS
30086   static_l_desc.static_tree = static_ltree;
30087   static_l_desc.extra_bits = extra_lbits;
30088   static_d_desc.static_tree = static_dtree;
30089   static_d_desc.extra_bits = extra_dbits;
30090   static_bl_desc.extra_bits = extra_blbits;
30091 #endif*/
30093   /* Initialize the mapping length (0..255) -> length code (0..28) */
30094   length = 0;
30095   for (code = 0; code < LENGTH_CODES - 1; code++) {
30096     base_length[code] = length;
30097     for (n = 0; n < (1 << extra_lbits[code]); n++) {
30098       _length_code[length++] = code;
30099     }
30100   }
30101   //Assert (length == 256, "tr_static_init: length != 256");
30102   /* Note that the length 255 (match length 258) can be represented
30103    * in two different ways: code 284 + 5 bits or code 285, so we
30104    * overwrite length_code[255] to use the best encoding:
30105    */
30106   _length_code[length - 1] = code;
30108   /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
30109   dist = 0;
30110   for (code = 0; code < 16; code++) {
30111     base_dist[code] = dist;
30112     for (n = 0; n < (1 << extra_dbits[code]); n++) {
30113       _dist_code[dist++] = code;
30114     }
30115   }
30116   //Assert (dist == 256, "tr_static_init: dist != 256");
30117   dist >>= 7; /* from now on, all distances are divided by 128 */
30118   for (; code < D_CODES; code++) {
30119     base_dist[code] = dist << 7;
30120     for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {
30121       _dist_code[256 + dist++] = code;
30122     }
30123   }
30124   //Assert (dist == 256, "tr_static_init: 256+dist != 512");
30126   /* Construct the codes of the static literal tree */
30127   for (bits = 0; bits <= MAX_BITS; bits++) {
30128     bl_count[bits] = 0;
30129   }
30131   n = 0;
30132   while (n <= 143) {
30133     static_ltree[n * 2 + 1]/*.Len*/ = 8;
30134     n++;
30135     bl_count[8]++;
30136   }
30137   while (n <= 255) {
30138     static_ltree[n * 2 + 1]/*.Len*/ = 9;
30139     n++;
30140     bl_count[9]++;
30141   }
30142   while (n <= 279) {
30143     static_ltree[n * 2 + 1]/*.Len*/ = 7;
30144     n++;
30145     bl_count[7]++;
30146   }
30147   while (n <= 287) {
30148     static_ltree[n * 2 + 1]/*.Len*/ = 8;
30149     n++;
30150     bl_count[8]++;
30151   }
30152   /* Codes 286 and 287 do not exist, but we must include them in the
30153    * tree construction to get a canonical Huffman tree (longest code
30154    * all ones)
30155    */
30156   gen_codes(static_ltree, L_CODES + 1, bl_count);
30158   /* The static distance tree is trivial: */
30159   for (n = 0; n < D_CODES; n++) {
30160     static_dtree[n * 2 + 1]/*.Len*/ = 5;
30161     static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);
30162   }
30164   // Now data ready and we can init static trees
30165   static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);
30166   static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);
30167   static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);
30169   //static_init_done = true;
30173 /* ===========================================================================
30174  * Initialize a new block.
30175  */
30176 function init_block(s) {
30177   var n; /* iterates over tree elements */
30179   /* Initialize the trees. */
30180   for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }
30181   for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }
30182   for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }
30184   s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;
30185   s.opt_len = s.static_len = 0;
30186   s.last_lit = s.matches = 0;
30190 /* ===========================================================================
30191  * Flush the bit buffer and align the output on a byte boundary
30192  */
30193 function bi_windup(s)
30195   if (s.bi_valid > 8) {
30196     put_short(s, s.bi_buf);
30197   } else if (s.bi_valid > 0) {
30198     //put_byte(s, (Byte)s->bi_buf);
30199     s.pending_buf[s.pending++] = s.bi_buf;
30200   }
30201   s.bi_buf = 0;
30202   s.bi_valid = 0;
30205 /* ===========================================================================
30206  * Copy a stored block, storing first the length and its
30207  * one's complement if requested.
30208  */
30209 function copy_block(s, buf, len, header)
30210 //DeflateState *s;
30211 //charf    *buf;    /* the input data */
30212 //unsigned len;     /* its length */
30213 //int      header;  /* true if block header must be written */
30215   bi_windup(s);        /* align on byte boundary */
30217   if (header) {
30218     put_short(s, len);
30219     put_short(s, ~len);
30220   }
30221 //  while (len--) {
30222 //    put_byte(s, *buf++);
30223 //  }
30224   utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
30225   s.pending += len;
30228 /* ===========================================================================
30229  * Compares to subtrees, using the tree depth as tie breaker when
30230  * the subtrees have equal frequency. This minimizes the worst case length.
30231  */
30232 function smaller(tree, n, m, depth) {
30233   var _n2 = n * 2;
30234   var _m2 = m * 2;
30235   return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
30236          (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
30239 /* ===========================================================================
30240  * Restore the heap property by moving down the tree starting at node k,
30241  * exchanging a node with the smallest of its two sons if necessary, stopping
30242  * when the heap property is re-established (each father smaller than its
30243  * two sons).
30244  */
30245 function pqdownheap(s, tree, k)
30246 //    deflate_state *s;
30247 //    ct_data *tree;  /* the tree to restore */
30248 //    int k;               /* node to move down */
30250   var v = s.heap[k];
30251   var j = k << 1;  /* left son of k */
30252   while (j <= s.heap_len) {
30253     /* Set j to the smallest of the two sons: */
30254     if (j < s.heap_len &&
30255       smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {
30256       j++;
30257     }
30258     /* Exit if v is smaller than both sons */
30259     if (smaller(tree, v, s.heap[j], s.depth)) { break; }
30261     /* Exchange v with the smallest son */
30262     s.heap[k] = s.heap[j];
30263     k = j;
30265     /* And continue down the tree, setting j to the left son of k */
30266     j <<= 1;
30267   }
30268   s.heap[k] = v;
30272 // inlined manually
30273 // var SMALLEST = 1;
30275 /* ===========================================================================
30276  * Send the block data compressed using the given Huffman trees
30277  */
30278 function compress_block(s, ltree, dtree)
30279 //    deflate_state *s;
30280 //    const ct_data *ltree; /* literal tree */
30281 //    const ct_data *dtree; /* distance tree */
30283   var dist;           /* distance of matched string */
30284   var lc;             /* match length or unmatched char (if dist == 0) */
30285   var lx = 0;         /* running index in l_buf */
30286   var code;           /* the code to send */
30287   var extra;          /* number of extra bits to send */
30289   if (s.last_lit !== 0) {
30290     do {
30291       dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);
30292       lc = s.pending_buf[s.l_buf + lx];
30293       lx++;
30295       if (dist === 0) {
30296         send_code(s, lc, ltree); /* send a literal byte */
30297         //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
30298       } else {
30299         /* Here, lc is the match length - MIN_MATCH */
30300         code = _length_code[lc];
30301         send_code(s, code + LITERALS + 1, ltree); /* send the length code */
30302         extra = extra_lbits[code];
30303         if (extra !== 0) {
30304           lc -= base_length[code];
30305           send_bits(s, lc, extra);       /* send the extra length bits */
30306         }
30307         dist--; /* dist is now the match distance - 1 */
30308         code = d_code(dist);
30309         //Assert (code < D_CODES, "bad d_code");
30311         send_code(s, code, dtree);       /* send the distance code */
30312         extra = extra_dbits[code];
30313         if (extra !== 0) {
30314           dist -= base_dist[code];
30315           send_bits(s, dist, extra);   /* send the extra distance bits */
30316         }
30317       } /* literal or match pair ? */
30319       /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
30320       //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
30321       //       "pendingBuf overflow");
30323     } while (lx < s.last_lit);
30324   }
30326   send_code(s, END_BLOCK, ltree);
30330 /* ===========================================================================
30331  * Construct one Huffman tree and assigns the code bit strings and lengths.
30332  * Update the total bit length for the current block.
30333  * IN assertion: the field freq is set for all tree elements.
30334  * OUT assertions: the fields len and code are set to the optimal bit length
30335  *     and corresponding code. The length opt_len is updated; static_len is
30336  *     also updated if stree is not null. The field max_code is set.
30337  */
30338 function build_tree(s, desc)
30339 //    deflate_state *s;
30340 //    tree_desc *desc; /* the tree descriptor */
30342   var tree     = desc.dyn_tree;
30343   var stree    = desc.stat_desc.static_tree;
30344   var has_stree = desc.stat_desc.has_stree;
30345   var elems    = desc.stat_desc.elems;
30346   var n, m;          /* iterate over heap elements */
30347   var max_code = -1; /* largest code with non zero frequency */
30348   var node;          /* new node being created */
30350   /* Construct the initial heap, with least frequent element in
30351    * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
30352    * heap[0] is not used.
30353    */
30354   s.heap_len = 0;
30355   s.heap_max = HEAP_SIZE;
30357   for (n = 0; n < elems; n++) {
30358     if (tree[n * 2]/*.Freq*/ !== 0) {
30359       s.heap[++s.heap_len] = max_code = n;
30360       s.depth[n] = 0;
30362     } else {
30363       tree[n * 2 + 1]/*.Len*/ = 0;
30364     }
30365   }
30367   /* The pkzip format requires that at least one distance code exists,
30368    * and that at least one bit should be sent even if there is only one
30369    * possible code. So to avoid special checks later on we force at least
30370    * two codes of non zero frequency.
30371    */
30372   while (s.heap_len < 2) {
30373     node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
30374     tree[node * 2]/*.Freq*/ = 1;
30375     s.depth[node] = 0;
30376     s.opt_len--;
30378     if (has_stree) {
30379       s.static_len -= stree[node * 2 + 1]/*.Len*/;
30380     }
30381     /* node is 0 or 1 so it does not have extra bits */
30382   }
30383   desc.max_code = max_code;
30385   /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
30386    * establish sub-heaps of increasing lengths:
30387    */
30388   for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }
30390   /* Construct the Huffman tree by repeatedly combining the least two
30391    * frequent nodes.
30392    */
30393   node = elems;              /* next internal node of the tree */
30394   do {
30395     //pqremove(s, tree, n);  /* n = node of least frequency */
30396     /*** pqremove ***/
30397     n = s.heap[1/*SMALLEST*/];
30398     s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
30399     pqdownheap(s, tree, 1/*SMALLEST*/);
30400     /***/
30402     m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
30404     s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
30405     s.heap[--s.heap_max] = m;
30407     /* Create a new node father of n and m */
30408     tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
30409     s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
30410     tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;
30412     /* and insert the new node in the heap */
30413     s.heap[1/*SMALLEST*/] = node++;
30414     pqdownheap(s, tree, 1/*SMALLEST*/);
30416   } while (s.heap_len >= 2);
30418   s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
30420   /* At this point, the fields freq and dad are set. We can now
30421    * generate the bit lengths.
30422    */
30423   gen_bitlen(s, desc);
30425   /* The field len is now set, we can generate the bit codes */
30426   gen_codes(tree, max_code, s.bl_count);
30430 /* ===========================================================================
30431  * Scan a literal or distance tree to determine the frequencies of the codes
30432  * in the bit length tree.
30433  */
30434 function scan_tree(s, tree, max_code)
30435 //    deflate_state *s;
30436 //    ct_data *tree;   /* the tree to be scanned */
30437 //    int max_code;    /* and its largest code of non zero frequency */
30439   var n;                     /* iterates over all tree elements */
30440   var prevlen = -1;          /* last emitted length */
30441   var curlen;                /* length of current code */
30443   var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
30445   var count = 0;             /* repeat count of the current code */
30446   var max_count = 7;         /* max repeat count */
30447   var min_count = 4;         /* min repeat count */
30449   if (nextlen === 0) {
30450     max_count = 138;
30451     min_count = 3;
30452   }
30453   tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */
30455   for (n = 0; n <= max_code; n++) {
30456     curlen = nextlen;
30457     nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
30459     if (++count < max_count && curlen === nextlen) {
30460       continue;
30462     } else if (count < min_count) {
30463       s.bl_tree[curlen * 2]/*.Freq*/ += count;
30465     } else if (curlen !== 0) {
30467       if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
30468       s.bl_tree[REP_3_6 * 2]/*.Freq*/++;
30470     } else if (count <= 10) {
30471       s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;
30473     } else {
30474       s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;
30475     }
30477     count = 0;
30478     prevlen = curlen;
30480     if (nextlen === 0) {
30481       max_count = 138;
30482       min_count = 3;
30484     } else if (curlen === nextlen) {
30485       max_count = 6;
30486       min_count = 3;
30488     } else {
30489       max_count = 7;
30490       min_count = 4;
30491     }
30492   }
30496 /* ===========================================================================
30497  * Send a literal or distance tree in compressed form, using the codes in
30498  * bl_tree.
30499  */
30500 function send_tree(s, tree, max_code)
30501 //    deflate_state *s;
30502 //    ct_data *tree; /* the tree to be scanned */
30503 //    int max_code;       /* and its largest code of non zero frequency */
30505   var n;                     /* iterates over all tree elements */
30506   var prevlen = -1;          /* last emitted length */
30507   var curlen;                /* length of current code */
30509   var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
30511   var count = 0;             /* repeat count of the current code */
30512   var max_count = 7;         /* max repeat count */
30513   var min_count = 4;         /* min repeat count */
30515   /* tree[max_code+1].Len = -1; */  /* guard already set */
30516   if (nextlen === 0) {
30517     max_count = 138;
30518     min_count = 3;
30519   }
30521   for (n = 0; n <= max_code; n++) {
30522     curlen = nextlen;
30523     nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
30525     if (++count < max_count && curlen === nextlen) {
30526       continue;
30528     } else if (count < min_count) {
30529       do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);
30531     } else if (curlen !== 0) {
30532       if (curlen !== prevlen) {
30533         send_code(s, curlen, s.bl_tree);
30534         count--;
30535       }
30536       //Assert(count >= 3 && count <= 6, " 3_6?");
30537       send_code(s, REP_3_6, s.bl_tree);
30538       send_bits(s, count - 3, 2);
30540     } else if (count <= 10) {
30541       send_code(s, REPZ_3_10, s.bl_tree);
30542       send_bits(s, count - 3, 3);
30544     } else {
30545       send_code(s, REPZ_11_138, s.bl_tree);
30546       send_bits(s, count - 11, 7);
30547     }
30549     count = 0;
30550     prevlen = curlen;
30551     if (nextlen === 0) {
30552       max_count = 138;
30553       min_count = 3;
30555     } else if (curlen === nextlen) {
30556       max_count = 6;
30557       min_count = 3;
30559     } else {
30560       max_count = 7;
30561       min_count = 4;
30562     }
30563   }
30567 /* ===========================================================================
30568  * Construct the Huffman tree for the bit lengths and return the index in
30569  * bl_order of the last bit length code to send.
30570  */
30571 function build_bl_tree(s) {
30572   var max_blindex;  /* index of last bit length code of non zero freq */
30574   /* Determine the bit length frequencies for literal and distance trees */
30575   scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
30576   scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
30578   /* Build the bit length tree: */
30579   build_tree(s, s.bl_desc);
30580   /* opt_len now includes the length of the tree representations, except
30581    * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
30582    */
30584   /* Determine the number of bit length codes to send. The pkzip format
30585    * requires that at least 4 bit length codes be sent. (appnote.txt says
30586    * 3 but the actual value used is 4.)
30587    */
30588   for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {
30589     if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {
30590       break;
30591     }
30592   }
30593   /* Update opt_len to include the bit length tree and counts */
30594   s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;
30595   //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
30596   //        s->opt_len, s->static_len));
30598   return max_blindex;
30602 /* ===========================================================================
30603  * Send the header for a block using dynamic Huffman trees: the counts, the
30604  * lengths of the bit length codes, the literal tree and the distance tree.
30605  * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
30606  */
30607 function send_all_trees(s, lcodes, dcodes, blcodes)
30608 //    deflate_state *s;
30609 //    int lcodes, dcodes, blcodes; /* number of codes for each tree */
30611   var rank;                    /* index in bl_order */
30613   //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
30614   //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
30615   //        "too many codes");
30616   //Tracev((stderr, "\nbl counts: "));
30617   send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */
30618   send_bits(s, dcodes - 1,   5);
30619   send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */
30620   for (rank = 0; rank < blcodes; rank++) {
30621     //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
30622     send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);
30623   }
30624   //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
30626   send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */
30627   //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
30629   send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */
30630   //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
30634 /* ===========================================================================
30635  * Check if the data type is TEXT or BINARY, using the following algorithm:
30636  * - TEXT if the two conditions below are satisfied:
30637  *    a) There are no non-portable control characters belonging to the
30638  *       "black list" (0..6, 14..25, 28..31).
30639  *    b) There is at least one printable character belonging to the
30640  *       "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
30641  * - BINARY otherwise.
30642  * - The following partially-portable control characters form a
30643  *   "gray list" that is ignored in this detection algorithm:
30644  *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
30645  * IN assertion: the fields Freq of dyn_ltree are set.
30646  */
30647 function detect_data_type(s) {
30648   /* black_mask is the bit mask of black-listed bytes
30649    * set bits 0..6, 14..25, and 28..31
30650    * 0xf3ffc07f = binary 11110011111111111100000001111111
30651    */
30652   var black_mask = 0xf3ffc07f;
30653   var n;
30655   /* Check for non-textual ("black-listed") bytes. */
30656   for (n = 0; n <= 31; n++, black_mask >>>= 1) {
30657     if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {
30658       return Z_BINARY;
30659     }
30660   }
30662   /* Check for textual ("white-listed") bytes. */
30663   if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
30664       s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
30665     return Z_TEXT;
30666   }
30667   for (n = 32; n < LITERALS; n++) {
30668     if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
30669       return Z_TEXT;
30670     }
30671   }
30673   /* There are no "black-listed" or "white-listed" bytes:
30674    * this stream either is empty or has tolerated ("gray-listed") bytes only.
30675    */
30676   return Z_BINARY;
30680 var static_init_done = false;
30682 /* ===========================================================================
30683  * Initialize the tree data structures for a new zlib stream.
30684  */
30685 function _tr_init(s)
30688   if (!static_init_done) {
30689     tr_static_init();
30690     static_init_done = true;
30691   }
30693   s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);
30694   s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);
30695   s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
30697   s.bi_buf = 0;
30698   s.bi_valid = 0;
30700   /* Initialize the first block of the first file: */
30701   init_block(s);
30705 /* ===========================================================================
30706  * Send a stored block
30707  */
30708 function _tr_stored_block(s, buf, stored_len, last)
30709 //DeflateState *s;
30710 //charf *buf;       /* input block */
30711 //ulg stored_len;   /* length of input block */
30712 //int last;         /* one if this is the last block for a file */
30714   send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */
30715   copy_block(s, buf, stored_len, true); /* with header */
30719 /* ===========================================================================
30720  * Send one empty static block to give enough lookahead for inflate.
30721  * This takes 10 bits, of which 7 may remain in the bit buffer.
30722  */
30723 function _tr_align(s) {
30724   send_bits(s, STATIC_TREES << 1, 3);
30725   send_code(s, END_BLOCK, static_ltree);
30726   bi_flush(s);
30730 /* ===========================================================================
30731  * Determine the best encoding for the current block: dynamic trees, static
30732  * trees or store, and output the encoded block to the zip file.
30733  */
30734 function _tr_flush_block(s, buf, stored_len, last)
30735 //DeflateState *s;
30736 //charf *buf;       /* input block, or NULL if too old */
30737 //ulg stored_len;   /* length of input block */
30738 //int last;         /* one if this is the last block for a file */
30740   var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */
30741   var max_blindex = 0;        /* index of last bit length code of non zero freq */
30743   /* Build the Huffman trees unless a stored block is forced */
30744   if (s.level > 0) {
30746     /* Check if the file is binary or text */
30747     if (s.strm.data_type === Z_UNKNOWN) {
30748       s.strm.data_type = detect_data_type(s);
30749     }
30751     /* Construct the literal and distance trees */
30752     build_tree(s, s.l_desc);
30753     // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
30754     //        s->static_len));
30756     build_tree(s, s.d_desc);
30757     // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
30758     //        s->static_len));
30759     /* At this point, opt_len and static_len are the total bit lengths of
30760      * the compressed block data, excluding the tree representations.
30761      */
30763     /* Build the bit length tree for the above two trees, and get the index
30764      * in bl_order of the last bit length code to send.
30765      */
30766     max_blindex = build_bl_tree(s);
30768     /* Determine the best encoding. Compute the block lengths in bytes. */
30769     opt_lenb = (s.opt_len + 3 + 7) >>> 3;
30770     static_lenb = (s.static_len + 3 + 7) >>> 3;
30772     // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
30773     //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
30774     //        s->last_lit));
30776     if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
30778   } else {
30779     // Assert(buf != (char*)0, "lost buf");
30780     opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
30781   }
30783   if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {
30784     /* 4: two words for the lengths */
30786     /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
30787      * Otherwise we can't have processed more than WSIZE input bytes since
30788      * the last block flush, because compression would have been
30789      * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
30790      * transform a block into a stored block.
30791      */
30792     _tr_stored_block(s, buf, stored_len, last);
30794   } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
30796     send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);
30797     compress_block(s, static_ltree, static_dtree);
30799   } else {
30800     send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);
30801     send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);
30802     compress_block(s, s.dyn_ltree, s.dyn_dtree);
30803   }
30804   // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
30805   /* The above check is made mod 2^32, for files larger than 512 MB
30806    * and uLong implemented on 32 bits.
30807    */
30808   init_block(s);
30810   if (last) {
30811     bi_windup(s);
30812   }
30813   // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
30814   //       s->compressed_len-7*last));
30817 /* ===========================================================================
30818  * Save the match info and tally the frequency counts. Return true if
30819  * the current block must be flushed.
30820  */
30821 function _tr_tally(s, dist, lc)
30822 //    deflate_state *s;
30823 //    unsigned dist;  /* distance of matched string */
30824 //    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
30826   //var out_length, in_length, dcode;
30828   s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;
30829   s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;
30831   s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
30832   s.last_lit++;
30834   if (dist === 0) {
30835     /* lc is the unmatched char */
30836     s.dyn_ltree[lc * 2]/*.Freq*/++;
30837   } else {
30838     s.matches++;
30839     /* Here, lc is the match length - MIN_MATCH */
30840     dist--;             /* dist = match distance - 1 */
30841     //Assert((ush)dist < (ush)MAX_DIST(s) &&
30842     //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
30843     //       (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
30845     s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;
30846     s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
30847   }
30849 // (!) This block is disabled in zlib defaults,
30850 // don't enable it for binary compatibility
30852 //#ifdef TRUNCATE_BLOCK
30853 //  /* Try to guess if it is profitable to stop the current block here */
30854 //  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
30855 //    /* Compute an upper bound for the compressed length */
30856 //    out_length = s.last_lit*8;
30857 //    in_length = s.strstart - s.block_start;
30859 //    for (dcode = 0; dcode < D_CODES; dcode++) {
30860 //      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
30861 //    }
30862 //    out_length >>>= 3;
30863 //    //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
30864 //    //       s->last_lit, in_length, out_length,
30865 //    //       100L - out_length*100L/in_length));
30866 //    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
30867 //      return true;
30868 //    }
30869 //  }
30870 //#endif
30872   return (s.last_lit === s.lit_bufsize - 1);
30873   /* We avoid equality with lit_bufsize because of wraparound at 64K
30874    * on 16 bit machines and because stored blocks are restricted to
30875    * 64K-1 bytes.
30876    */
30879 exports._tr_init  = _tr_init;
30880 exports._tr_stored_block = _tr_stored_block;
30881 exports._tr_flush_block  = _tr_flush_block;
30882 exports._tr_tally = _tr_tally;
30883 exports._tr_align = _tr_align;
30886 /***/ }),
30887 /* 156 */
30888 /***/ (function(module, exports, __webpack_require__) {
30890 "use strict";
30893 // (C) 1995-2013 Jean-loup Gailly and Mark Adler
30894 // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
30896 // This software is provided 'as-is', without any express or implied
30897 // warranty. In no event will the authors be held liable for any damages
30898 // arising from the use of this software.
30900 // Permission is granted to anyone to use this software for any purpose,
30901 // including commercial applications, and to alter it and redistribute it
30902 // freely, subject to the following restrictions:
30904 // 1. The origin of this software must not be misrepresented; you must not
30905 //   claim that you wrote the original software. If you use this software
30906 //   in a product, an acknowledgment in the product documentation would be
30907 //   appreciated but is not required.
30908 // 2. Altered source versions must be plainly marked as such, and must not be
30909 //   misrepresented as being the original software.
30910 // 3. This notice may not be removed or altered from any source distribution.
30912 module.exports = {
30913   2:      'need dictionary',     /* Z_NEED_DICT       2  */
30914   1:      'stream end',          /* Z_STREAM_END      1  */
30915   0:      '',                    /* Z_OK              0  */
30916   '-1':   'file error',          /* Z_ERRNO         (-1) */
30917   '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */
30918   '-3':   'data error',          /* Z_DATA_ERROR    (-3) */
30919   '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */
30920   '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */
30921   '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */
30925 /***/ }),
30926 /* 157 */
30927 /***/ (function(module, exports, __webpack_require__) {
30929 "use strict";
30932 // (C) 1995-2013 Jean-loup Gailly and Mark Adler
30933 // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
30935 // This software is provided 'as-is', without any express or implied
30936 // warranty. In no event will the authors be held liable for any damages
30937 // arising from the use of this software.
30939 // Permission is granted to anyone to use this software for any purpose,
30940 // including commercial applications, and to alter it and redistribute it
30941 // freely, subject to the following restrictions:
30943 // 1. The origin of this software must not be misrepresented; you must not
30944 //   claim that you wrote the original software. If you use this software
30945 //   in a product, an acknowledgment in the product documentation would be
30946 //   appreciated but is not required.
30947 // 2. Altered source versions must be plainly marked as such, and must not be
30948 //   misrepresented as being the original software.
30949 // 3. This notice may not be removed or altered from any source distribution.
30951 var utils         = __webpack_require__(34);
30952 var adler32       = __webpack_require__(89);
30953 var crc32         = __webpack_require__(90);
30954 var inflate_fast  = __webpack_require__(158);
30955 var inflate_table = __webpack_require__(159);
30957 var CODES = 0;
30958 var LENS = 1;
30959 var DISTS = 2;
30961 /* Public constants ==========================================================*/
30962 /* ===========================================================================*/
30965 /* Allowed flush values; see deflate() and inflate() below for details */
30966 //var Z_NO_FLUSH      = 0;
30967 //var Z_PARTIAL_FLUSH = 1;
30968 //var Z_SYNC_FLUSH    = 2;
30969 //var Z_FULL_FLUSH    = 3;
30970 var Z_FINISH        = 4;
30971 var Z_BLOCK         = 5;
30972 var Z_TREES         = 6;
30975 /* Return codes for the compression/decompression functions. Negative values
30976  * are errors, positive values are used for special but normal events.
30977  */
30978 var Z_OK            = 0;
30979 var Z_STREAM_END    = 1;
30980 var Z_NEED_DICT     = 2;
30981 //var Z_ERRNO         = -1;
30982 var Z_STREAM_ERROR  = -2;
30983 var Z_DATA_ERROR    = -3;
30984 var Z_MEM_ERROR     = -4;
30985 var Z_BUF_ERROR     = -5;
30986 //var Z_VERSION_ERROR = -6;
30988 /* The deflate compression method */
30989 var Z_DEFLATED  = 8;
30992 /* STATES ====================================================================*/
30993 /* ===========================================================================*/
30996 var    HEAD = 1;       /* i: waiting for magic header */
30997 var    FLAGS = 2;      /* i: waiting for method and flags (gzip) */
30998 var    TIME = 3;       /* i: waiting for modification time (gzip) */
30999 var    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */
31000 var    EXLEN = 5;      /* i: waiting for extra length (gzip) */
31001 var    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */
31002 var    NAME = 7;       /* i: waiting for end of file name (gzip) */
31003 var    COMMENT = 8;    /* i: waiting for end of comment (gzip) */
31004 var    HCRC = 9;       /* i: waiting for header crc (gzip) */
31005 var    DICTID = 10;    /* i: waiting for dictionary check value */
31006 var    DICT = 11;      /* waiting for inflateSetDictionary() call */
31007 var        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
31008 var        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */
31009 var        STORED = 14;    /* i: waiting for stored size (length and complement) */
31010 var        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */
31011 var        COPY = 16;      /* i/o: waiting for input or output to copy stored block */
31012 var        TABLE = 17;     /* i: waiting for dynamic block table lengths */
31013 var        LENLENS = 18;   /* i: waiting for code length code lengths */
31014 var        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */
31015 var            LEN_ = 20;      /* i: same as LEN below, but only first time in */
31016 var            LEN = 21;       /* i: waiting for length/lit/eob code */
31017 var            LENEXT = 22;    /* i: waiting for length extra bits */
31018 var            DIST = 23;      /* i: waiting for distance code */
31019 var            DISTEXT = 24;   /* i: waiting for distance extra bits */
31020 var            MATCH = 25;     /* o: waiting for output space to copy string */
31021 var            LIT = 26;       /* o: waiting for output space to write literal */
31022 var    CHECK = 27;     /* i: waiting for 32-bit check value */
31023 var    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */
31024 var    DONE = 29;      /* finished check, done -- remain here until reset */
31025 var    BAD = 30;       /* got a data error -- remain here until reset */
31026 var    MEM = 31;       /* got an inflate() memory error -- remain here until reset */
31027 var    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */
31029 /* ===========================================================================*/
31033 var ENOUGH_LENS = 852;
31034 var ENOUGH_DISTS = 592;
31035 //var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);
31037 var MAX_WBITS = 15;
31038 /* 32K LZ77 window */
31039 var DEF_WBITS = MAX_WBITS;
31042 function zswap32(q) {
31043   return  (((q >>> 24) & 0xff) +
31044           ((q >>> 8) & 0xff00) +
31045           ((q & 0xff00) << 8) +
31046           ((q & 0xff) << 24));
31050 function InflateState() {
31051   this.mode = 0;             /* current inflate mode */
31052   this.last = false;          /* true if processing last block */
31053   this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
31054   this.havedict = false;      /* true if dictionary provided */
31055   this.flags = 0;             /* gzip header method and flags (0 if zlib) */
31056   this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */
31057   this.check = 0;             /* protected copy of check value */
31058   this.total = 0;             /* protected copy of output count */
31059   // TODO: may be {}
31060   this.head = null;           /* where to save gzip header information */
31062   /* sliding window */
31063   this.wbits = 0;             /* log base 2 of requested window size */
31064   this.wsize = 0;             /* window size or zero if not using window */
31065   this.whave = 0;             /* valid bytes in the window */
31066   this.wnext = 0;             /* window write index */
31067   this.window = null;         /* allocated sliding window, if needed */
31069   /* bit accumulator */
31070   this.hold = 0;              /* input bit accumulator */
31071   this.bits = 0;              /* number of bits in "in" */
31073   /* for string and stored block copying */
31074   this.length = 0;            /* literal or length of data to copy */
31075   this.offset = 0;            /* distance back to copy string from */
31077   /* for table and code decoding */
31078   this.extra = 0;             /* extra bits needed */
31080   /* fixed and dynamic code tables */
31081   this.lencode = null;          /* starting table for length/literal codes */
31082   this.distcode = null;         /* starting table for distance codes */
31083   this.lenbits = 0;           /* index bits for lencode */
31084   this.distbits = 0;          /* index bits for distcode */
31086   /* dynamic table building */
31087   this.ncode = 0;             /* number of code length code lengths */
31088   this.nlen = 0;              /* number of length code lengths */
31089   this.ndist = 0;             /* number of distance code lengths */
31090   this.have = 0;              /* number of code lengths in lens[] */
31091   this.next = null;              /* next available space in codes[] */
31093   this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
31094   this.work = new utils.Buf16(288); /* work area for code table building */
31096   /*
31097    because we don't have pointers in js, we use lencode and distcode directly
31098    as buffers so we don't need codes
31099   */
31100   //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */
31101   this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */
31102   this.distdyn = null;             /* dynamic table for distance codes (JS specific) */
31103   this.sane = 0;                   /* if false, allow invalid distance too far */
31104   this.back = 0;                   /* bits back of last unprocessed length/lit */
31105   this.was = 0;                    /* initial length of match */
31108 function inflateResetKeep(strm) {
31109   var state;
31111   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
31112   state = strm.state;
31113   strm.total_in = strm.total_out = state.total = 0;
31114   strm.msg = ''; /*Z_NULL*/
31115   if (state.wrap) {       /* to support ill-conceived Java test suite */
31116     strm.adler = state.wrap & 1;
31117   }
31118   state.mode = HEAD;
31119   state.last = 0;
31120   state.havedict = 0;
31121   state.dmax = 32768;
31122   state.head = null/*Z_NULL*/;
31123   state.hold = 0;
31124   state.bits = 0;
31125   //state.lencode = state.distcode = state.next = state.codes;
31126   state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
31127   state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
31129   state.sane = 1;
31130   state.back = -1;
31131   //Tracev((stderr, "inflate: reset\n"));
31132   return Z_OK;
31135 function inflateReset(strm) {
31136   var state;
31138   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
31139   state = strm.state;
31140   state.wsize = 0;
31141   state.whave = 0;
31142   state.wnext = 0;
31143   return inflateResetKeep(strm);
31147 function inflateReset2(strm, windowBits) {
31148   var wrap;
31149   var state;
31151   /* get the state */
31152   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
31153   state = strm.state;
31155   /* extract wrap request from windowBits parameter */
31156   if (windowBits < 0) {
31157     wrap = 0;
31158     windowBits = -windowBits;
31159   }
31160   else {
31161     wrap = (windowBits >> 4) + 1;
31162     if (windowBits < 48) {
31163       windowBits &= 15;
31164     }
31165   }
31167   /* set number of window bits, free window if different */
31168   if (windowBits && (windowBits < 8 || windowBits > 15)) {
31169     return Z_STREAM_ERROR;
31170   }
31171   if (state.window !== null && state.wbits !== windowBits) {
31172     state.window = null;
31173   }
31175   /* update state and reset the rest of it */
31176   state.wrap = wrap;
31177   state.wbits = windowBits;
31178   return inflateReset(strm);
31181 function inflateInit2(strm, windowBits) {
31182   var ret;
31183   var state;
31185   if (!strm) { return Z_STREAM_ERROR; }
31186   //strm.msg = Z_NULL;                 /* in case we return an error */
31188   state = new InflateState();
31190   //if (state === Z_NULL) return Z_MEM_ERROR;
31191   //Tracev((stderr, "inflate: allocated\n"));
31192   strm.state = state;
31193   state.window = null/*Z_NULL*/;
31194   ret = inflateReset2(strm, windowBits);
31195   if (ret !== Z_OK) {
31196     strm.state = null/*Z_NULL*/;
31197   }
31198   return ret;
31201 function inflateInit(strm) {
31202   return inflateInit2(strm, DEF_WBITS);
31207  Return state with length and distance decoding tables and index sizes set to
31208  fixed code decoding.  Normally this returns fixed tables from inffixed.h.
31209  If BUILDFIXED is defined, then instead this routine builds the tables the
31210  first time it's called, and returns those tables the first time and
31211  thereafter.  This reduces the size of the code by about 2K bytes, in
31212  exchange for a little execution time.  However, BUILDFIXED should not be
31213  used for threaded applications, since the rewriting of the tables and virgin
31214  may not be thread-safe.
31215  */
31216 var virgin = true;
31218 var lenfix, distfix; // We have no pointers in JS, so keep tables separate
31220 function fixedtables(state) {
31221   /* build fixed huffman tables if first call (may not be thread safe) */
31222   if (virgin) {
31223     var sym;
31225     lenfix = new utils.Buf32(512);
31226     distfix = new utils.Buf32(32);
31228     /* literal/length table */
31229     sym = 0;
31230     while (sym < 144) { state.lens[sym++] = 8; }
31231     while (sym < 256) { state.lens[sym++] = 9; }
31232     while (sym < 280) { state.lens[sym++] = 7; }
31233     while (sym < 288) { state.lens[sym++] = 8; }
31235     inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });
31237     /* distance table */
31238     sym = 0;
31239     while (sym < 32) { state.lens[sym++] = 5; }
31241     inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });
31243     /* do this just once */
31244     virgin = false;
31245   }
31247   state.lencode = lenfix;
31248   state.lenbits = 9;
31249   state.distcode = distfix;
31250   state.distbits = 5;
31255  Update the window with the last wsize (normally 32K) bytes written before
31256  returning.  If window does not exist yet, create it.  This is only called
31257  when a window is already in use, or when output has been written during this
31258  inflate call, but the end of the deflate stream has not been reached yet.
31259  It is also called to create a window for dictionary data when a dictionary
31260  is loaded.
31262  Providing output buffers larger than 32K to inflate() should provide a speed
31263  advantage, since only the last 32K of output is copied to the sliding window
31264  upon return from inflate(), and since all distances after the first 32K of
31265  output will fall in the output data, making match copies simpler and faster.
31266  The advantage may be dependent on the size of the processor's data caches.
31267  */
31268 function updatewindow(strm, src, end, copy) {
31269   var dist;
31270   var state = strm.state;
31272   /* if it hasn't been done already, allocate space for the window */
31273   if (state.window === null) {
31274     state.wsize = 1 << state.wbits;
31275     state.wnext = 0;
31276     state.whave = 0;
31278     state.window = new utils.Buf8(state.wsize);
31279   }
31281   /* copy state->wsize or less output bytes into the circular window */
31282   if (copy >= state.wsize) {
31283     utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);
31284     state.wnext = 0;
31285     state.whave = state.wsize;
31286   }
31287   else {
31288     dist = state.wsize - state.wnext;
31289     if (dist > copy) {
31290       dist = copy;
31291     }
31292     //zmemcpy(state->window + state->wnext, end - copy, dist);
31293     utils.arraySet(state.window, src, end - copy, dist, state.wnext);
31294     copy -= dist;
31295     if (copy) {
31296       //zmemcpy(state->window, end - copy, copy);
31297       utils.arraySet(state.window, src, end - copy, copy, 0);
31298       state.wnext = copy;
31299       state.whave = state.wsize;
31300     }
31301     else {
31302       state.wnext += dist;
31303       if (state.wnext === state.wsize) { state.wnext = 0; }
31304       if (state.whave < state.wsize) { state.whave += dist; }
31305     }
31306   }
31307   return 0;
31310 function inflate(strm, flush) {
31311   var state;
31312   var input, output;          // input/output buffers
31313   var next;                   /* next input INDEX */
31314   var put;                    /* next output INDEX */
31315   var have, left;             /* available input and output */
31316   var hold;                   /* bit buffer */
31317   var bits;                   /* bits in bit buffer */
31318   var _in, _out;              /* save starting available input and output */
31319   var copy;                   /* number of stored or match bytes to copy */
31320   var from;                   /* where to copy match bytes from */
31321   var from_source;
31322   var here = 0;               /* current decoding table entry */
31323   var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
31324   //var last;                   /* parent table entry */
31325   var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
31326   var len;                    /* length to copy for repeats, bits to drop */
31327   var ret;                    /* return code */
31328   var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */
31329   var opts;
31331   var n; // temporary var for NEED_BITS
31333   var order = /* permutation of code lengths */
31334     [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];
31337   if (!strm || !strm.state || !strm.output ||
31338       (!strm.input && strm.avail_in !== 0)) {
31339     return Z_STREAM_ERROR;
31340   }
31342   state = strm.state;
31343   if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */
31346   //--- LOAD() ---
31347   put = strm.next_out;
31348   output = strm.output;
31349   left = strm.avail_out;
31350   next = strm.next_in;
31351   input = strm.input;
31352   have = strm.avail_in;
31353   hold = state.hold;
31354   bits = state.bits;
31355   //---
31357   _in = have;
31358   _out = left;
31359   ret = Z_OK;
31361   inf_leave: // goto emulation
31362   for (;;) {
31363     switch (state.mode) {
31364       case HEAD:
31365         if (state.wrap === 0) {
31366           state.mode = TYPEDO;
31367           break;
31368         }
31369         //=== NEEDBITS(16);
31370         while (bits < 16) {
31371           if (have === 0) { break inf_leave; }
31372           have--;
31373           hold += input[next++] << bits;
31374           bits += 8;
31375         }
31376         //===//
31377         if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */
31378           state.check = 0/*crc32(0L, Z_NULL, 0)*/;
31379           //=== CRC2(state.check, hold);
31380           hbuf[0] = hold & 0xff;
31381           hbuf[1] = (hold >>> 8) & 0xff;
31382           state.check = crc32(state.check, hbuf, 2, 0);
31383           //===//
31385           //=== INITBITS();
31386           hold = 0;
31387           bits = 0;
31388           //===//
31389           state.mode = FLAGS;
31390           break;
31391         }
31392         state.flags = 0;           /* expect zlib header */
31393         if (state.head) {
31394           state.head.done = false;
31395         }
31396         if (!(state.wrap & 1) ||   /* check if zlib header allowed */
31397           (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
31398           strm.msg = 'incorrect header check';
31399           state.mode = BAD;
31400           break;
31401         }
31402         if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
31403           strm.msg = 'unknown compression method';
31404           state.mode = BAD;
31405           break;
31406         }
31407         //--- DROPBITS(4) ---//
31408         hold >>>= 4;
31409         bits -= 4;
31410         //---//
31411         len = (hold & 0x0f)/*BITS(4)*/ + 8;
31412         if (state.wbits === 0) {
31413           state.wbits = len;
31414         }
31415         else if (len > state.wbits) {
31416           strm.msg = 'invalid window size';
31417           state.mode = BAD;
31418           break;
31419         }
31420         state.dmax = 1 << len;
31421         //Tracev((stderr, "inflate:   zlib header ok\n"));
31422         strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
31423         state.mode = hold & 0x200 ? DICTID : TYPE;
31424         //=== INITBITS();
31425         hold = 0;
31426         bits = 0;
31427         //===//
31428         break;
31429       case FLAGS:
31430         //=== NEEDBITS(16); */
31431         while (bits < 16) {
31432           if (have === 0) { break inf_leave; }
31433           have--;
31434           hold += input[next++] << bits;
31435           bits += 8;
31436         }
31437         //===//
31438         state.flags = hold;
31439         if ((state.flags & 0xff) !== Z_DEFLATED) {
31440           strm.msg = 'unknown compression method';
31441           state.mode = BAD;
31442           break;
31443         }
31444         if (state.flags & 0xe000) {
31445           strm.msg = 'unknown header flags set';
31446           state.mode = BAD;
31447           break;
31448         }
31449         if (state.head) {
31450           state.head.text = ((hold >> 8) & 1);
31451         }
31452         if (state.flags & 0x0200) {
31453           //=== CRC2(state.check, hold);
31454           hbuf[0] = hold & 0xff;
31455           hbuf[1] = (hold >>> 8) & 0xff;
31456           state.check = crc32(state.check, hbuf, 2, 0);
31457           //===//
31458         }
31459         //=== INITBITS();
31460         hold = 0;
31461         bits = 0;
31462         //===//
31463         state.mode = TIME;
31464         /* falls through */
31465       case TIME:
31466         //=== NEEDBITS(32); */
31467         while (bits < 32) {
31468           if (have === 0) { break inf_leave; }
31469           have--;
31470           hold += input[next++] << bits;
31471           bits += 8;
31472         }
31473         //===//
31474         if (state.head) {
31475           state.head.time = hold;
31476         }
31477         if (state.flags & 0x0200) {
31478           //=== CRC4(state.check, hold)
31479           hbuf[0] = hold & 0xff;
31480           hbuf[1] = (hold >>> 8) & 0xff;
31481           hbuf[2] = (hold >>> 16) & 0xff;
31482           hbuf[3] = (hold >>> 24) & 0xff;
31483           state.check = crc32(state.check, hbuf, 4, 0);
31484           //===
31485         }
31486         //=== INITBITS();
31487         hold = 0;
31488         bits = 0;
31489         //===//
31490         state.mode = OS;
31491         /* falls through */
31492       case OS:
31493         //=== NEEDBITS(16); */
31494         while (bits < 16) {
31495           if (have === 0) { break inf_leave; }
31496           have--;
31497           hold += input[next++] << bits;
31498           bits += 8;
31499         }
31500         //===//
31501         if (state.head) {
31502           state.head.xflags = (hold & 0xff);
31503           state.head.os = (hold >> 8);
31504         }
31505         if (state.flags & 0x0200) {
31506           //=== CRC2(state.check, hold);
31507           hbuf[0] = hold & 0xff;
31508           hbuf[1] = (hold >>> 8) & 0xff;
31509           state.check = crc32(state.check, hbuf, 2, 0);
31510           //===//
31511         }
31512         //=== INITBITS();
31513         hold = 0;
31514         bits = 0;
31515         //===//
31516         state.mode = EXLEN;
31517         /* falls through */
31518       case EXLEN:
31519         if (state.flags & 0x0400) {
31520           //=== NEEDBITS(16); */
31521           while (bits < 16) {
31522             if (have === 0) { break inf_leave; }
31523             have--;
31524             hold += input[next++] << bits;
31525             bits += 8;
31526           }
31527           //===//
31528           state.length = hold;
31529           if (state.head) {
31530             state.head.extra_len = hold;
31531           }
31532           if (state.flags & 0x0200) {
31533             //=== CRC2(state.check, hold);
31534             hbuf[0] = hold & 0xff;
31535             hbuf[1] = (hold >>> 8) & 0xff;
31536             state.check = crc32(state.check, hbuf, 2, 0);
31537             //===//
31538           }
31539           //=== INITBITS();
31540           hold = 0;
31541           bits = 0;
31542           //===//
31543         }
31544         else if (state.head) {
31545           state.head.extra = null/*Z_NULL*/;
31546         }
31547         state.mode = EXTRA;
31548         /* falls through */
31549       case EXTRA:
31550         if (state.flags & 0x0400) {
31551           copy = state.length;
31552           if (copy > have) { copy = have; }
31553           if (copy) {
31554             if (state.head) {
31555               len = state.head.extra_len - state.length;
31556               if (!state.head.extra) {
31557                 // Use untyped array for more convenient processing later
31558                 state.head.extra = new Array(state.head.extra_len);
31559               }
31560               utils.arraySet(
31561                 state.head.extra,
31562                 input,
31563                 next,
31564                 // extra field is limited to 65536 bytes
31565                 // - no need for additional size check
31566                 copy,
31567                 /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
31568                 len
31569               );
31570               //zmemcpy(state.head.extra + len, next,
31571               //        len + copy > state.head.extra_max ?
31572               //        state.head.extra_max - len : copy);
31573             }
31574             if (state.flags & 0x0200) {
31575               state.check = crc32(state.check, input, copy, next);
31576             }
31577             have -= copy;
31578             next += copy;
31579             state.length -= copy;
31580           }
31581           if (state.length) { break inf_leave; }
31582         }
31583         state.length = 0;
31584         state.mode = NAME;
31585         /* falls through */
31586       case NAME:
31587         if (state.flags & 0x0800) {
31588           if (have === 0) { break inf_leave; }
31589           copy = 0;
31590           do {
31591             // TODO: 2 or 1 bytes?
31592             len = input[next + copy++];
31593             /* use constant limit because in js we should not preallocate memory */
31594             if (state.head && len &&
31595                 (state.length < 65536 /*state.head.name_max*/)) {
31596               state.head.name += String.fromCharCode(len);
31597             }
31598           } while (len && copy < have);
31600           if (state.flags & 0x0200) {
31601             state.check = crc32(state.check, input, copy, next);
31602           }
31603           have -= copy;
31604           next += copy;
31605           if (len) { break inf_leave; }
31606         }
31607         else if (state.head) {
31608           state.head.name = null;
31609         }
31610         state.length = 0;
31611         state.mode = COMMENT;
31612         /* falls through */
31613       case COMMENT:
31614         if (state.flags & 0x1000) {
31615           if (have === 0) { break inf_leave; }
31616           copy = 0;
31617           do {
31618             len = input[next + copy++];
31619             /* use constant limit because in js we should not preallocate memory */
31620             if (state.head && len &&
31621                 (state.length < 65536 /*state.head.comm_max*/)) {
31622               state.head.comment += String.fromCharCode(len);
31623             }
31624           } while (len && copy < have);
31625           if (state.flags & 0x0200) {
31626             state.check = crc32(state.check, input, copy, next);
31627           }
31628           have -= copy;
31629           next += copy;
31630           if (len) { break inf_leave; }
31631         }
31632         else if (state.head) {
31633           state.head.comment = null;
31634         }
31635         state.mode = HCRC;
31636         /* falls through */
31637       case HCRC:
31638         if (state.flags & 0x0200) {
31639           //=== NEEDBITS(16); */
31640           while (bits < 16) {
31641             if (have === 0) { break inf_leave; }
31642             have--;
31643             hold += input[next++] << bits;
31644             bits += 8;
31645           }
31646           //===//
31647           if (hold !== (state.check & 0xffff)) {
31648             strm.msg = 'header crc mismatch';
31649             state.mode = BAD;
31650             break;
31651           }
31652           //=== INITBITS();
31653           hold = 0;
31654           bits = 0;
31655           //===//
31656         }
31657         if (state.head) {
31658           state.head.hcrc = ((state.flags >> 9) & 1);
31659           state.head.done = true;
31660         }
31661         strm.adler = state.check = 0;
31662         state.mode = TYPE;
31663         break;
31664       case DICTID:
31665         //=== NEEDBITS(32); */
31666         while (bits < 32) {
31667           if (have === 0) { break inf_leave; }
31668           have--;
31669           hold += input[next++] << bits;
31670           bits += 8;
31671         }
31672         //===//
31673         strm.adler = state.check = zswap32(hold);
31674         //=== INITBITS();
31675         hold = 0;
31676         bits = 0;
31677         //===//
31678         state.mode = DICT;
31679         /* falls through */
31680       case DICT:
31681         if (state.havedict === 0) {
31682           //--- RESTORE() ---
31683           strm.next_out = put;
31684           strm.avail_out = left;
31685           strm.next_in = next;
31686           strm.avail_in = have;
31687           state.hold = hold;
31688           state.bits = bits;
31689           //---
31690           return Z_NEED_DICT;
31691         }
31692         strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
31693         state.mode = TYPE;
31694         /* falls through */
31695       case TYPE:
31696         if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
31697         /* falls through */
31698       case TYPEDO:
31699         if (state.last) {
31700           //--- BYTEBITS() ---//
31701           hold >>>= bits & 7;
31702           bits -= bits & 7;
31703           //---//
31704           state.mode = CHECK;
31705           break;
31706         }
31707         //=== NEEDBITS(3); */
31708         while (bits < 3) {
31709           if (have === 0) { break inf_leave; }
31710           have--;
31711           hold += input[next++] << bits;
31712           bits += 8;
31713         }
31714         //===//
31715         state.last = (hold & 0x01)/*BITS(1)*/;
31716         //--- DROPBITS(1) ---//
31717         hold >>>= 1;
31718         bits -= 1;
31719         //---//
31721         switch ((hold & 0x03)/*BITS(2)*/) {
31722           case 0:                             /* stored block */
31723             //Tracev((stderr, "inflate:     stored block%s\n",
31724             //        state.last ? " (last)" : ""));
31725             state.mode = STORED;
31726             break;
31727           case 1:                             /* fixed block */
31728             fixedtables(state);
31729             //Tracev((stderr, "inflate:     fixed codes block%s\n",
31730             //        state.last ? " (last)" : ""));
31731             state.mode = LEN_;             /* decode codes */
31732             if (flush === Z_TREES) {
31733               //--- DROPBITS(2) ---//
31734               hold >>>= 2;
31735               bits -= 2;
31736               //---//
31737               break inf_leave;
31738             }
31739             break;
31740           case 2:                             /* dynamic block */
31741             //Tracev((stderr, "inflate:     dynamic codes block%s\n",
31742             //        state.last ? " (last)" : ""));
31743             state.mode = TABLE;
31744             break;
31745           case 3:
31746             strm.msg = 'invalid block type';
31747             state.mode = BAD;
31748         }
31749         //--- DROPBITS(2) ---//
31750         hold >>>= 2;
31751         bits -= 2;
31752         //---//
31753         break;
31754       case STORED:
31755         //--- BYTEBITS() ---// /* go to byte boundary */
31756         hold >>>= bits & 7;
31757         bits -= bits & 7;
31758         //---//
31759         //=== NEEDBITS(32); */
31760         while (bits < 32) {
31761           if (have === 0) { break inf_leave; }
31762           have--;
31763           hold += input[next++] << bits;
31764           bits += 8;
31765         }
31766         //===//
31767         if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
31768           strm.msg = 'invalid stored block lengths';
31769           state.mode = BAD;
31770           break;
31771         }
31772         state.length = hold & 0xffff;
31773         //Tracev((stderr, "inflate:       stored length %u\n",
31774         //        state.length));
31775         //=== INITBITS();
31776         hold = 0;
31777         bits = 0;
31778         //===//
31779         state.mode = COPY_;
31780         if (flush === Z_TREES) { break inf_leave; }
31781         /* falls through */
31782       case COPY_:
31783         state.mode = COPY;
31784         /* falls through */
31785       case COPY:
31786         copy = state.length;
31787         if (copy) {
31788           if (copy > have) { copy = have; }
31789           if (copy > left) { copy = left; }
31790           if (copy === 0) { break inf_leave; }
31791           //--- zmemcpy(put, next, copy); ---
31792           utils.arraySet(output, input, next, copy, put);
31793           //---//
31794           have -= copy;
31795           next += copy;
31796           left -= copy;
31797           put += copy;
31798           state.length -= copy;
31799           break;
31800         }
31801         //Tracev((stderr, "inflate:       stored end\n"));
31802         state.mode = TYPE;
31803         break;
31804       case TABLE:
31805         //=== NEEDBITS(14); */
31806         while (bits < 14) {
31807           if (have === 0) { break inf_leave; }
31808           have--;
31809           hold += input[next++] << bits;
31810           bits += 8;
31811         }
31812         //===//
31813         state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
31814         //--- DROPBITS(5) ---//
31815         hold >>>= 5;
31816         bits -= 5;
31817         //---//
31818         state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
31819         //--- DROPBITS(5) ---//
31820         hold >>>= 5;
31821         bits -= 5;
31822         //---//
31823         state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
31824         //--- DROPBITS(4) ---//
31825         hold >>>= 4;
31826         bits -= 4;
31827         //---//
31828 //#ifndef PKZIP_BUG_WORKAROUND
31829         if (state.nlen > 286 || state.ndist > 30) {
31830           strm.msg = 'too many length or distance symbols';
31831           state.mode = BAD;
31832           break;
31833         }
31834 //#endif
31835         //Tracev((stderr, "inflate:       table sizes ok\n"));
31836         state.have = 0;
31837         state.mode = LENLENS;
31838         /* falls through */
31839       case LENLENS:
31840         while (state.have < state.ncode) {
31841           //=== NEEDBITS(3);
31842           while (bits < 3) {
31843             if (have === 0) { break inf_leave; }
31844             have--;
31845             hold += input[next++] << bits;
31846             bits += 8;
31847           }
31848           //===//
31849           state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
31850           //--- DROPBITS(3) ---//
31851           hold >>>= 3;
31852           bits -= 3;
31853           //---//
31854         }
31855         while (state.have < 19) {
31856           state.lens[order[state.have++]] = 0;
31857         }
31858         // We have separate tables & no pointers. 2 commented lines below not needed.
31859         //state.next = state.codes;
31860         //state.lencode = state.next;
31861         // Switch to use dynamic table
31862         state.lencode = state.lendyn;
31863         state.lenbits = 7;
31865         opts = { bits: state.lenbits };
31866         ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
31867         state.lenbits = opts.bits;
31869         if (ret) {
31870           strm.msg = 'invalid code lengths set';
31871           state.mode = BAD;
31872           break;
31873         }
31874         //Tracev((stderr, "inflate:       code lengths ok\n"));
31875         state.have = 0;
31876         state.mode = CODELENS;
31877         /* falls through */
31878       case CODELENS:
31879         while (state.have < state.nlen + state.ndist) {
31880           for (;;) {
31881             here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
31882             here_bits = here >>> 24;
31883             here_op = (here >>> 16) & 0xff;
31884             here_val = here & 0xffff;
31886             if ((here_bits) <= bits) { break; }
31887             //--- PULLBYTE() ---//
31888             if (have === 0) { break inf_leave; }
31889             have--;
31890             hold += input[next++] << bits;
31891             bits += 8;
31892             //---//
31893           }
31894           if (here_val < 16) {
31895             //--- DROPBITS(here.bits) ---//
31896             hold >>>= here_bits;
31897             bits -= here_bits;
31898             //---//
31899             state.lens[state.have++] = here_val;
31900           }
31901           else {
31902             if (here_val === 16) {
31903               //=== NEEDBITS(here.bits + 2);
31904               n = here_bits + 2;
31905               while (bits < n) {
31906                 if (have === 0) { break inf_leave; }
31907                 have--;
31908                 hold += input[next++] << bits;
31909                 bits += 8;
31910               }
31911               //===//
31912               //--- DROPBITS(here.bits) ---//
31913               hold >>>= here_bits;
31914               bits -= here_bits;
31915               //---//
31916               if (state.have === 0) {
31917                 strm.msg = 'invalid bit length repeat';
31918                 state.mode = BAD;
31919                 break;
31920               }
31921               len = state.lens[state.have - 1];
31922               copy = 3 + (hold & 0x03);//BITS(2);
31923               //--- DROPBITS(2) ---//
31924               hold >>>= 2;
31925               bits -= 2;
31926               //---//
31927             }
31928             else if (here_val === 17) {
31929               //=== NEEDBITS(here.bits + 3);
31930               n = here_bits + 3;
31931               while (bits < n) {
31932                 if (have === 0) { break inf_leave; }
31933                 have--;
31934                 hold += input[next++] << bits;
31935                 bits += 8;
31936               }
31937               //===//
31938               //--- DROPBITS(here.bits) ---//
31939               hold >>>= here_bits;
31940               bits -= here_bits;
31941               //---//
31942               len = 0;
31943               copy = 3 + (hold & 0x07);//BITS(3);
31944               //--- DROPBITS(3) ---//
31945               hold >>>= 3;
31946               bits -= 3;
31947               //---//
31948             }
31949             else {
31950               //=== NEEDBITS(here.bits + 7);
31951               n = here_bits + 7;
31952               while (bits < n) {
31953                 if (have === 0) { break inf_leave; }
31954                 have--;
31955                 hold += input[next++] << bits;
31956                 bits += 8;
31957               }
31958               //===//
31959               //--- DROPBITS(here.bits) ---//
31960               hold >>>= here_bits;
31961               bits -= here_bits;
31962               //---//
31963               len = 0;
31964               copy = 11 + (hold & 0x7f);//BITS(7);
31965               //--- DROPBITS(7) ---//
31966               hold >>>= 7;
31967               bits -= 7;
31968               //---//
31969             }
31970             if (state.have + copy > state.nlen + state.ndist) {
31971               strm.msg = 'invalid bit length repeat';
31972               state.mode = BAD;
31973               break;
31974             }
31975             while (copy--) {
31976               state.lens[state.have++] = len;
31977             }
31978           }
31979         }
31981         /* handle error breaks in while */
31982         if (state.mode === BAD) { break; }
31984         /* check for end-of-block code (better have one) */
31985         if (state.lens[256] === 0) {
31986           strm.msg = 'invalid code -- missing end-of-block';
31987           state.mode = BAD;
31988           break;
31989         }
31991         /* build code tables -- note: do not change the lenbits or distbits
31992            values here (9 and 6) without reading the comments in inftrees.h
31993            concerning the ENOUGH constants, which depend on those values */
31994         state.lenbits = 9;
31996         opts = { bits: state.lenbits };
31997         ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
31998         // We have separate tables & no pointers. 2 commented lines below not needed.
31999         // state.next_index = opts.table_index;
32000         state.lenbits = opts.bits;
32001         // state.lencode = state.next;
32003         if (ret) {
32004           strm.msg = 'invalid literal/lengths set';
32005           state.mode = BAD;
32006           break;
32007         }
32009         state.distbits = 6;
32010         //state.distcode.copy(state.codes);
32011         // Switch to use dynamic table
32012         state.distcode = state.distdyn;
32013         opts = { bits: state.distbits };
32014         ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
32015         // We have separate tables & no pointers. 2 commented lines below not needed.
32016         // state.next_index = opts.table_index;
32017         state.distbits = opts.bits;
32018         // state.distcode = state.next;
32020         if (ret) {
32021           strm.msg = 'invalid distances set';
32022           state.mode = BAD;
32023           break;
32024         }
32025         //Tracev((stderr, 'inflate:       codes ok\n'));
32026         state.mode = LEN_;
32027         if (flush === Z_TREES) { break inf_leave; }
32028         /* falls through */
32029       case LEN_:
32030         state.mode = LEN;
32031         /* falls through */
32032       case LEN:
32033         if (have >= 6 && left >= 258) {
32034           //--- RESTORE() ---
32035           strm.next_out = put;
32036           strm.avail_out = left;
32037           strm.next_in = next;
32038           strm.avail_in = have;
32039           state.hold = hold;
32040           state.bits = bits;
32041           //---
32042           inflate_fast(strm, _out);
32043           //--- LOAD() ---
32044           put = strm.next_out;
32045           output = strm.output;
32046           left = strm.avail_out;
32047           next = strm.next_in;
32048           input = strm.input;
32049           have = strm.avail_in;
32050           hold = state.hold;
32051           bits = state.bits;
32052           //---
32054           if (state.mode === TYPE) {
32055             state.back = -1;
32056           }
32057           break;
32058         }
32059         state.back = 0;
32060         for (;;) {
32061           here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/
32062           here_bits = here >>> 24;
32063           here_op = (here >>> 16) & 0xff;
32064           here_val = here & 0xffff;
32066           if (here_bits <= bits) { break; }
32067           //--- PULLBYTE() ---//
32068           if (have === 0) { break inf_leave; }
32069           have--;
32070           hold += input[next++] << bits;
32071           bits += 8;
32072           //---//
32073         }
32074         if (here_op && (here_op & 0xf0) === 0) {
32075           last_bits = here_bits;
32076           last_op = here_op;
32077           last_val = here_val;
32078           for (;;) {
32079             here = state.lencode[last_val +
32080                     ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
32081             here_bits = here >>> 24;
32082             here_op = (here >>> 16) & 0xff;
32083             here_val = here & 0xffff;
32085             if ((last_bits + here_bits) <= bits) { break; }
32086             //--- PULLBYTE() ---//
32087             if (have === 0) { break inf_leave; }
32088             have--;
32089             hold += input[next++] << bits;
32090             bits += 8;
32091             //---//
32092           }
32093           //--- DROPBITS(last.bits) ---//
32094           hold >>>= last_bits;
32095           bits -= last_bits;
32096           //---//
32097           state.back += last_bits;
32098         }
32099         //--- DROPBITS(here.bits) ---//
32100         hold >>>= here_bits;
32101         bits -= here_bits;
32102         //---//
32103         state.back += here_bits;
32104         state.length = here_val;
32105         if (here_op === 0) {
32106           //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
32107           //        "inflate:         literal '%c'\n" :
32108           //        "inflate:         literal 0x%02x\n", here.val));
32109           state.mode = LIT;
32110           break;
32111         }
32112         if (here_op & 32) {
32113           //Tracevv((stderr, "inflate:         end of block\n"));
32114           state.back = -1;
32115           state.mode = TYPE;
32116           break;
32117         }
32118         if (here_op & 64) {
32119           strm.msg = 'invalid literal/length code';
32120           state.mode = BAD;
32121           break;
32122         }
32123         state.extra = here_op & 15;
32124         state.mode = LENEXT;
32125         /* falls through */
32126       case LENEXT:
32127         if (state.extra) {
32128           //=== NEEDBITS(state.extra);
32129           n = state.extra;
32130           while (bits < n) {
32131             if (have === 0) { break inf_leave; }
32132             have--;
32133             hold += input[next++] << bits;
32134             bits += 8;
32135           }
32136           //===//
32137           state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
32138           //--- DROPBITS(state.extra) ---//
32139           hold >>>= state.extra;
32140           bits -= state.extra;
32141           //---//
32142           state.back += state.extra;
32143         }
32144         //Tracevv((stderr, "inflate:         length %u\n", state.length));
32145         state.was = state.length;
32146         state.mode = DIST;
32147         /* falls through */
32148       case DIST:
32149         for (;;) {
32150           here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/
32151           here_bits = here >>> 24;
32152           here_op = (here >>> 16) & 0xff;
32153           here_val = here & 0xffff;
32155           if ((here_bits) <= bits) { break; }
32156           //--- PULLBYTE() ---//
32157           if (have === 0) { break inf_leave; }
32158           have--;
32159           hold += input[next++] << bits;
32160           bits += 8;
32161           //---//
32162         }
32163         if ((here_op & 0xf0) === 0) {
32164           last_bits = here_bits;
32165           last_op = here_op;
32166           last_val = here_val;
32167           for (;;) {
32168             here = state.distcode[last_val +
32169                     ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
32170             here_bits = here >>> 24;
32171             here_op = (here >>> 16) & 0xff;
32172             here_val = here & 0xffff;
32174             if ((last_bits + here_bits) <= bits) { break; }
32175             //--- PULLBYTE() ---//
32176             if (have === 0) { break inf_leave; }
32177             have--;
32178             hold += input[next++] << bits;
32179             bits += 8;
32180             //---//
32181           }
32182           //--- DROPBITS(last.bits) ---//
32183           hold >>>= last_bits;
32184           bits -= last_bits;
32185           //---//
32186           state.back += last_bits;
32187         }
32188         //--- DROPBITS(here.bits) ---//
32189         hold >>>= here_bits;
32190         bits -= here_bits;
32191         //---//
32192         state.back += here_bits;
32193         if (here_op & 64) {
32194           strm.msg = 'invalid distance code';
32195           state.mode = BAD;
32196           break;
32197         }
32198         state.offset = here_val;
32199         state.extra = (here_op) & 15;
32200         state.mode = DISTEXT;
32201         /* falls through */
32202       case DISTEXT:
32203         if (state.extra) {
32204           //=== NEEDBITS(state.extra);
32205           n = state.extra;
32206           while (bits < n) {
32207             if (have === 0) { break inf_leave; }
32208             have--;
32209             hold += input[next++] << bits;
32210             bits += 8;
32211           }
32212           //===//
32213           state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
32214           //--- DROPBITS(state.extra) ---//
32215           hold >>>= state.extra;
32216           bits -= state.extra;
32217           //---//
32218           state.back += state.extra;
32219         }
32220 //#ifdef INFLATE_STRICT
32221         if (state.offset > state.dmax) {
32222           strm.msg = 'invalid distance too far back';
32223           state.mode = BAD;
32224           break;
32225         }
32226 //#endif
32227         //Tracevv((stderr, "inflate:         distance %u\n", state.offset));
32228         state.mode = MATCH;
32229         /* falls through */
32230       case MATCH:
32231         if (left === 0) { break inf_leave; }
32232         copy = _out - left;
32233         if (state.offset > copy) {         /* copy from window */
32234           copy = state.offset - copy;
32235           if (copy > state.whave) {
32236             if (state.sane) {
32237               strm.msg = 'invalid distance too far back';
32238               state.mode = BAD;
32239               break;
32240             }
32241 // (!) This block is disabled in zlib defaults,
32242 // don't enable it for binary compatibility
32243 //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
32244 //          Trace((stderr, "inflate.c too far\n"));
32245 //          copy -= state.whave;
32246 //          if (copy > state.length) { copy = state.length; }
32247 //          if (copy > left) { copy = left; }
32248 //          left -= copy;
32249 //          state.length -= copy;
32250 //          do {
32251 //            output[put++] = 0;
32252 //          } while (--copy);
32253 //          if (state.length === 0) { state.mode = LEN; }
32254 //          break;
32255 //#endif
32256           }
32257           if (copy > state.wnext) {
32258             copy -= state.wnext;
32259             from = state.wsize - copy;
32260           }
32261           else {
32262             from = state.wnext - copy;
32263           }
32264           if (copy > state.length) { copy = state.length; }
32265           from_source = state.window;
32266         }
32267         else {                              /* copy from output */
32268           from_source = output;
32269           from = put - state.offset;
32270           copy = state.length;
32271         }
32272         if (copy > left) { copy = left; }
32273         left -= copy;
32274         state.length -= copy;
32275         do {
32276           output[put++] = from_source[from++];
32277         } while (--copy);
32278         if (state.length === 0) { state.mode = LEN; }
32279         break;
32280       case LIT:
32281         if (left === 0) { break inf_leave; }
32282         output[put++] = state.length;
32283         left--;
32284         state.mode = LEN;
32285         break;
32286       case CHECK:
32287         if (state.wrap) {
32288           //=== NEEDBITS(32);
32289           while (bits < 32) {
32290             if (have === 0) { break inf_leave; }
32291             have--;
32292             // Use '|' instead of '+' to make sure that result is signed
32293             hold |= input[next++] << bits;
32294             bits += 8;
32295           }
32296           //===//
32297           _out -= left;
32298           strm.total_out += _out;
32299           state.total += _out;
32300           if (_out) {
32301             strm.adler = state.check =
32302                 /*UPDATE(state.check, put - _out, _out);*/
32303                 (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
32305           }
32306           _out = left;
32307           // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too
32308           if ((state.flags ? hold : zswap32(hold)) !== state.check) {
32309             strm.msg = 'incorrect data check';
32310             state.mode = BAD;
32311             break;
32312           }
32313           //=== INITBITS();
32314           hold = 0;
32315           bits = 0;
32316           //===//
32317           //Tracev((stderr, "inflate:   check matches trailer\n"));
32318         }
32319         state.mode = LENGTH;
32320         /* falls through */
32321       case LENGTH:
32322         if (state.wrap && state.flags) {
32323           //=== NEEDBITS(32);
32324           while (bits < 32) {
32325             if (have === 0) { break inf_leave; }
32326             have--;
32327             hold += input[next++] << bits;
32328             bits += 8;
32329           }
32330           //===//
32331           if (hold !== (state.total & 0xffffffff)) {
32332             strm.msg = 'incorrect length check';
32333             state.mode = BAD;
32334             break;
32335           }
32336           //=== INITBITS();
32337           hold = 0;
32338           bits = 0;
32339           //===//
32340           //Tracev((stderr, "inflate:   length matches trailer\n"));
32341         }
32342         state.mode = DONE;
32343         /* falls through */
32344       case DONE:
32345         ret = Z_STREAM_END;
32346         break inf_leave;
32347       case BAD:
32348         ret = Z_DATA_ERROR;
32349         break inf_leave;
32350       case MEM:
32351         return Z_MEM_ERROR;
32352       case SYNC:
32353         /* falls through */
32354       default:
32355         return Z_STREAM_ERROR;
32356     }
32357   }
32359   // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
32361   /*
32362      Return from inflate(), updating the total counts and the check value.
32363      If there was no progress during the inflate() call, return a buffer
32364      error.  Call updatewindow() to create and/or update the window state.
32365      Note: a memory error from inflate() is non-recoverable.
32366    */
32368   //--- RESTORE() ---
32369   strm.next_out = put;
32370   strm.avail_out = left;
32371   strm.next_in = next;
32372   strm.avail_in = have;
32373   state.hold = hold;
32374   state.bits = bits;
32375   //---
32377   if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
32378                       (state.mode < CHECK || flush !== Z_FINISH))) {
32379     if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
32380       state.mode = MEM;
32381       return Z_MEM_ERROR;
32382     }
32383   }
32384   _in -= strm.avail_in;
32385   _out -= strm.avail_out;
32386   strm.total_in += _in;
32387   strm.total_out += _out;
32388   state.total += _out;
32389   if (state.wrap && _out) {
32390     strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
32391       (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
32392   }
32393   strm.data_type = state.bits + (state.last ? 64 : 0) +
32394                     (state.mode === TYPE ? 128 : 0) +
32395                     (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
32396   if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
32397     ret = Z_BUF_ERROR;
32398   }
32399   return ret;
32402 function inflateEnd(strm) {
32404   if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
32405     return Z_STREAM_ERROR;
32406   }
32408   var state = strm.state;
32409   if (state.window) {
32410     state.window = null;
32411   }
32412   strm.state = null;
32413   return Z_OK;
32416 function inflateGetHeader(strm, head) {
32417   var state;
32419   /* check state */
32420   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
32421   state = strm.state;
32422   if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
32424   /* save header structure */
32425   state.head = head;
32426   head.done = false;
32427   return Z_OK;
32430 function inflateSetDictionary(strm, dictionary) {
32431   var dictLength = dictionary.length;
32433   var state;
32434   var dictid;
32435   var ret;
32437   /* check state */
32438   if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }
32439   state = strm.state;
32441   if (state.wrap !== 0 && state.mode !== DICT) {
32442     return Z_STREAM_ERROR;
32443   }
32445   /* check for correct dictionary identifier */
32446   if (state.mode === DICT) {
32447     dictid = 1; /* adler32(0, null, 0)*/
32448     /* dictid = adler32(dictid, dictionary, dictLength); */
32449     dictid = adler32(dictid, dictionary, dictLength, 0);
32450     if (dictid !== state.check) {
32451       return Z_DATA_ERROR;
32452     }
32453   }
32454   /* copy dictionary to window using updatewindow(), which will amend the
32455    existing dictionary if appropriate */
32456   ret = updatewindow(strm, dictionary, dictLength, dictLength);
32457   if (ret) {
32458     state.mode = MEM;
32459     return Z_MEM_ERROR;
32460   }
32461   state.havedict = 1;
32462   // Tracev((stderr, "inflate:   dictionary set\n"));
32463   return Z_OK;
32466 exports.inflateReset = inflateReset;
32467 exports.inflateReset2 = inflateReset2;
32468 exports.inflateResetKeep = inflateResetKeep;
32469 exports.inflateInit = inflateInit;
32470 exports.inflateInit2 = inflateInit2;
32471 exports.inflate = inflate;
32472 exports.inflateEnd = inflateEnd;
32473 exports.inflateGetHeader = inflateGetHeader;
32474 exports.inflateSetDictionary = inflateSetDictionary;
32475 exports.inflateInfo = 'pako inflate (from Nodeca project)';
32477 /* Not implemented
32478 exports.inflateCopy = inflateCopy;
32479 exports.inflateGetDictionary = inflateGetDictionary;
32480 exports.inflateMark = inflateMark;
32481 exports.inflatePrime = inflatePrime;
32482 exports.inflateSync = inflateSync;
32483 exports.inflateSyncPoint = inflateSyncPoint;
32484 exports.inflateUndermine = inflateUndermine;
32488 /***/ }),
32489 /* 158 */
32490 /***/ (function(module, exports, __webpack_require__) {
32492 "use strict";
32495 // (C) 1995-2013 Jean-loup Gailly and Mark Adler
32496 // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
32498 // This software is provided 'as-is', without any express or implied
32499 // warranty. In no event will the authors be held liable for any damages
32500 // arising from the use of this software.
32502 // Permission is granted to anyone to use this software for any purpose,
32503 // including commercial applications, and to alter it and redistribute it
32504 // freely, subject to the following restrictions:
32506 // 1. The origin of this software must not be misrepresented; you must not
32507 //   claim that you wrote the original software. If you use this software
32508 //   in a product, an acknowledgment in the product documentation would be
32509 //   appreciated but is not required.
32510 // 2. Altered source versions must be plainly marked as such, and must not be
32511 //   misrepresented as being the original software.
32512 // 3. This notice may not be removed or altered from any source distribution.
32514 // See state defs from inflate.js
32515 var BAD = 30;       /* got a data error -- remain here until reset */
32516 var TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
32519    Decode literal, length, and distance codes and write out the resulting
32520    literal and match bytes until either not enough input or output is
32521    available, an end-of-block is encountered, or a data error is encountered.
32522    When large enough input and output buffers are supplied to inflate(), for
32523    example, a 16K input buffer and a 64K output buffer, more than 95% of the
32524    inflate execution time is spent in this routine.
32526    Entry assumptions:
32528         state.mode === LEN
32529         strm.avail_in >= 6
32530         strm.avail_out >= 258
32531         start >= strm.avail_out
32532         state.bits < 8
32534    On return, state.mode is one of:
32536         LEN -- ran out of enough output space or enough available input
32537         TYPE -- reached end of block code, inflate() to interpret next block
32538         BAD -- error in block data
32540    Notes:
32542     - The maximum input bits used by a length/distance pair is 15 bits for the
32543       length code, 5 bits for the length extra, 15 bits for the distance code,
32544       and 13 bits for the distance extra.  This totals 48 bits, or six bytes.
32545       Therefore if strm.avail_in >= 6, then there is enough input to avoid
32546       checking for available input while decoding.
32548     - The maximum bytes that a single length/distance pair can output is 258
32549       bytes, which is the maximum length that can be coded.  inflate_fast()
32550       requires strm.avail_out >= 258 for each loop to avoid checking for
32551       output space.
32552  */
32553 module.exports = function inflate_fast(strm, start) {
32554   var state;
32555   var _in;                    /* local strm.input */
32556   var last;                   /* have enough input while in < last */
32557   var _out;                   /* local strm.output */
32558   var beg;                    /* inflate()'s initial strm.output */
32559   var end;                    /* while out < end, enough space available */
32560 //#ifdef INFLATE_STRICT
32561   var dmax;                   /* maximum distance from zlib header */
32562 //#endif
32563   var wsize;                  /* window size or zero if not using window */
32564   var whave;                  /* valid bytes in the window */
32565   var wnext;                  /* window write index */
32566   // Use `s_window` instead `window`, avoid conflict with instrumentation tools
32567   var s_window;               /* allocated sliding window, if wsize != 0 */
32568   var hold;                   /* local strm.hold */
32569   var bits;                   /* local strm.bits */
32570   var lcode;                  /* local strm.lencode */
32571   var dcode;                  /* local strm.distcode */
32572   var lmask;                  /* mask for first level of length codes */
32573   var dmask;                  /* mask for first level of distance codes */
32574   var here;                   /* retrieved table entry */
32575   var op;                     /* code bits, operation, extra bits, or */
32576                               /*  window position, window bytes to copy */
32577   var len;                    /* match length, unused bytes */
32578   var dist;                   /* match distance */
32579   var from;                   /* where to copy match from */
32580   var from_source;
32583   var input, output; // JS specific, because we have no pointers
32585   /* copy state to local variables */
32586   state = strm.state;
32587   //here = state.here;
32588   _in = strm.next_in;
32589   input = strm.input;
32590   last = _in + (strm.avail_in - 5);
32591   _out = strm.next_out;
32592   output = strm.output;
32593   beg = _out - (start - strm.avail_out);
32594   end = _out + (strm.avail_out - 257);
32595 //#ifdef INFLATE_STRICT
32596   dmax = state.dmax;
32597 //#endif
32598   wsize = state.wsize;
32599   whave = state.whave;
32600   wnext = state.wnext;
32601   s_window = state.window;
32602   hold = state.hold;
32603   bits = state.bits;
32604   lcode = state.lencode;
32605   dcode = state.distcode;
32606   lmask = (1 << state.lenbits) - 1;
32607   dmask = (1 << state.distbits) - 1;
32610   /* decode literals and length/distances until end-of-block or not enough
32611      input data or output space */
32613   top:
32614   do {
32615     if (bits < 15) {
32616       hold += input[_in++] << bits;
32617       bits += 8;
32618       hold += input[_in++] << bits;
32619       bits += 8;
32620     }
32622     here = lcode[hold & lmask];
32624     dolen:
32625     for (;;) { // Goto emulation
32626       op = here >>> 24/*here.bits*/;
32627       hold >>>= op;
32628       bits -= op;
32629       op = (here >>> 16) & 0xff/*here.op*/;
32630       if (op === 0) {                          /* literal */
32631         //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
32632         //        "inflate:         literal '%c'\n" :
32633         //        "inflate:         literal 0x%02x\n", here.val));
32634         output[_out++] = here & 0xffff/*here.val*/;
32635       }
32636       else if (op & 16) {                     /* length base */
32637         len = here & 0xffff/*here.val*/;
32638         op &= 15;                           /* number of extra bits */
32639         if (op) {
32640           if (bits < op) {
32641             hold += input[_in++] << bits;
32642             bits += 8;
32643           }
32644           len += hold & ((1 << op) - 1);
32645           hold >>>= op;
32646           bits -= op;
32647         }
32648         //Tracevv((stderr, "inflate:         length %u\n", len));
32649         if (bits < 15) {
32650           hold += input[_in++] << bits;
32651           bits += 8;
32652           hold += input[_in++] << bits;
32653           bits += 8;
32654         }
32655         here = dcode[hold & dmask];
32657         dodist:
32658         for (;;) { // goto emulation
32659           op = here >>> 24/*here.bits*/;
32660           hold >>>= op;
32661           bits -= op;
32662           op = (here >>> 16) & 0xff/*here.op*/;
32664           if (op & 16) {                      /* distance base */
32665             dist = here & 0xffff/*here.val*/;
32666             op &= 15;                       /* number of extra bits */
32667             if (bits < op) {
32668               hold += input[_in++] << bits;
32669               bits += 8;
32670               if (bits < op) {
32671                 hold += input[_in++] << bits;
32672                 bits += 8;
32673               }
32674             }
32675             dist += hold & ((1 << op) - 1);
32676 //#ifdef INFLATE_STRICT
32677             if (dist > dmax) {
32678               strm.msg = 'invalid distance too far back';
32679               state.mode = BAD;
32680               break top;
32681             }
32682 //#endif
32683             hold >>>= op;
32684             bits -= op;
32685             //Tracevv((stderr, "inflate:         distance %u\n", dist));
32686             op = _out - beg;                /* max distance in output */
32687             if (dist > op) {                /* see if copy from window */
32688               op = dist - op;               /* distance back in window */
32689               if (op > whave) {
32690                 if (state.sane) {
32691                   strm.msg = 'invalid distance too far back';
32692                   state.mode = BAD;
32693                   break top;
32694                 }
32696 // (!) This block is disabled in zlib defaults,
32697 // don't enable it for binary compatibility
32698 //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
32699 //                if (len <= op - whave) {
32700 //                  do {
32701 //                    output[_out++] = 0;
32702 //                  } while (--len);
32703 //                  continue top;
32704 //                }
32705 //                len -= op - whave;
32706 //                do {
32707 //                  output[_out++] = 0;
32708 //                } while (--op > whave);
32709 //                if (op === 0) {
32710 //                  from = _out - dist;
32711 //                  do {
32712 //                    output[_out++] = output[from++];
32713 //                  } while (--len);
32714 //                  continue top;
32715 //                }
32716 //#endif
32717               }
32718               from = 0; // window index
32719               from_source = s_window;
32720               if (wnext === 0) {           /* very common case */
32721                 from += wsize - op;
32722                 if (op < len) {         /* some from window */
32723                   len -= op;
32724                   do {
32725                     output[_out++] = s_window[from++];
32726                   } while (--op);
32727                   from = _out - dist;  /* rest from output */
32728                   from_source = output;
32729                 }
32730               }
32731               else if (wnext < op) {      /* wrap around window */
32732                 from += wsize + wnext - op;
32733                 op -= wnext;
32734                 if (op < len) {         /* some from end of window */
32735                   len -= op;
32736                   do {
32737                     output[_out++] = s_window[from++];
32738                   } while (--op);
32739                   from = 0;
32740                   if (wnext < len) {  /* some from start of window */
32741                     op = wnext;
32742                     len -= op;
32743                     do {
32744                       output[_out++] = s_window[from++];
32745                     } while (--op);
32746                     from = _out - dist;      /* rest from output */
32747                     from_source = output;
32748                   }
32749                 }
32750               }
32751               else {                      /* contiguous in window */
32752                 from += wnext - op;
32753                 if (op < len) {         /* some from window */
32754                   len -= op;
32755                   do {
32756                     output[_out++] = s_window[from++];
32757                   } while (--op);
32758                   from = _out - dist;  /* rest from output */
32759                   from_source = output;
32760                 }
32761               }
32762               while (len > 2) {
32763                 output[_out++] = from_source[from++];
32764                 output[_out++] = from_source[from++];
32765                 output[_out++] = from_source[from++];
32766                 len -= 3;
32767               }
32768               if (len) {
32769                 output[_out++] = from_source[from++];
32770                 if (len > 1) {
32771                   output[_out++] = from_source[from++];
32772                 }
32773               }
32774             }
32775             else {
32776               from = _out - dist;          /* copy direct from output */
32777               do {                        /* minimum length is three */
32778                 output[_out++] = output[from++];
32779                 output[_out++] = output[from++];
32780                 output[_out++] = output[from++];
32781                 len -= 3;
32782               } while (len > 2);
32783               if (len) {
32784                 output[_out++] = output[from++];
32785                 if (len > 1) {
32786                   output[_out++] = output[from++];
32787                 }
32788               }
32789             }
32790           }
32791           else if ((op & 64) === 0) {          /* 2nd level distance code */
32792             here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
32793             continue dodist;
32794           }
32795           else {
32796             strm.msg = 'invalid distance code';
32797             state.mode = BAD;
32798             break top;
32799           }
32801           break; // need to emulate goto via "continue"
32802         }
32803       }
32804       else if ((op & 64) === 0) {              /* 2nd level length code */
32805         here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
32806         continue dolen;
32807       }
32808       else if (op & 32) {                     /* end-of-block */
32809         //Tracevv((stderr, "inflate:         end of block\n"));
32810         state.mode = TYPE;
32811         break top;
32812       }
32813       else {
32814         strm.msg = 'invalid literal/length code';
32815         state.mode = BAD;
32816         break top;
32817       }
32819       break; // need to emulate goto via "continue"
32820     }
32821   } while (_in < last && _out < end);
32823   /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
32824   len = bits >> 3;
32825   _in -= len;
32826   bits -= len << 3;
32827   hold &= (1 << bits) - 1;
32829   /* update state and return */
32830   strm.next_in = _in;
32831   strm.next_out = _out;
32832   strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
32833   strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
32834   state.hold = hold;
32835   state.bits = bits;
32836   return;
32840 /***/ }),
32841 /* 159 */
32842 /***/ (function(module, exports, __webpack_require__) {
32844 "use strict";
32847 // (C) 1995-2013 Jean-loup Gailly and Mark Adler
32848 // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
32850 // This software is provided 'as-is', without any express or implied
32851 // warranty. In no event will the authors be held liable for any damages
32852 // arising from the use of this software.
32854 // Permission is granted to anyone to use this software for any purpose,
32855 // including commercial applications, and to alter it and redistribute it
32856 // freely, subject to the following restrictions:
32858 // 1. The origin of this software must not be misrepresented; you must not
32859 //   claim that you wrote the original software. If you use this software
32860 //   in a product, an acknowledgment in the product documentation would be
32861 //   appreciated but is not required.
32862 // 2. Altered source versions must be plainly marked as such, and must not be
32863 //   misrepresented as being the original software.
32864 // 3. This notice may not be removed or altered from any source distribution.
32866 var utils = __webpack_require__(34);
32868 var MAXBITS = 15;
32869 var ENOUGH_LENS = 852;
32870 var ENOUGH_DISTS = 592;
32871 //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
32873 var CODES = 0;
32874 var LENS = 1;
32875 var DISTS = 2;
32877 var lbase = [ /* Length codes 257..285 base */
32878   3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
32879   35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
32882 var lext = [ /* Length codes 257..285 extra */
32883   16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
32884   19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
32887 var dbase = [ /* Distance codes 0..29 base */
32888   1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
32889   257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
32890   8193, 12289, 16385, 24577, 0, 0
32893 var dext = [ /* Distance codes 0..29 extra */
32894   16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
32895   23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
32896   28, 28, 29, 29, 64, 64
32899 module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
32901   var bits = opts.bits;
32902       //here = opts.here; /* table entry for duplication */
32904   var len = 0;               /* a code's length in bits */
32905   var sym = 0;               /* index of code symbols */
32906   var min = 0, max = 0;          /* minimum and maximum code lengths */
32907   var root = 0;              /* number of index bits for root table */
32908   var curr = 0;              /* number of index bits for current table */
32909   var drop = 0;              /* code bits to drop for sub-table */
32910   var left = 0;                   /* number of prefix codes available */
32911   var used = 0;              /* code entries in table used */
32912   var huff = 0;              /* Huffman code */
32913   var incr;              /* for incrementing code, index */
32914   var fill;              /* index for replicating entries */
32915   var low;               /* low bits for current root entry */
32916   var mask;              /* mask for low root bits */
32917   var next;             /* next available space in table */
32918   var base = null;     /* base value table to use */
32919   var base_index = 0;
32920 //  var shoextra;    /* extra bits table to use */
32921   var end;                    /* use base and extra for symbol > end */
32922   var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */
32923   var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */
32924   var extra = null;
32925   var extra_index = 0;
32927   var here_bits, here_op, here_val;
32929   /*
32930    Process a set of code lengths to create a canonical Huffman code.  The
32931    code lengths are lens[0..codes-1].  Each length corresponds to the
32932    symbols 0..codes-1.  The Huffman code is generated by first sorting the
32933    symbols by length from short to long, and retaining the symbol order
32934    for codes with equal lengths.  Then the code starts with all zero bits
32935    for the first code of the shortest length, and the codes are integer
32936    increments for the same length, and zeros are appended as the length
32937    increases.  For the deflate format, these bits are stored backwards
32938    from their more natural integer increment ordering, and so when the
32939    decoding tables are built in the large loop below, the integer codes
32940    are incremented backwards.
32942    This routine assumes, but does not check, that all of the entries in
32943    lens[] are in the range 0..MAXBITS.  The caller must assure this.
32944    1..MAXBITS is interpreted as that code length.  zero means that that
32945    symbol does not occur in this code.
32947    The codes are sorted by computing a count of codes for each length,
32948    creating from that a table of starting indices for each length in the
32949    sorted table, and then entering the symbols in order in the sorted
32950    table.  The sorted table is work[], with that space being provided by
32951    the caller.
32953    The length counts are used for other purposes as well, i.e. finding
32954    the minimum and maximum length codes, determining if there are any
32955    codes at all, checking for a valid set of lengths, and looking ahead
32956    at length counts to determine sub-table sizes when building the
32957    decoding tables.
32958    */
32960   /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
32961   for (len = 0; len <= MAXBITS; len++) {
32962     count[len] = 0;
32963   }
32964   for (sym = 0; sym < codes; sym++) {
32965     count[lens[lens_index + sym]]++;
32966   }
32968   /* bound code lengths, force root to be within code lengths */
32969   root = bits;
32970   for (max = MAXBITS; max >= 1; max--) {
32971     if (count[max] !== 0) { break; }
32972   }
32973   if (root > max) {
32974     root = max;
32975   }
32976   if (max === 0) {                     /* no symbols to code at all */
32977     //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */
32978     //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;
32979     //table.val[opts.table_index++] = 0;   //here.val = (var short)0;
32980     table[table_index++] = (1 << 24) | (64 << 16) | 0;
32983     //table.op[opts.table_index] = 64;
32984     //table.bits[opts.table_index] = 1;
32985     //table.val[opts.table_index++] = 0;
32986     table[table_index++] = (1 << 24) | (64 << 16) | 0;
32988     opts.bits = 1;
32989     return 0;     /* no symbols, but wait for decoding to report error */
32990   }
32991   for (min = 1; min < max; min++) {
32992     if (count[min] !== 0) { break; }
32993   }
32994   if (root < min) {
32995     root = min;
32996   }
32998   /* check for an over-subscribed or incomplete set of lengths */
32999   left = 1;
33000   for (len = 1; len <= MAXBITS; len++) {
33001     left <<= 1;
33002     left -= count[len];
33003     if (left < 0) {
33004       return -1;
33005     }        /* over-subscribed */
33006   }
33007   if (left > 0 && (type === CODES || max !== 1)) {
33008     return -1;                      /* incomplete set */
33009   }
33011   /* generate offsets into symbol table for each length for sorting */
33012   offs[1] = 0;
33013   for (len = 1; len < MAXBITS; len++) {
33014     offs[len + 1] = offs[len] + count[len];
33015   }
33017   /* sort symbols by length, by symbol order within each length */
33018   for (sym = 0; sym < codes; sym++) {
33019     if (lens[lens_index + sym] !== 0) {
33020       work[offs[lens[lens_index + sym]]++] = sym;
33021     }
33022   }
33024   /*
33025    Create and fill in decoding tables.  In this loop, the table being
33026    filled is at next and has curr index bits.  The code being used is huff
33027    with length len.  That code is converted to an index by dropping drop
33028    bits off of the bottom.  For codes where len is less than drop + curr,
33029    those top drop + curr - len bits are incremented through all values to
33030    fill the table with replicated entries.
33032    root is the number of index bits for the root table.  When len exceeds
33033    root, sub-tables are created pointed to by the root entry with an index
33034    of the low root bits of huff.  This is saved in low to check for when a
33035    new sub-table should be started.  drop is zero when the root table is
33036    being filled, and drop is root when sub-tables are being filled.
33038    When a new sub-table is needed, it is necessary to look ahead in the
33039    code lengths to determine what size sub-table is needed.  The length
33040    counts are used for this, and so count[] is decremented as codes are
33041    entered in the tables.
33043    used keeps track of how many table entries have been allocated from the
33044    provided *table space.  It is checked for LENS and DIST tables against
33045    the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
33046    the initial root table size constants.  See the comments in inftrees.h
33047    for more information.
33049    sym increments through all symbols, and the loop terminates when
33050    all codes of length max, i.e. all codes, have been processed.  This
33051    routine permits incomplete codes, so another loop after this one fills
33052    in the rest of the decoding tables with invalid code markers.
33053    */
33055   /* set up for code type */
33056   // poor man optimization - use if-else instead of switch,
33057   // to avoid deopts in old v8
33058   if (type === CODES) {
33059     base = extra = work;    /* dummy value--not used */
33060     end = 19;
33062   } else if (type === LENS) {
33063     base = lbase;
33064     base_index -= 257;
33065     extra = lext;
33066     extra_index -= 257;
33067     end = 256;
33069   } else {                    /* DISTS */
33070     base = dbase;
33071     extra = dext;
33072     end = -1;
33073   }
33075   /* initialize opts for loop */
33076   huff = 0;                   /* starting code */
33077   sym = 0;                    /* starting code symbol */
33078   len = min;                  /* starting code length */
33079   next = table_index;              /* current table to fill in */
33080   curr = root;                /* current table index bits */
33081   drop = 0;                   /* current bits to drop from code for index */
33082   low = -1;                   /* trigger new sub-table when len > root */
33083   used = 1 << root;          /* use root table entries */
33084   mask = used - 1;            /* mask for comparing low */
33086   /* check available table space */
33087   if ((type === LENS && used > ENOUGH_LENS) ||
33088     (type === DISTS && used > ENOUGH_DISTS)) {
33089     return 1;
33090   }
33092   /* process all codes and make table entries */
33093   for (;;) {
33094     /* create table entry */
33095     here_bits = len - drop;
33096     if (work[sym] < end) {
33097       here_op = 0;
33098       here_val = work[sym];
33099     }
33100     else if (work[sym] > end) {
33101       here_op = extra[extra_index + work[sym]];
33102       here_val = base[base_index + work[sym]];
33103     }
33104     else {
33105       here_op = 32 + 64;         /* end of block */
33106       here_val = 0;
33107     }
33109     /* replicate for those indices with low len bits equal to huff */
33110     incr = 1 << (len - drop);
33111     fill = 1 << curr;
33112     min = fill;                 /* save offset to next table */
33113     do {
33114       fill -= incr;
33115       table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
33116     } while (fill !== 0);
33118     /* backwards increment the len-bit code huff */
33119     incr = 1 << (len - 1);
33120     while (huff & incr) {
33121       incr >>= 1;
33122     }
33123     if (incr !== 0) {
33124       huff &= incr - 1;
33125       huff += incr;
33126     } else {
33127       huff = 0;
33128     }
33130     /* go to next symbol, update count, len */
33131     sym++;
33132     if (--count[len] === 0) {
33133       if (len === max) { break; }
33134       len = lens[lens_index + work[sym]];
33135     }
33137     /* create new sub-table if needed */
33138     if (len > root && (huff & mask) !== low) {
33139       /* if first time, transition to sub-tables */
33140       if (drop === 0) {
33141         drop = root;
33142       }
33144       /* increment past last table */
33145       next += min;            /* here min is 1 << curr */
33147       /* determine length of next table */
33148       curr = len - drop;
33149       left = 1 << curr;
33150       while (curr + drop < max) {
33151         left -= count[curr + drop];
33152         if (left <= 0) { break; }
33153         curr++;
33154         left <<= 1;
33155       }
33157       /* check for enough space */
33158       used += 1 << curr;
33159       if ((type === LENS && used > ENOUGH_LENS) ||
33160         (type === DISTS && used > ENOUGH_DISTS)) {
33161         return 1;
33162       }
33164       /* point entry in root table to sub-table */
33165       low = huff & mask;
33166       /*table.op[low] = curr;
33167       table.bits[low] = root;
33168       table.val[low] = next - opts.table_index;*/
33169       table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
33170     }
33171   }
33173   /* fill in remaining table entry if code is incomplete (guaranteed to have
33174    at most one remaining entry, since if the code is incomplete, the
33175    maximum code length that was allowed to get this far is one bit) */
33176   if (huff !== 0) {
33177     //table.op[next + huff] = 64;            /* invalid code marker */
33178     //table.bits[next + huff] = len - drop;
33179     //table.val[next + huff] = 0;
33180     table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
33181   }
33183   /* set return parameters */
33184   //opts.table_index += used;
33185   opts.bits = root;
33186   return 0;
33190 /***/ }),
33191 /* 160 */
33192 /***/ (function(module, exports, __webpack_require__) {
33194 "use strict";
33197 // (C) 1995-2013 Jean-loup Gailly and Mark Adler
33198 // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
33200 // This software is provided 'as-is', without any express or implied
33201 // warranty. In no event will the authors be held liable for any damages
33202 // arising from the use of this software.
33204 // Permission is granted to anyone to use this software for any purpose,
33205 // including commercial applications, and to alter it and redistribute it
33206 // freely, subject to the following restrictions:
33208 // 1. The origin of this software must not be misrepresented; you must not
33209 //   claim that you wrote the original software. If you use this software
33210 //   in a product, an acknowledgment in the product documentation would be
33211 //   appreciated but is not required.
33212 // 2. Altered source versions must be plainly marked as such, and must not be
33213 //   misrepresented as being the original software.
33214 // 3. This notice may not be removed or altered from any source distribution.
33216 module.exports = {
33218   /* Allowed flush values; see deflate() and inflate() below for details */
33219   Z_NO_FLUSH:         0,
33220   Z_PARTIAL_FLUSH:    1,
33221   Z_SYNC_FLUSH:       2,
33222   Z_FULL_FLUSH:       3,
33223   Z_FINISH:           4,
33224   Z_BLOCK:            5,
33225   Z_TREES:            6,
33227   /* Return codes for the compression/decompression functions. Negative values
33228   * are errors, positive values are used for special but normal events.
33229   */
33230   Z_OK:               0,
33231   Z_STREAM_END:       1,
33232   Z_NEED_DICT:        2,
33233   Z_ERRNO:           -1,
33234   Z_STREAM_ERROR:    -2,
33235   Z_DATA_ERROR:      -3,
33236   //Z_MEM_ERROR:     -4,
33237   Z_BUF_ERROR:       -5,
33238   //Z_VERSION_ERROR: -6,
33240   /* compression levels */
33241   Z_NO_COMPRESSION:         0,
33242   Z_BEST_SPEED:             1,
33243   Z_BEST_COMPRESSION:       9,
33244   Z_DEFAULT_COMPRESSION:   -1,
33247   Z_FILTERED:               1,
33248   Z_HUFFMAN_ONLY:           2,
33249   Z_RLE:                    3,
33250   Z_FIXED:                  4,
33251   Z_DEFAULT_STRATEGY:       0,
33253   /* Possible values of the data_type field (though see inflate()) */
33254   Z_BINARY:                 0,
33255   Z_TEXT:                   1,
33256   //Z_ASCII:                1, // = Z_TEXT (deprecated)
33257   Z_UNKNOWN:                2,
33259   /* The deflate compression method */
33260   Z_DEFLATED:               8
33261   //Z_NULL:                 null // Use -1 or null inline, depending on var type
33265 /***/ }),
33266 /* 161 */
33267 /***/ (function(module, exports) {
33269 // Generated by CoffeeScript 1.12.6
33272 PDFPage - represents a single page in the PDF document
33273 By Devon Govett
33274  */
33276 (function() {
33277   var PDFPage;
33279   PDFPage = (function() {
33280     var DEFAULT_MARGINS, SIZES;
33282     function PDFPage(document, options) {
33283       var dimensions;
33284       this.document = document;
33285       if (options == null) {
33286         options = {};
33287       }
33288       this.size = options.size || 'letter';
33289       this.layout = options.layout || 'portrait';
33290       if (typeof options.margin === 'number') {
33291         this.margins = {
33292           top: options.margin,
33293           left: options.margin,
33294           bottom: options.margin,
33295           right: options.margin
33296         };
33297       } else {
33298         this.margins = options.margins || DEFAULT_MARGINS;
33299       }
33300       dimensions = Array.isArray(this.size) ? this.size : SIZES[this.size.toUpperCase()];
33301       this.width = dimensions[this.layout === 'portrait' ? 0 : 1];
33302       this.height = dimensions[this.layout === 'portrait' ? 1 : 0];
33303       this.content = this.document.ref();
33304       this.resources = this.document.ref({
33305         ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI']
33306       });
33307       Object.defineProperties(this, {
33308         fonts: {
33309           get: (function(_this) {
33310             return function() {
33311               var base;
33312               return (base = _this.resources.data).Font != null ? base.Font : base.Font = {};
33313             };
33314           })(this)
33315         },
33316         xobjects: {
33317           get: (function(_this) {
33318             return function() {
33319               var base;
33320               return (base = _this.resources.data).XObject != null ? base.XObject : base.XObject = {};
33321             };
33322           })(this)
33323         },
33324         ext_gstates: {
33325           get: (function(_this) {
33326             return function() {
33327               var base;
33328               return (base = _this.resources.data).ExtGState != null ? base.ExtGState : base.ExtGState = {};
33329             };
33330           })(this)
33331         },
33332         patterns: {
33333           get: (function(_this) {
33334             return function() {
33335               var base;
33336               return (base = _this.resources.data).Pattern != null ? base.Pattern : base.Pattern = {};
33337             };
33338           })(this)
33339         },
33340         annotations: {
33341           get: (function(_this) {
33342             return function() {
33343               var base;
33344               return (base = _this.dictionary.data).Annots != null ? base.Annots : base.Annots = [];
33345             };
33346           })(this)
33347         }
33348       });
33349       this.dictionary = this.document.ref({
33350         Type: 'Page',
33351         Parent: this.document._root.data.Pages,
33352         MediaBox: [0, 0, this.width, this.height],
33353         Contents: this.content,
33354         Resources: this.resources
33355       });
33356     }
33358     PDFPage.prototype.maxY = function() {
33359       return this.height - this.margins.bottom;
33360     };
33362     PDFPage.prototype.write = function(chunk) {
33363       return this.content.write(chunk);
33364     };
33366     PDFPage.prototype.end = function() {
33367       this.dictionary.end();
33368       this.resources.end();
33369       return this.content.end();
33370     };
33372     DEFAULT_MARGINS = {
33373       top: 72,
33374       left: 72,
33375       bottom: 72,
33376       right: 72
33377     };
33379     SIZES = {
33380       '4A0': [4767.87, 6740.79],
33381       '2A0': [3370.39, 4767.87],
33382       A0: [2383.94, 3370.39],
33383       A1: [1683.78, 2383.94],
33384       A2: [1190.55, 1683.78],
33385       A3: [841.89, 1190.55],
33386       A4: [595.28, 841.89],
33387       A5: [419.53, 595.28],
33388       A6: [297.64, 419.53],
33389       A7: [209.76, 297.64],
33390       A8: [147.40, 209.76],
33391       A9: [104.88, 147.40],
33392       A10: [73.70, 104.88],
33393       B0: [2834.65, 4008.19],
33394       B1: [2004.09, 2834.65],
33395       B2: [1417.32, 2004.09],
33396       B3: [1000.63, 1417.32],
33397       B4: [708.66, 1000.63],
33398       B5: [498.90, 708.66],
33399       B6: [354.33, 498.90],
33400       B7: [249.45, 354.33],
33401       B8: [175.75, 249.45],
33402       B9: [124.72, 175.75],
33403       B10: [87.87, 124.72],
33404       C0: [2599.37, 3676.54],
33405       C1: [1836.85, 2599.37],
33406       C2: [1298.27, 1836.85],
33407       C3: [918.43, 1298.27],
33408       C4: [649.13, 918.43],
33409       C5: [459.21, 649.13],
33410       C6: [323.15, 459.21],
33411       C7: [229.61, 323.15],
33412       C8: [161.57, 229.61],
33413       C9: [113.39, 161.57],
33414       C10: [79.37, 113.39],
33415       RA0: [2437.80, 3458.27],
33416       RA1: [1729.13, 2437.80],
33417       RA2: [1218.90, 1729.13],
33418       RA3: [864.57, 1218.90],
33419       RA4: [609.45, 864.57],
33420       SRA0: [2551.18, 3628.35],
33421       SRA1: [1814.17, 2551.18],
33422       SRA2: [1275.59, 1814.17],
33423       SRA3: [907.09, 1275.59],
33424       SRA4: [637.80, 907.09],
33425       EXECUTIVE: [521.86, 756.00],
33426       FOLIO: [612.00, 936.00],
33427       LEGAL: [612.00, 1008.00],
33428       LETTER: [612.00, 792.00],
33429       TABLOID: [792.00, 1224.00]
33430     };
33432     return PDFPage;
33434   })();
33436   module.exports = PDFPage;
33438 }).call(this);
33441 /***/ }),
33442 /* 162 */
33443 /***/ (function(module, exports, __webpack_require__) {
33445 // Generated by CoffeeScript 1.12.6
33446 (function() {
33447   var PDFGradient, PDFLinearGradient, PDFRadialGradient, namedColors, ref;
33449   ref = __webpack_require__(163), PDFGradient = ref.PDFGradient, PDFLinearGradient = ref.PDFLinearGradient, PDFRadialGradient = ref.PDFRadialGradient;
33451   module.exports = {
33452     initColor: function() {
33453       this._opacityRegistry = {};
33454       this._opacityCount = 0;
33455       return this._gradCount = 0;
33456     },
33457     _normalizeColor: function(color) {
33458       var hex, part;
33459       if (color instanceof PDFGradient) {
33460         return color;
33461       }
33462       if (typeof color === 'string') {
33463         if (color.charAt(0) === '#') {
33464           if (color.length === 4) {
33465             color = color.replace(/#([0-9A-F])([0-9A-F])([0-9A-F])/i, "#$1$1$2$2$3$3");
33466           }
33467           hex = parseInt(color.slice(1), 16);
33468           color = [hex >> 16, hex >> 8 & 0xff, hex & 0xff];
33469         } else if (namedColors[color]) {
33470           color = namedColors[color];
33471         }
33472       }
33473       if (Array.isArray(color)) {
33474         if (color.length === 3) {
33475           color = (function() {
33476             var i, len, results;
33477             results = [];
33478             for (i = 0, len = color.length; i < len; i++) {
33479               part = color[i];
33480               results.push(part / 255);
33481             }
33482             return results;
33483           })();
33484         } else if (color.length === 4) {
33485           color = (function() {
33486             var i, len, results;
33487             results = [];
33488             for (i = 0, len = color.length; i < len; i++) {
33489               part = color[i];
33490               results.push(part / 100);
33491             }
33492             return results;
33493           })();
33494         }
33495         return color;
33496       }
33497       return null;
33498     },
33499     _setColor: function(color, stroke) {
33500       var op, space;
33501       color = this._normalizeColor(color);
33502       if (!color) {
33503         return false;
33504       }
33505       op = stroke ? 'SCN' : 'scn';
33506       if (color instanceof PDFGradient) {
33507         this._setColorSpace('Pattern', stroke);
33508         color.apply(op);
33509       } else {
33510         space = color.length === 4 ? 'DeviceCMYK' : 'DeviceRGB';
33511         this._setColorSpace(space, stroke);
33512         color = color.join(' ');
33513         this.addContent(color + " " + op);
33514       }
33515       return true;
33516     },
33517     _setColorSpace: function(space, stroke) {
33518       var op;
33519       op = stroke ? 'CS' : 'cs';
33520       return this.addContent("/" + space + " " + op);
33521     },
33522     fillColor: function(color, opacity) {
33523       var set;
33524       set = this._setColor(color, false);
33525       if (set) {
33526         this.fillOpacity(opacity);
33527       }
33528       this._fillColor = [color, opacity];
33529       return this;
33530     },
33531     strokeColor: function(color, opacity) {
33532       var set;
33533       set = this._setColor(color, true);
33534       if (set) {
33535         this.strokeOpacity(opacity);
33536       }
33537       return this;
33538     },
33539     opacity: function(opacity) {
33540       this._doOpacity(opacity, opacity);
33541       return this;
33542     },
33543     fillOpacity: function(opacity) {
33544       this._doOpacity(opacity, null);
33545       return this;
33546     },
33547     strokeOpacity: function(opacity) {
33548       this._doOpacity(null, opacity);
33549       return this;
33550     },
33551     _doOpacity: function(fillOpacity, strokeOpacity) {
33552       var dictionary, id, key, name, ref1;
33553       if (!((fillOpacity != null) || (strokeOpacity != null))) {
33554         return;
33555       }
33556       if (fillOpacity != null) {
33557         fillOpacity = Math.max(0, Math.min(1, fillOpacity));
33558       }
33559       if (strokeOpacity != null) {
33560         strokeOpacity = Math.max(0, Math.min(1, strokeOpacity));
33561       }
33562       key = fillOpacity + "_" + strokeOpacity;
33563       if (this._opacityRegistry[key]) {
33564         ref1 = this._opacityRegistry[key], dictionary = ref1[0], name = ref1[1];
33565       } else {
33566         dictionary = {
33567           Type: 'ExtGState'
33568         };
33569         if (fillOpacity != null) {
33570           dictionary.ca = fillOpacity;
33571         }
33572         if (strokeOpacity != null) {
33573           dictionary.CA = strokeOpacity;
33574         }
33575         dictionary = this.ref(dictionary);
33576         dictionary.end();
33577         id = ++this._opacityCount;
33578         name = "Gs" + id;
33579         this._opacityRegistry[key] = [dictionary, name];
33580       }
33581       this.page.ext_gstates[name] = dictionary;
33582       return this.addContent("/" + name + " gs");
33583     },
33584     linearGradient: function(x1, y1, x2, y2) {
33585       return new PDFLinearGradient(this, x1, y1, x2, y2);
33586     },
33587     radialGradient: function(x1, y1, r1, x2, y2, r2) {
33588       return new PDFRadialGradient(this, x1, y1, r1, x2, y2, r2);
33589     }
33590   };
33592   namedColors = {
33593     aliceblue: [240, 248, 255],
33594     antiquewhite: [250, 235, 215],
33595     aqua: [0, 255, 255],
33596     aquamarine: [127, 255, 212],
33597     azure: [240, 255, 255],
33598     beige: [245, 245, 220],
33599     bisque: [255, 228, 196],
33600     black: [0, 0, 0],
33601     blanchedalmond: [255, 235, 205],
33602     blue: [0, 0, 255],
33603     blueviolet: [138, 43, 226],
33604     brown: [165, 42, 42],
33605     burlywood: [222, 184, 135],
33606     cadetblue: [95, 158, 160],
33607     chartreuse: [127, 255, 0],
33608     chocolate: [210, 105, 30],
33609     coral: [255, 127, 80],
33610     cornflowerblue: [100, 149, 237],
33611     cornsilk: [255, 248, 220],
33612     crimson: [220, 20, 60],
33613     cyan: [0, 255, 255],
33614     darkblue: [0, 0, 139],
33615     darkcyan: [0, 139, 139],
33616     darkgoldenrod: [184, 134, 11],
33617     darkgray: [169, 169, 169],
33618     darkgreen: [0, 100, 0],
33619     darkgrey: [169, 169, 169],
33620     darkkhaki: [189, 183, 107],
33621     darkmagenta: [139, 0, 139],
33622     darkolivegreen: [85, 107, 47],
33623     darkorange: [255, 140, 0],
33624     darkorchid: [153, 50, 204],
33625     darkred: [139, 0, 0],
33626     darksalmon: [233, 150, 122],
33627     darkseagreen: [143, 188, 143],
33628     darkslateblue: [72, 61, 139],
33629     darkslategray: [47, 79, 79],
33630     darkslategrey: [47, 79, 79],
33631     darkturquoise: [0, 206, 209],
33632     darkviolet: [148, 0, 211],
33633     deeppink: [255, 20, 147],
33634     deepskyblue: [0, 191, 255],
33635     dimgray: [105, 105, 105],
33636     dimgrey: [105, 105, 105],
33637     dodgerblue: [30, 144, 255],
33638     firebrick: [178, 34, 34],
33639     floralwhite: [255, 250, 240],
33640     forestgreen: [34, 139, 34],
33641     fuchsia: [255, 0, 255],
33642     gainsboro: [220, 220, 220],
33643     ghostwhite: [248, 248, 255],
33644     gold: [255, 215, 0],
33645     goldenrod: [218, 165, 32],
33646     gray: [128, 128, 128],
33647     grey: [128, 128, 128],
33648     green: [0, 128, 0],
33649     greenyellow: [173, 255, 47],
33650     honeydew: [240, 255, 240],
33651     hotpink: [255, 105, 180],
33652     indianred: [205, 92, 92],
33653     indigo: [75, 0, 130],
33654     ivory: [255, 255, 240],
33655     khaki: [240, 230, 140],
33656     lavender: [230, 230, 250],
33657     lavenderblush: [255, 240, 245],
33658     lawngreen: [124, 252, 0],
33659     lemonchiffon: [255, 250, 205],
33660     lightblue: [173, 216, 230],
33661     lightcoral: [240, 128, 128],
33662     lightcyan: [224, 255, 255],
33663     lightgoldenrodyellow: [250, 250, 210],
33664     lightgray: [211, 211, 211],
33665     lightgreen: [144, 238, 144],
33666     lightgrey: [211, 211, 211],
33667     lightpink: [255, 182, 193],
33668     lightsalmon: [255, 160, 122],
33669     lightseagreen: [32, 178, 170],
33670     lightskyblue: [135, 206, 250],
33671     lightslategray: [119, 136, 153],
33672     lightslategrey: [119, 136, 153],
33673     lightsteelblue: [176, 196, 222],
33674     lightyellow: [255, 255, 224],
33675     lime: [0, 255, 0],
33676     limegreen: [50, 205, 50],
33677     linen: [250, 240, 230],
33678     magenta: [255, 0, 255],
33679     maroon: [128, 0, 0],
33680     mediumaquamarine: [102, 205, 170],
33681     mediumblue: [0, 0, 205],
33682     mediumorchid: [186, 85, 211],
33683     mediumpurple: [147, 112, 219],
33684     mediumseagreen: [60, 179, 113],
33685     mediumslateblue: [123, 104, 238],
33686     mediumspringgreen: [0, 250, 154],
33687     mediumturquoise: [72, 209, 204],
33688     mediumvioletred: [199, 21, 133],
33689     midnightblue: [25, 25, 112],
33690     mintcream: [245, 255, 250],
33691     mistyrose: [255, 228, 225],
33692     moccasin: [255, 228, 181],
33693     navajowhite: [255, 222, 173],
33694     navy: [0, 0, 128],
33695     oldlace: [253, 245, 230],
33696     olive: [128, 128, 0],
33697     olivedrab: [107, 142, 35],
33698     orange: [255, 165, 0],
33699     orangered: [255, 69, 0],
33700     orchid: [218, 112, 214],
33701     palegoldenrod: [238, 232, 170],
33702     palegreen: [152, 251, 152],
33703     paleturquoise: [175, 238, 238],
33704     palevioletred: [219, 112, 147],
33705     papayawhip: [255, 239, 213],
33706     peachpuff: [255, 218, 185],
33707     peru: [205, 133, 63],
33708     pink: [255, 192, 203],
33709     plum: [221, 160, 221],
33710     powderblue: [176, 224, 230],
33711     purple: [128, 0, 128],
33712     red: [255, 0, 0],
33713     rosybrown: [188, 143, 143],
33714     royalblue: [65, 105, 225],
33715     saddlebrown: [139, 69, 19],
33716     salmon: [250, 128, 114],
33717     sandybrown: [244, 164, 96],
33718     seagreen: [46, 139, 87],
33719     seashell: [255, 245, 238],
33720     sienna: [160, 82, 45],
33721     silver: [192, 192, 192],
33722     skyblue: [135, 206, 235],
33723     slateblue: [106, 90, 205],
33724     slategray: [112, 128, 144],
33725     slategrey: [112, 128, 144],
33726     snow: [255, 250, 250],
33727     springgreen: [0, 255, 127],
33728     steelblue: [70, 130, 180],
33729     tan: [210, 180, 140],
33730     teal: [0, 128, 128],
33731     thistle: [216, 191, 216],
33732     tomato: [255, 99, 71],
33733     turquoise: [64, 224, 208],
33734     violet: [238, 130, 238],
33735     wheat: [245, 222, 179],
33736     white: [255, 255, 255],
33737     whitesmoke: [245, 245, 245],
33738     yellow: [255, 255, 0],
33739     yellowgreen: [154, 205, 50]
33740   };
33742 }).call(this);
33745 /***/ }),
33746 /* 163 */
33747 /***/ (function(module, exports) {
33749 // Generated by CoffeeScript 1.12.6
33750 (function() {
33751   var PDFGradient, PDFLinearGradient, PDFRadialGradient,
33752     extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
33753     hasProp = {}.hasOwnProperty;
33755   PDFGradient = (function() {
33756     function PDFGradient(doc) {
33757       this.doc = doc;
33758       this.stops = [];
33759       this.embedded = false;
33760       this.transform = [1, 0, 0, 1, 0, 0];
33761       this._colorSpace = 'DeviceRGB';
33762     }
33764     PDFGradient.prototype.stop = function(pos, color, opacity) {
33765       if (opacity == null) {
33766         opacity = 1;
33767       }
33768       opacity = Math.max(0, Math.min(1, opacity));
33769       this.stops.push([pos, this.doc._normalizeColor(color), opacity]);
33770       return this;
33771     };
33773     PDFGradient.prototype.setTransform = function(m11, m12, m21, m22, dx, dy) {
33774       this.transform = [m11, m12, m21, m22, dx, dy];
33775       return this;
33776     };
33778     PDFGradient.prototype.embed = function(m) {
33779       var bounds, encode, fn, form, grad, gstate, i, j, k, last, len, opacityPattern, pageBBox, pattern, ref, ref1, shader, stop, stops, v;
33780       if (this.stops.length === 0) {
33781         return;
33782       }
33783       this.embedded = true;
33784       this.matrix = m;
33785       last = this.stops[this.stops.length - 1];
33786       if (last[0] < 1) {
33787         this.stops.push([1, last[1], last[2]]);
33788       }
33789       bounds = [];
33790       encode = [];
33791       stops = [];
33792       for (i = j = 0, ref = this.stops.length - 1; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
33793         encode.push(0, 1);
33794         if (i + 2 !== this.stops.length) {
33795           bounds.push(this.stops[i + 1][0]);
33796         }
33797         fn = this.doc.ref({
33798           FunctionType: 2,
33799           Domain: [0, 1],
33800           C0: this.stops[i + 0][1],
33801           C1: this.stops[i + 1][1],
33802           N: 1
33803         });
33804         stops.push(fn);
33805         fn.end();
33806       }
33807       if (stops.length === 1) {
33808         fn = stops[0];
33809       } else {
33810         fn = this.doc.ref({
33811           FunctionType: 3,
33812           Domain: [0, 1],
33813           Functions: stops,
33814           Bounds: bounds,
33815           Encode: encode
33816         });
33817         fn.end();
33818       }
33819       this.id = 'Sh' + (++this.doc._gradCount);
33820       shader = this.shader(fn);
33821       shader.end();
33822       pattern = this.doc.ref({
33823         Type: 'Pattern',
33824         PatternType: 2,
33825         Shading: shader,
33826         Matrix: (function() {
33827           var k, len, ref1, results;
33828           ref1 = this.matrix;
33829           results = [];
33830           for (k = 0, len = ref1.length; k < len; k++) {
33831             v = ref1[k];
33832             results.push(+v.toFixed(5));
33833           }
33834           return results;
33835         }).call(this)
33836       });
33837       pattern.end();
33838       if (this.stops.some(function(stop) {
33839         return stop[2] < 1;
33840       })) {
33841         grad = this.opacityGradient();
33842         grad._colorSpace = 'DeviceGray';
33843         ref1 = this.stops;
33844         for (k = 0, len = ref1.length; k < len; k++) {
33845           stop = ref1[k];
33846           grad.stop(stop[0], [stop[2]]);
33847         }
33848         grad = grad.embed(this.matrix);
33849         pageBBox = [0, 0, this.doc.page.width, this.doc.page.height];
33850         form = this.doc.ref({
33851           Type: 'XObject',
33852           Subtype: 'Form',
33853           FormType: 1,
33854           BBox: pageBBox,
33855           Group: {
33856             Type: 'Group',
33857             S: 'Transparency',
33858             CS: 'DeviceGray'
33859           },
33860           Resources: {
33861             ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'],
33862             Pattern: {
33863               Sh1: grad
33864             }
33865           }
33866         });
33867         form.write("/Pattern cs /Sh1 scn");
33868         form.end((pageBBox.join(" ")) + " re f");
33869         gstate = this.doc.ref({
33870           Type: 'ExtGState',
33871           SMask: {
33872             Type: 'Mask',
33873             S: 'Luminosity',
33874             G: form
33875           }
33876         });
33877         gstate.end();
33878         opacityPattern = this.doc.ref({
33879           Type: 'Pattern',
33880           PatternType: 1,
33881           PaintType: 1,
33882           TilingType: 2,
33883           BBox: pageBBox,
33884           XStep: pageBBox[2],
33885           YStep: pageBBox[3],
33886           Resources: {
33887             ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'],
33888             Pattern: {
33889               Sh1: pattern
33890             },
33891             ExtGState: {
33892               Gs1: gstate
33893             }
33894           }
33895         });
33896         opacityPattern.write("/Gs1 gs /Pattern cs /Sh1 scn");
33897         opacityPattern.end((pageBBox.join(" ")) + " re f");
33898         this.doc.page.patterns[this.id] = opacityPattern;
33899       } else {
33900         this.doc.page.patterns[this.id] = pattern;
33901       }
33902       return pattern;
33903     };
33905     PDFGradient.prototype.apply = function(op) {
33906       var dx, dy, m, m0, m1, m11, m12, m2, m21, m22, m3, m4, m5, ref, ref1;
33907       ref = this.doc._ctm.slice(), m0 = ref[0], m1 = ref[1], m2 = ref[2], m3 = ref[3], m4 = ref[4], m5 = ref[5];
33908       ref1 = this.transform, m11 = ref1[0], m12 = ref1[1], m21 = ref1[2], m22 = ref1[3], dx = ref1[4], dy = ref1[5];
33909       m = [m0 * m11 + m2 * m12, m1 * m11 + m3 * m12, m0 * m21 + m2 * m22, m1 * m21 + m3 * m22, m0 * dx + m2 * dy + m4, m1 * dx + m3 * dy + m5];
33910       if (!(this.embedded && m.join(" ") === this.matrix.join(" "))) {
33911         this.embed(m);
33912       }
33913       return this.doc.addContent("/" + this.id + " " + op);
33914     };
33916     return PDFGradient;
33918   })();
33920   PDFLinearGradient = (function(superClass) {
33921     extend(PDFLinearGradient, superClass);
33923     function PDFLinearGradient(doc, x1, y1, x2, y2) {
33924       this.doc = doc;
33925       this.x1 = x1;
33926       this.y1 = y1;
33927       this.x2 = x2;
33928       this.y2 = y2;
33929       PDFLinearGradient.__super__.constructor.apply(this, arguments);
33930     }
33932     PDFLinearGradient.prototype.shader = function(fn) {
33933       return this.doc.ref({
33934         ShadingType: 2,
33935         ColorSpace: this._colorSpace,
33936         Coords: [this.x1, this.y1, this.x2, this.y2],
33937         Function: fn,
33938         Extend: [true, true]
33939       });
33940     };
33942     PDFLinearGradient.prototype.opacityGradient = function() {
33943       return new PDFLinearGradient(this.doc, this.x1, this.y1, this.x2, this.y2);
33944     };
33946     return PDFLinearGradient;
33948   })(PDFGradient);
33950   PDFRadialGradient = (function(superClass) {
33951     extend(PDFRadialGradient, superClass);
33953     function PDFRadialGradient(doc, x1, y1, r1, x2, y2, r2) {
33954       this.doc = doc;
33955       this.x1 = x1;
33956       this.y1 = y1;
33957       this.r1 = r1;
33958       this.x2 = x2;
33959       this.y2 = y2;
33960       this.r2 = r2;
33961       PDFRadialGradient.__super__.constructor.apply(this, arguments);
33962     }
33964     PDFRadialGradient.prototype.shader = function(fn) {
33965       return this.doc.ref({
33966         ShadingType: 3,
33967         ColorSpace: this._colorSpace,
33968         Coords: [this.x1, this.y1, this.r1, this.x2, this.y2, this.r2],
33969         Function: fn,
33970         Extend: [true, true]
33971       });
33972     };
33974     PDFRadialGradient.prototype.opacityGradient = function() {
33975       return new PDFRadialGradient(this.doc, this.x1, this.y1, this.r1, this.x2, this.y2, this.r2);
33976     };
33978     return PDFRadialGradient;
33980   })(PDFGradient);
33982   module.exports = {
33983     PDFGradient: PDFGradient,
33984     PDFLinearGradient: PDFLinearGradient,
33985     PDFRadialGradient: PDFRadialGradient
33986   };
33988 }).call(this);
33991 /***/ }),
33992 /* 164 */
33993 /***/ (function(module, exports, __webpack_require__) {
33995 // Generated by CoffeeScript 1.12.6
33996 (function() {
33997   var KAPPA, SVGPath, number,
33998     slice = [].slice;
34000   SVGPath = __webpack_require__(165);
34002   number = __webpack_require__(26).number;
34004   KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0);
34006   module.exports = {
34007     initVector: function() {
34008       this._ctm = [1, 0, 0, 1, 0, 0];
34009       return this._ctmStack = [];
34010     },
34011     save: function() {
34012       this._ctmStack.push(this._ctm.slice());
34013       return this.addContent('q');
34014     },
34015     restore: function() {
34016       this._ctm = this._ctmStack.pop() || [1, 0, 0, 1, 0, 0];
34017       return this.addContent('Q');
34018     },
34019     closePath: function() {
34020       return this.addContent('h');
34021     },
34022     lineWidth: function(w) {
34023       return this.addContent((number(w)) + " w");
34024     },
34025     _CAP_STYLES: {
34026       BUTT: 0,
34027       ROUND: 1,
34028       SQUARE: 2
34029     },
34030     lineCap: function(c) {
34031       if (typeof c === 'string') {
34032         c = this._CAP_STYLES[c.toUpperCase()];
34033       }
34034       return this.addContent(c + " J");
34035     },
34036     _JOIN_STYLES: {
34037       MITER: 0,
34038       ROUND: 1,
34039       BEVEL: 2
34040     },
34041     lineJoin: function(j) {
34042       if (typeof j === 'string') {
34043         j = this._JOIN_STYLES[j.toUpperCase()];
34044       }
34045       return this.addContent(j + " j");
34046     },
34047     miterLimit: function(m) {
34048       return this.addContent((number(m)) + " M");
34049     },
34050     dash: function(length, options) {
34051       var phase, ref, space, v;
34052       if (options == null) {
34053         options = {};
34054       }
34055       if (length == null) {
34056         return this;
34057       }
34058       if (Array.isArray(length)) {
34059         length = ((function() {
34060           var i, len, results;
34061           results = [];
34062           for (i = 0, len = length.length; i < len; i++) {
34063             v = length[i];
34064             results.push(number(v));
34065           }
34066           return results;
34067         })()).join(' ');
34068         phase = options.phase || 0;
34069         return this.addContent("[" + length + "] " + (number(phase)) + " d");
34070       } else {
34071         space = (ref = options.space) != null ? ref : length;
34072         phase = options.phase || 0;
34073         return this.addContent("[" + (number(length)) + " " + (number(space)) + "] " + (number(phase)) + " d");
34074       }
34075     },
34076     undash: function() {
34077       return this.addContent("[] 0 d");
34078     },
34079     moveTo: function(x, y) {
34080       return this.addContent((number(x)) + " " + (number(y)) + " m");
34081     },
34082     lineTo: function(x, y) {
34083       return this.addContent((number(x)) + " " + (number(y)) + " l");
34084     },
34085     bezierCurveTo: function(cp1x, cp1y, cp2x, cp2y, x, y) {
34086       return this.addContent((number(cp1x)) + " " + (number(cp1y)) + " " + (number(cp2x)) + " " + (number(cp2y)) + " " + (number(x)) + " " + (number(y)) + " c");
34087     },
34088     quadraticCurveTo: function(cpx, cpy, x, y) {
34089       return this.addContent((number(cpx)) + " " + (number(cpy)) + " " + (number(x)) + " " + (number(y)) + " v");
34090     },
34091     rect: function(x, y, w, h) {
34092       return this.addContent((number(x)) + " " + (number(y)) + " " + (number(w)) + " " + (number(h)) + " re");
34093     },
34094     roundedRect: function(x, y, w, h, r) {
34095       var c;
34096       if (r == null) {
34097         r = 0;
34098       }
34099       r = Math.min(r, 0.5 * w, 0.5 * h);
34100       c = r * (1.0 - KAPPA);
34101       this.moveTo(x + r, y);
34102       this.lineTo(x + w - r, y);
34103       this.bezierCurveTo(x + w - c, y, x + w, y + c, x + w, y + r);
34104       this.lineTo(x + w, y + h - r);
34105       this.bezierCurveTo(x + w, y + h - c, x + w - c, y + h, x + w - r, y + h);
34106       this.lineTo(x + r, y + h);
34107       this.bezierCurveTo(x + c, y + h, x, y + h - c, x, y + h - r);
34108       this.lineTo(x, y + r);
34109       this.bezierCurveTo(x, y + c, x + c, y, x + r, y);
34110       return this.closePath();
34111     },
34112     ellipse: function(x, y, r1, r2) {
34113       var ox, oy, xe, xm, ye, ym;
34114       if (r2 == null) {
34115         r2 = r1;
34116       }
34117       x -= r1;
34118       y -= r2;
34119       ox = r1 * KAPPA;
34120       oy = r2 * KAPPA;
34121       xe = x + r1 * 2;
34122       ye = y + r2 * 2;
34123       xm = x + r1;
34124       ym = y + r2;
34125       this.moveTo(x, ym);
34126       this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);
34127       this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);
34128       this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);
34129       this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);
34130       return this.closePath();
34131     },
34132     circle: function(x, y, radius) {
34133       return this.ellipse(x, y, radius);
34134     },
34135     arc: function(x, y, radius, startAngle, endAngle, anticlockwise) {
34136       var HALF_PI, TWO_PI, ax, ay, cp1x, cp1y, cp2x, cp2y, curAng, deltaAng, deltaCx, deltaCy, dir, handleLen, i, numSegs, ref, segAng, segIdx;
34137       if (anticlockwise == null) {
34138         anticlockwise = false;
34139       }
34140       TWO_PI = 2.0 * Math.PI;
34141       HALF_PI = 0.5 * Math.PI;
34142       deltaAng = endAngle - startAngle;
34143       if (Math.abs(deltaAng) > TWO_PI) {
34144         deltaAng = TWO_PI;
34145       } else if (deltaAng !== 0 && anticlockwise !== (deltaAng < 0)) {
34146         dir = anticlockwise ? -1 : 1;
34147         deltaAng = dir * TWO_PI + deltaAng;
34148       }
34149       numSegs = Math.ceil(Math.abs(deltaAng) / HALF_PI);
34150       segAng = deltaAng / numSegs;
34151       handleLen = (segAng / HALF_PI) * KAPPA * radius;
34152       curAng = startAngle;
34153       deltaCx = -Math.sin(curAng) * handleLen;
34154       deltaCy = Math.cos(curAng) * handleLen;
34155       ax = x + Math.cos(curAng) * radius;
34156       ay = y + Math.sin(curAng) * radius;
34157       this.moveTo(ax, ay);
34158       for (segIdx = i = 0, ref = numSegs; 0 <= ref ? i < ref : i > ref; segIdx = 0 <= ref ? ++i : --i) {
34159         cp1x = ax + deltaCx;
34160         cp1y = ay + deltaCy;
34161         curAng += segAng;
34162         ax = x + Math.cos(curAng) * radius;
34163         ay = y + Math.sin(curAng) * radius;
34164         deltaCx = -Math.sin(curAng) * handleLen;
34165         deltaCy = Math.cos(curAng) * handleLen;
34166         cp2x = ax - deltaCx;
34167         cp2y = ay - deltaCy;
34168         this.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, ax, ay);
34169       }
34170       return this;
34171     },
34172     polygon: function() {
34173       var i, len, point, points;
34174       points = 1 <= arguments.length ? slice.call(arguments, 0) : [];
34175       this.moveTo.apply(this, points.shift());
34176       for (i = 0, len = points.length; i < len; i++) {
34177         point = points[i];
34178         this.lineTo.apply(this, point);
34179       }
34180       return this.closePath();
34181     },
34182     path: function(path) {
34183       SVGPath.apply(this, path);
34184       return this;
34185     },
34186     _windingRule: function(rule) {
34187       if (/even-?odd/.test(rule)) {
34188         return '*';
34189       }
34190       return '';
34191     },
34192     fill: function(color, rule) {
34193       if (/(even-?odd)|(non-?zero)/.test(color)) {
34194         rule = color;
34195         color = null;
34196       }
34197       if (color) {
34198         this.fillColor(color);
34199       }
34200       return this.addContent('f' + this._windingRule(rule));
34201     },
34202     stroke: function(color) {
34203       if (color) {
34204         this.strokeColor(color);
34205       }
34206       return this.addContent('S');
34207     },
34208     fillAndStroke: function(fillColor, strokeColor, rule) {
34209       var isFillRule;
34210       if (strokeColor == null) {
34211         strokeColor = fillColor;
34212       }
34213       isFillRule = /(even-?odd)|(non-?zero)/;
34214       if (isFillRule.test(fillColor)) {
34215         rule = fillColor;
34216         fillColor = null;
34217       }
34218       if (isFillRule.test(strokeColor)) {
34219         rule = strokeColor;
34220         strokeColor = fillColor;
34221       }
34222       if (fillColor) {
34223         this.fillColor(fillColor);
34224         this.strokeColor(strokeColor);
34225       }
34226       return this.addContent('B' + this._windingRule(rule));
34227     },
34228     clip: function(rule) {
34229       return this.addContent('W' + this._windingRule(rule) + ' n');
34230     },
34231     transform: function(m11, m12, m21, m22, dx, dy) {
34232       var m, m0, m1, m2, m3, m4, m5, v, values;
34233       m = this._ctm;
34234       m0 = m[0], m1 = m[1], m2 = m[2], m3 = m[3], m4 = m[4], m5 = m[5];
34235       m[0] = m0 * m11 + m2 * m12;
34236       m[1] = m1 * m11 + m3 * m12;
34237       m[2] = m0 * m21 + m2 * m22;
34238       m[3] = m1 * m21 + m3 * m22;
34239       m[4] = m0 * dx + m2 * dy + m4;
34240       m[5] = m1 * dx + m3 * dy + m5;
34241       values = ((function() {
34242         var i, len, ref, results;
34243         ref = [m11, m12, m21, m22, dx, dy];
34244         results = [];
34245         for (i = 0, len = ref.length; i < len; i++) {
34246           v = ref[i];
34247           results.push(number(v));
34248         }
34249         return results;
34250       })()).join(' ');
34251       return this.addContent(values + " cm");
34252     },
34253     translate: function(x, y) {
34254       return this.transform(1, 0, 0, 1, x, y);
34255     },
34256     rotate: function(angle, options) {
34257       var cos, rad, ref, sin, x, x1, y, y1;
34258       if (options == null) {
34259         options = {};
34260       }
34261       rad = angle * Math.PI / 180;
34262       cos = Math.cos(rad);
34263       sin = Math.sin(rad);
34264       x = y = 0;
34265       if (options.origin != null) {
34266         ref = options.origin, x = ref[0], y = ref[1];
34267         x1 = x * cos - y * sin;
34268         y1 = x * sin + y * cos;
34269         x -= x1;
34270         y -= y1;
34271       }
34272       return this.transform(cos, sin, -sin, cos, x, y);
34273     },
34274     scale: function(xFactor, yFactor, options) {
34275       var ref, x, y;
34276       if (yFactor == null) {
34277         yFactor = xFactor;
34278       }
34279       if (options == null) {
34280         options = {};
34281       }
34282       if (typeof yFactor === "object") {
34283         options = yFactor;
34284         yFactor = xFactor;
34285       }
34286       x = y = 0;
34287       if (options.origin != null) {
34288         ref = options.origin, x = ref[0], y = ref[1];
34289         x -= xFactor * x;
34290         y -= yFactor * y;
34291       }
34292       return this.transform(xFactor, 0, 0, yFactor, x, y);
34293     }
34294   };
34296 }).call(this);
34299 /***/ }),
34300 /* 165 */
34301 /***/ (function(module, exports) {
34303 // Generated by CoffeeScript 1.12.6
34304 (function() {
34305   var SVGPath;
34307   SVGPath = (function() {
34308     var apply, arcToSegments, cx, cy, parameters, parse, px, py, runners, segmentToBezier, solveArc, sx, sy;
34310     function SVGPath() {}
34312     SVGPath.apply = function(doc, path) {
34313       var commands;
34314       commands = parse(path);
34315       return apply(commands, doc);
34316     };
34318     parameters = {
34319       A: 7,
34320       a: 7,
34321       C: 6,
34322       c: 6,
34323       H: 1,
34324       h: 1,
34325       L: 2,
34326       l: 2,
34327       M: 2,
34328       m: 2,
34329       Q: 4,
34330       q: 4,
34331       S: 4,
34332       s: 4,
34333       T: 2,
34334       t: 2,
34335       V: 1,
34336       v: 1,
34337       Z: 0,
34338       z: 0
34339     };
34341     parse = function(path) {
34342       var args, c, cmd, curArg, foundDecimal, j, len, params, ret;
34343       ret = [];
34344       args = [];
34345       curArg = "";
34346       foundDecimal = false;
34347       params = 0;
34348       for (j = 0, len = path.length; j < len; j++) {
34349         c = path[j];
34350         if (parameters[c] != null) {
34351           params = parameters[c];
34352           if (cmd) {
34353             if (curArg.length > 0) {
34354               args[args.length] = +curArg;
34355             }
34356             ret[ret.length] = {
34357               cmd: cmd,
34358               args: args
34359             };
34360             args = [];
34361             curArg = "";
34362             foundDecimal = false;
34363           }
34364           cmd = c;
34365         } else if ((c === " " || c === ",") || (c === "-" && curArg.length > 0 && curArg[curArg.length - 1] !== 'e') || (c === "." && foundDecimal)) {
34366           if (curArg.length === 0) {
34367             continue;
34368           }
34369           if (args.length === params) {
34370             ret[ret.length] = {
34371               cmd: cmd,
34372               args: args
34373             };
34374             args = [+curArg];
34375             if (cmd === "M") {
34376               cmd = "L";
34377             }
34378             if (cmd === "m") {
34379               cmd = "l";
34380             }
34381           } else {
34382             args[args.length] = +curArg;
34383           }
34384           foundDecimal = c === ".";
34385           curArg = c === '-' || c === '.' ? c : '';
34386         } else {
34387           curArg += c;
34388           if (c === '.') {
34389             foundDecimal = true;
34390           }
34391         }
34392       }
34393       if (curArg.length > 0) {
34394         if (args.length === params) {
34395           ret[ret.length] = {
34396             cmd: cmd,
34397             args: args
34398           };
34399           args = [+curArg];
34400           if (cmd === "M") {
34401             cmd = "L";
34402           }
34403           if (cmd === "m") {
34404             cmd = "l";
34405           }
34406         } else {
34407           args[args.length] = +curArg;
34408         }
34409       }
34410       ret[ret.length] = {
34411         cmd: cmd,
34412         args: args
34413       };
34414       return ret;
34415     };
34417     cx = cy = px = py = sx = sy = 0;
34419     apply = function(commands, doc) {
34420       var c, i, j, len, name;
34421       cx = cy = px = py = sx = sy = 0;
34422       for (i = j = 0, len = commands.length; j < len; i = ++j) {
34423         c = commands[i];
34424         if (typeof runners[name = c.cmd] === "function") {
34425           runners[name](doc, c.args);
34426         }
34427       }
34428       return cx = cy = px = py = 0;
34429     };
34431     runners = {
34432       M: function(doc, a) {
34433         cx = a[0];
34434         cy = a[1];
34435         px = py = null;
34436         sx = cx;
34437         sy = cy;
34438         return doc.moveTo(cx, cy);
34439       },
34440       m: function(doc, a) {
34441         cx += a[0];
34442         cy += a[1];
34443         px = py = null;
34444         sx = cx;
34445         sy = cy;
34446         return doc.moveTo(cx, cy);
34447       },
34448       C: function(doc, a) {
34449         cx = a[4];
34450         cy = a[5];
34451         px = a[2];
34452         py = a[3];
34453         return doc.bezierCurveTo.apply(doc, a);
34454       },
34455       c: function(doc, a) {
34456         doc.bezierCurveTo(a[0] + cx, a[1] + cy, a[2] + cx, a[3] + cy, a[4] + cx, a[5] + cy);
34457         px = cx + a[2];
34458         py = cy + a[3];
34459         cx += a[4];
34460         return cy += a[5];
34461       },
34462       S: function(doc, a) {
34463         if (px === null) {
34464           px = cx;
34465           py = cy;
34466         }
34467         doc.bezierCurveTo(cx - (px - cx), cy - (py - cy), a[0], a[1], a[2], a[3]);
34468         px = a[0];
34469         py = a[1];
34470         cx = a[2];
34471         return cy = a[3];
34472       },
34473       s: function(doc, a) {
34474         if (px === null) {
34475           px = cx;
34476           py = cy;
34477         }
34478         doc.bezierCurveTo(cx - (px - cx), cy - (py - cy), cx + a[0], cy + a[1], cx + a[2], cy + a[3]);
34479         px = cx + a[0];
34480         py = cy + a[1];
34481         cx += a[2];
34482         return cy += a[3];
34483       },
34484       Q: function(doc, a) {
34485         px = a[0];
34486         py = a[1];
34487         cx = a[2];
34488         cy = a[3];
34489         return doc.quadraticCurveTo(a[0], a[1], cx, cy);
34490       },
34491       q: function(doc, a) {
34492         doc.quadraticCurveTo(a[0] + cx, a[1] + cy, a[2] + cx, a[3] + cy);
34493         px = cx + a[0];
34494         py = cy + a[1];
34495         cx += a[2];
34496         return cy += a[3];
34497       },
34498       T: function(doc, a) {
34499         if (px === null) {
34500           px = cx;
34501           py = cy;
34502         } else {
34503           px = cx - (px - cx);
34504           py = cy - (py - cy);
34505         }
34506         doc.quadraticCurveTo(px, py, a[0], a[1]);
34507         px = cx - (px - cx);
34508         py = cy - (py - cy);
34509         cx = a[0];
34510         return cy = a[1];
34511       },
34512       t: function(doc, a) {
34513         if (px === null) {
34514           px = cx;
34515           py = cy;
34516         } else {
34517           px = cx - (px - cx);
34518           py = cy - (py - cy);
34519         }
34520         doc.quadraticCurveTo(px, py, cx + a[0], cy + a[1]);
34521         cx += a[0];
34522         return cy += a[1];
34523       },
34524       A: function(doc, a) {
34525         solveArc(doc, cx, cy, a);
34526         cx = a[5];
34527         return cy = a[6];
34528       },
34529       a: function(doc, a) {
34530         a[5] += cx;
34531         a[6] += cy;
34532         solveArc(doc, cx, cy, a);
34533         cx = a[5];
34534         return cy = a[6];
34535       },
34536       L: function(doc, a) {
34537         cx = a[0];
34538         cy = a[1];
34539         px = py = null;
34540         return doc.lineTo(cx, cy);
34541       },
34542       l: function(doc, a) {
34543         cx += a[0];
34544         cy += a[1];
34545         px = py = null;
34546         return doc.lineTo(cx, cy);
34547       },
34548       H: function(doc, a) {
34549         cx = a[0];
34550         px = py = null;
34551         return doc.lineTo(cx, cy);
34552       },
34553       h: function(doc, a) {
34554         cx += a[0];
34555         px = py = null;
34556         return doc.lineTo(cx, cy);
34557       },
34558       V: function(doc, a) {
34559         cy = a[0];
34560         px = py = null;
34561         return doc.lineTo(cx, cy);
34562       },
34563       v: function(doc, a) {
34564         cy += a[0];
34565         px = py = null;
34566         return doc.lineTo(cx, cy);
34567       },
34568       Z: function(doc) {
34569         doc.closePath();
34570         cx = sx;
34571         return cy = sy;
34572       },
34573       z: function(doc) {
34574         doc.closePath();
34575         cx = sx;
34576         return cy = sy;
34577       }
34578     };
34580     solveArc = function(doc, x, y, coords) {
34581       var bez, ex, ey, j, large, len, results, rot, rx, ry, seg, segs, sweep;
34582       rx = coords[0], ry = coords[1], rot = coords[2], large = coords[3], sweep = coords[4], ex = coords[5], ey = coords[6];
34583       segs = arcToSegments(ex, ey, rx, ry, large, sweep, rot, x, y);
34584       results = [];
34585       for (j = 0, len = segs.length; j < len; j++) {
34586         seg = segs[j];
34587         bez = segmentToBezier.apply(null, seg);
34588         results.push(doc.bezierCurveTo.apply(doc, bez));
34589       }
34590       return results;
34591     };
34593     arcToSegments = function(x, y, rx, ry, large, sweep, rotateX, ox, oy) {
34594       var a00, a01, a10, a11, cos_th, d, i, j, pl, ref, result, segments, sfactor, sfactor_sq, sin_th, th, th0, th1, th2, th3, th_arc, x0, x1, xc, y0, y1, yc;
34595       th = rotateX * (Math.PI / 180);
34596       sin_th = Math.sin(th);
34597       cos_th = Math.cos(th);
34598       rx = Math.abs(rx);
34599       ry = Math.abs(ry);
34600       px = cos_th * (ox - x) * 0.5 + sin_th * (oy - y) * 0.5;
34601       py = cos_th * (oy - y) * 0.5 - sin_th * (ox - x) * 0.5;
34602       pl = (px * px) / (rx * rx) + (py * py) / (ry * ry);
34603       if (pl > 1) {
34604         pl = Math.sqrt(pl);
34605         rx *= pl;
34606         ry *= pl;
34607       }
34608       a00 = cos_th / rx;
34609       a01 = sin_th / rx;
34610       a10 = (-sin_th) / ry;
34611       a11 = cos_th / ry;
34612       x0 = a00 * ox + a01 * oy;
34613       y0 = a10 * ox + a11 * oy;
34614       x1 = a00 * x + a01 * y;
34615       y1 = a10 * x + a11 * y;
34616       d = (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0);
34617       sfactor_sq = 1 / d - 0.25;
34618       if (sfactor_sq < 0) {
34619         sfactor_sq = 0;
34620       }
34621       sfactor = Math.sqrt(sfactor_sq);
34622       if (sweep === large) {
34623         sfactor = -sfactor;
34624       }
34625       xc = 0.5 * (x0 + x1) - sfactor * (y1 - y0);
34626       yc = 0.5 * (y0 + y1) + sfactor * (x1 - x0);
34627       th0 = Math.atan2(y0 - yc, x0 - xc);
34628       th1 = Math.atan2(y1 - yc, x1 - xc);
34629       th_arc = th1 - th0;
34630       if (th_arc < 0 && sweep === 1) {
34631         th_arc += 2 * Math.PI;
34632       } else if (th_arc > 0 && sweep === 0) {
34633         th_arc -= 2 * Math.PI;
34634       }
34635       segments = Math.ceil(Math.abs(th_arc / (Math.PI * 0.5 + 0.001)));
34636       result = [];
34637       for (i = j = 0, ref = segments; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
34638         th2 = th0 + i * th_arc / segments;
34639         th3 = th0 + (i + 1) * th_arc / segments;
34640         result[i] = [xc, yc, th2, th3, rx, ry, sin_th, cos_th];
34641       }
34642       return result;
34643     };
34645     segmentToBezier = function(cx, cy, th0, th1, rx, ry, sin_th, cos_th) {
34646       var a00, a01, a10, a11, t, th_half, x1, x2, x3, y1, y2, y3;
34647       a00 = cos_th * rx;
34648       a01 = -sin_th * ry;
34649       a10 = sin_th * rx;
34650       a11 = cos_th * ry;
34651       th_half = 0.5 * (th1 - th0);
34652       t = (8 / 3) * Math.sin(th_half * 0.5) * Math.sin(th_half * 0.5) / Math.sin(th_half);
34653       x1 = cx + Math.cos(th0) - t * Math.sin(th0);
34654       y1 = cy + Math.sin(th0) + t * Math.cos(th0);
34655       x3 = cx + Math.cos(th1);
34656       y3 = cy + Math.sin(th1);
34657       x2 = x3 + t * Math.sin(th1);
34658       y2 = y3 - t * Math.cos(th1);
34659       return [a00 * x1 + a01 * y1, a10 * x1 + a11 * y1, a00 * x2 + a01 * y2, a10 * x2 + a11 * y2, a00 * x3 + a01 * y3, a10 * x3 + a11 * y3];
34660     };
34662     return SVGPath;
34664   })();
34666   module.exports = SVGPath;
34668 }).call(this);
34671 /***/ }),
34672 /* 166 */
34673 /***/ (function(module, exports, __webpack_require__) {
34675 // Generated by CoffeeScript 1.12.6
34676 (function() {
34677   var PDFFont;
34679   PDFFont = __webpack_require__(50);
34681   module.exports = {
34682     initFonts: function() {
34683       this._fontFamilies = {};
34684       this._fontCount = 0;
34685       this._fontSize = 12;
34686       this._font = null;
34687       this._registeredFonts = {};
34689     },
34690     font: function(src, family, size) {
34691       var cacheKey, font, id, ref;
34692       if (typeof family === 'number') {
34693         size = family;
34694         family = null;
34695       }
34696       if (typeof src === 'string' && this._registeredFonts[src]) {
34697         cacheKey = src;
34698         ref = this._registeredFonts[src], src = ref.src, family = ref.family;
34699       } else {
34700         cacheKey = family || src;
34701         if (typeof cacheKey !== 'string') {
34702           cacheKey = null;
34703         }
34704       }
34705       if (size != null) {
34706         this.fontSize(size);
34707       }
34708       if (font = this._fontFamilies[cacheKey]) {
34709         this._font = font;
34710         return this;
34711       }
34712       id = 'F' + (++this._fontCount);
34713       this._font = PDFFont.open(this, src, family, id);
34714       if (font = this._fontFamilies[this._font.name]) {
34715         this._font = font;
34716         return this;
34717       }
34718       if (cacheKey) {
34719         this._fontFamilies[cacheKey] = this._font;
34720       }
34721       if (this._font.name) {
34722         this._fontFamilies[this._font.name] = this._font;
34723       }
34724       return this;
34725     },
34726     fontSize: function(_fontSize) {
34727       this._fontSize = _fontSize;
34728       return this;
34729     },
34730     currentLineHeight: function(includeGap) {
34731       if (includeGap == null) {
34732         includeGap = false;
34733       }
34734       return this._font.lineHeight(this._fontSize, includeGap);
34735     },
34736     registerFont: function(name, src, family) {
34737       this._registeredFonts[name] = {
34738         src: src,
34739         family: family
34740       };
34741       return this;
34742     }
34743   };
34745 }).call(this);
34748 /***/ }),
34749 /* 167 */
34750 /***/ (function(module, exports, __webpack_require__) {
34752 "use strict";
34753 /* WEBPACK VAR INJECTION */(function(Buffer, process) {
34755 function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
34757 var r = _interopDefault(__webpack_require__(168));
34758 var _Object$getOwnPropertyDescriptor = _interopDefault(__webpack_require__(197));
34759 var _getIterator = _interopDefault(__webpack_require__(60));
34760 var _Object$freeze = _interopDefault(__webpack_require__(209));
34761 var _Object$keys = _interopDefault(__webpack_require__(212));
34762 var _typeof = _interopDefault(__webpack_require__(69));
34763 var _Object$defineProperty = _interopDefault(__webpack_require__(74));
34764 var _classCallCheck = _interopDefault(__webpack_require__(106));
34765 var _createClass = _interopDefault(__webpack_require__(107));
34766 var _Map = _interopDefault(__webpack_require__(225));
34767 var _possibleConstructorReturn = _interopDefault(__webpack_require__(236));
34768 var _inherits = _interopDefault(__webpack_require__(237));
34769 var restructure_src_utils = __webpack_require__(12);
34770 var _Object$defineProperties = _interopDefault(__webpack_require__(245));
34771 var isEqual = _interopDefault(__webpack_require__(248));
34772 var _Object$assign = _interopDefault(__webpack_require__(251));
34773 var _String$fromCodePoint = _interopDefault(__webpack_require__(255));
34774 var _Array$from = _interopDefault(__webpack_require__(258));
34775 var _Set = _interopDefault(__webpack_require__(263));
34776 var unicode = _interopDefault(__webpack_require__(269));
34777 var UnicodeTrie = _interopDefault(__webpack_require__(43));
34778 var StateMachine = _interopDefault(__webpack_require__(271));
34779 var _Number$EPSILON = _interopDefault(__webpack_require__(280));
34780 var cloneDeep = _interopDefault(__webpack_require__(283));
34781 var inflate = _interopDefault(__webpack_require__(79));
34782 var brotli = _interopDefault(__webpack_require__(284));
34786 var fontkit = {};
34787 fontkit.logErrors = false;
34789 var formats = [];
34790 fontkit.registerFormat = function (format) {
34791   formats.push(format);
34794 fontkit.openSync = function (filename, postscriptName) {
34795   var buffer = __webpack_require__(8).readFileSync(filename);
34796   return fontkit.create(buffer, postscriptName);
34799 fontkit.open = function (filename, postscriptName, callback) {
34800   if (typeof postscriptName === 'function') {
34801     callback = postscriptName;
34802     postscriptName = null;
34803   }
34805   __webpack_require__(8).readFile(filename, function (err, buffer) {
34806     if (err) {
34807       return callback(err);
34808     }
34810     try {
34811       var font = fontkit.create(buffer, postscriptName);
34812     } catch (e) {
34813       return callback(e);
34814     }
34816     return callback(null, font);
34817   });
34819   return;
34822 fontkit.create = function (buffer, postscriptName) {
34823   for (var i = 0; i < formats.length; i++) {
34824     var format = formats[i];
34825     if (format.probe(buffer)) {
34826       var font = new format(new r.DecodeStream(buffer));
34827       if (postscriptName) {
34828         return font.getFont(postscriptName);
34829       }
34831       return font;
34832     }
34833   }
34835   throw new Error('Unknown font format');
34839  * This decorator caches the results of a getter or method such that
34840  * the results are lazily computed once, and then cached.
34841  * @private
34842  */
34843 function cache(target, key, descriptor) {
34844   if (descriptor.get) {
34845     var get = descriptor.get;
34846     descriptor.get = function () {
34847       var value = get.call(this);
34848       _Object$defineProperty(this, key, { value: value });
34849       return value;
34850     };
34851   } else if (typeof descriptor.value === 'function') {
34852     var fn = descriptor.value;
34854     return {
34855       get: function get() {
34856         var cache = new _Map();
34857         function memoized() {
34858           for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
34859             args[_key] = arguments[_key];
34860           }
34862           var key = args.length > 0 ? args[0] : 'value';
34863           if (cache.has(key)) {
34864             return cache.get(key);
34865           }
34867           var result = fn.apply(this, args);
34868           cache.set(key, result);
34869           return result;
34870         };
34872         _Object$defineProperty(this, key, { value: memoized });
34873         return memoized;
34874       }
34875     };
34876   }
34879 var SubHeader = new r.Struct({
34880   firstCode: r.uint16,
34881   entryCount: r.uint16,
34882   idDelta: r.int16,
34883   idRangeOffset: r.uint16
34886 var CmapGroup = new r.Struct({
34887   startCharCode: r.uint32,
34888   endCharCode: r.uint32,
34889   glyphID: r.uint32
34892 var UnicodeValueRange = new r.Struct({
34893   startUnicodeValue: r.uint24,
34894   additionalCount: r.uint8
34897 var UVSMapping = new r.Struct({
34898   unicodeValue: r.uint24,
34899   glyphID: r.uint16
34902 var DefaultUVS = new r.Array(UnicodeValueRange, r.uint32);
34903 var NonDefaultUVS = new r.Array(UVSMapping, r.uint32);
34905 var VarSelectorRecord = new r.Struct({
34906   varSelector: r.uint24,
34907   defaultUVS: new r.Pointer(r.uint32, DefaultUVS, { type: 'parent' }),
34908   nonDefaultUVS: new r.Pointer(r.uint32, NonDefaultUVS, { type: 'parent' })
34911 var CmapSubtable = new r.VersionedStruct(r.uint16, {
34912   0: { // Byte encoding
34913     length: r.uint16, // Total table length in bytes (set to 262 for format 0)
34914     language: r.uint16, // Language code for this encoding subtable, or zero if language-independent
34915     codeMap: new r.LazyArray(r.uint8, 256)
34916   },
34918   2: { // High-byte mapping (CJK)
34919     length: r.uint16,
34920     language: r.uint16,
34921     subHeaderKeys: new r.Array(r.uint16, 256),
34922     subHeaderCount: function subHeaderCount(t) {
34923       return Math.max.apply(Math, t.subHeaderKeys);
34924     },
34925     subHeaders: new r.LazyArray(SubHeader, 'subHeaderCount'),
34926     glyphIndexArray: new r.LazyArray(r.uint16, 'subHeaderCount')
34927   },
34929   4: { // Segment mapping to delta values
34930     length: r.uint16, // Total table length in bytes
34931     language: r.uint16, // Language code
34932     segCountX2: r.uint16,
34933     segCount: function segCount(t) {
34934       return t.segCountX2 >> 1;
34935     },
34936     searchRange: r.uint16,
34937     entrySelector: r.uint16,
34938     rangeShift: r.uint16,
34939     endCode: new r.LazyArray(r.uint16, 'segCount'),
34940     reservedPad: new r.Reserved(r.uint16), // This value should be zero
34941     startCode: new r.LazyArray(r.uint16, 'segCount'),
34942     idDelta: new r.LazyArray(r.int16, 'segCount'),
34943     idRangeOffset: new r.LazyArray(r.uint16, 'segCount'),
34944     glyphIndexArray: new r.LazyArray(r.uint16, function (t) {
34945       return (t.length - t._currentOffset) / 2;
34946     })
34947   },
34949   6: { // Trimmed table
34950     length: r.uint16,
34951     language: r.uint16,
34952     firstCode: r.uint16,
34953     entryCount: r.uint16,
34954     glyphIndices: new r.LazyArray(r.uint16, 'entryCount')
34955   },
34957   8: { // mixed 16-bit and 32-bit coverage
34958     reserved: new r.Reserved(r.uint16),
34959     length: r.uint32,
34960     language: r.uint16,
34961     is32: new r.LazyArray(r.uint8, 8192),
34962     nGroups: r.uint32,
34963     groups: new r.LazyArray(CmapGroup, 'nGroups')
34964   },
34966   10: { // Trimmed Array
34967     reserved: new r.Reserved(r.uint16),
34968     length: r.uint32,
34969     language: r.uint32,
34970     firstCode: r.uint32,
34971     entryCount: r.uint32,
34972     glyphIndices: new r.LazyArray(r.uint16, 'numChars')
34973   },
34975   12: { // Segmented coverage
34976     reserved: new r.Reserved(r.uint16),
34977     length: r.uint32,
34978     language: r.uint32,
34979     nGroups: r.uint32,
34980     groups: new r.LazyArray(CmapGroup, 'nGroups')
34981   },
34983   13: { // Many-to-one range mappings (same as 12 except for group.startGlyphID)
34984     reserved: new r.Reserved(r.uint16),
34985     length: r.uint32,
34986     language: r.uint32,
34987     nGroups: r.uint32,
34988     groups: new r.LazyArray(CmapGroup, 'nGroups')
34989   },
34991   14: { // Unicode Variation Sequences
34992     length: r.uint32,
34993     numRecords: r.uint32,
34994     varSelectors: new r.LazyArray(VarSelectorRecord, 'numRecords')
34995   }
34998 var CmapEntry = new r.Struct({
34999   platformID: r.uint16, // Platform identifier
35000   encodingID: r.uint16, // Platform-specific encoding identifier
35001   table: new r.Pointer(r.uint32, CmapSubtable, { type: 'parent', lazy: true })
35004 // character to glyph mapping
35005 var cmap = new r.Struct({
35006   version: r.uint16,
35007   numSubtables: r.uint16,
35008   tables: new r.Array(CmapEntry, 'numSubtables')
35011 // font header
35012 var head = new r.Struct({
35013   version: r.int32, // 0x00010000 (version 1.0)
35014   revision: r.int32, // set by font manufacturer
35015   checkSumAdjustment: r.uint32,
35016   magicNumber: r.uint32, // set to 0x5F0F3CF5
35017   flags: r.uint16,
35018   unitsPerEm: r.uint16, // range from 64 to 16384
35019   created: new r.Array(r.int32, 2),
35020   modified: new r.Array(r.int32, 2),
35021   xMin: r.int16, // for all glyph bounding boxes
35022   yMin: r.int16, // for all glyph bounding boxes
35023   xMax: r.int16, // for all glyph bounding boxes
35024   yMax: r.int16, // for all glyph bounding boxes
35025   macStyle: new r.Bitfield(r.uint16, ['bold', 'italic', 'underline', 'outline', 'shadow', 'condensed', 'extended']),
35026   lowestRecPPEM: r.uint16, // smallest readable size in pixels
35027   fontDirectionHint: r.int16,
35028   indexToLocFormat: r.int16, // 0 for short offsets, 1 for long
35029   glyphDataFormat: r.int16 // 0 for current format
35032 // horizontal header
35033 var hhea = new r.Struct({
35034   version: r.int32,
35035   ascent: r.int16, // Distance from baseline of highest ascender
35036   descent: r.int16, // Distance from baseline of lowest descender
35037   lineGap: r.int16, // Typographic line gap
35038   advanceWidthMax: r.uint16, // Maximum advance width value in 'hmtx' table
35039   minLeftSideBearing: r.int16, // Maximum advance width value in 'hmtx' table
35040   minRightSideBearing: r.int16, // Minimum right sidebearing value
35041   xMaxExtent: r.int16,
35042   caretSlopeRise: r.int16, // Used to calculate the slope of the cursor (rise/run); 1 for vertical
35043   caretSlopeRun: r.int16, // 0 for vertical
35044   caretOffset: r.int16, // Set to 0 for non-slanted fonts
35045   reserved: new r.Reserved(r.int16, 4),
35046   metricDataFormat: r.int16, // 0 for current format
35047   numberOfMetrics: r.uint16 // Number of advance widths in 'hmtx' table
35050 var HmtxEntry = new r.Struct({
35051   advance: r.uint16,
35052   bearing: r.int16
35055 var hmtx = new r.Struct({
35056   metrics: new r.LazyArray(HmtxEntry, function (t) {
35057     return t.parent.hhea.numberOfMetrics;
35058   }),
35059   bearings: new r.LazyArray(r.int16, function (t) {
35060     return t.parent.maxp.numGlyphs - t.parent.hhea.numberOfMetrics;
35061   })
35064 // maxiumum profile
35065 var maxp = new r.Struct({
35066   version: r.int32,
35067   numGlyphs: r.uint16, // The number of glyphs in the font
35068   maxPoints: r.uint16, // Maximum points in a non-composite glyph
35069   maxContours: r.uint16, // Maximum contours in a non-composite glyph
35070   maxComponentPoints: r.uint16, // Maximum points in a composite glyph
35071   maxComponentContours: r.uint16, // Maximum contours in a composite glyph
35072   maxZones: r.uint16, // 1 if instructions do not use the twilight zone, 2 otherwise
35073   maxTwilightPoints: r.uint16, // Maximum points used in Z0
35074   maxStorage: r.uint16, // Number of Storage Area locations
35075   maxFunctionDefs: r.uint16, // Number of FDEFs
35076   maxInstructionDefs: r.uint16, // Number of IDEFs
35077   maxStackElements: r.uint16, // Maximum stack depth
35078   maxSizeOfInstructions: r.uint16, // Maximum byte count for glyph instructions
35079   maxComponentElements: r.uint16, // Maximum number of components referenced at “top level” for any composite glyph
35080   maxComponentDepth: r.uint16 // Maximum levels of recursion; 1 for simple components
35084  * Gets an encoding name from platform, encoding, and language ids.
35085  * Returned encoding names can be used in iconv-lite to decode text.
35086  */
35087 function getEncoding(platformID, encodingID) {
35088   var languageID = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
35090   if (platformID === 1 && MAC_LANGUAGE_ENCODINGS[languageID]) {
35091     return MAC_LANGUAGE_ENCODINGS[languageID];
35092   }
35094   return ENCODINGS[platformID][encodingID];
35097 // Map of platform ids to encoding ids.
35098 var ENCODINGS = [
35099 // unicode
35100 ['utf16be', 'utf16be', 'utf16be', 'utf16be', 'utf16be', 'utf16be'],
35102 // macintosh
35103 // Mappings available at http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/
35104 // 0    Roman                 17        Malayalam
35105 // 1    Japanese                    18  Sinhalese
35106 // 2    Traditional Chinese       19    Burmese
35107 // 3    Korean                20        Khmer
35108 // 4    Arabic                21        Thai
35109 // 5    Hebrew                22        Laotian
35110 // 6    Greek                   23      Georgian
35111 // 7    Russian               24        Armenian
35112 // 8    RSymbol               25        Simplified Chinese
35113 // 9    Devanagari                26    Tibetan
35114 // 10   Gurmukhi                    27  Mongolian
35115 // 11   Gujarati                    28  Geez
35116 // 12   Oriya                   29      Slavic
35117 // 13   Bengali               30        Vietnamese
35118 // 14   Tamil                   31      Sindhi
35119 // 15   Telugu                32        (Uninterpreted)
35120 // 16   Kannada
35121 ['macroman', 'shift-jis', 'big5', 'euc-kr', 'iso-8859-6', 'iso-8859-8', 'macgreek', 'maccyrillic', 'symbol', 'Devanagari', 'Gurmukhi', 'Gujarati', 'Oriya', 'Bengali', 'Tamil', 'Telugu', 'Kannada', 'Malayalam', 'Sinhalese', 'Burmese', 'Khmer', 'macthai', 'Laotian', 'Georgian', 'Armenian', 'gb-2312-80', 'Tibetan', 'Mongolian', 'Geez', 'maccenteuro', 'Vietnamese', 'Sindhi'],
35123 // ISO (deprecated)
35124 ['ascii'],
35126 // windows
35127 // Docs here: http://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx
35128 ['symbol', 'utf16be', 'shift-jis', 'gb18030', 'big5', 'wansung', 'johab', null, null, null, 'utf16be']];
35130 // Overrides for Mac scripts by language id.
35131 // See http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt
35132 var MAC_LANGUAGE_ENCODINGS = {
35133   15: 'maciceland',
35134   17: 'macturkish',
35135   18: 'maccroatian',
35136   24: 'maccenteuro',
35137   25: 'maccenteuro',
35138   26: 'maccenteuro',
35139   27: 'maccenteuro',
35140   28: 'maccenteuro',
35141   30: 'maciceland',
35142   37: 'macromania',
35143   38: 'maccenteuro',
35144   39: 'maccenteuro',
35145   40: 'maccenteuro',
35146   143: 'macinuit', // Unsupported by iconv-lite
35147   146: 'macgaelic' // Unsupported by iconv-lite
35150 // Map of platform ids to BCP-47 language codes.
35151 var LANGUAGES = [
35152 // unicode
35153 [], { // macintosh
35154   0: 'en', 30: 'fo', 60: 'ks', 90: 'rw',
35155   1: 'fr', 31: 'fa', 61: 'ku', 91: 'rn',
35156   2: 'de', 32: 'ru', 62: 'sd', 92: 'ny',
35157   3: 'it', 33: 'zh', 63: 'bo', 93: 'mg',
35158   4: 'nl', 34: 'nl-BE', 64: 'ne', 94: 'eo',
35159   5: 'sv', 35: 'ga', 65: 'sa', 128: 'cy',
35160   6: 'es', 36: 'sq', 66: 'mr', 129: 'eu',
35161   7: 'da', 37: 'ro', 67: 'bn', 130: 'ca',
35162   8: 'pt', 38: 'cz', 68: 'as', 131: 'la',
35163   9: 'no', 39: 'sk', 69: 'gu', 132: 'qu',
35164   10: 'he', 40: 'si', 70: 'pa', 133: 'gn',
35165   11: 'ja', 41: 'yi', 71: 'or', 134: 'ay',
35166   12: 'ar', 42: 'sr', 72: 'ml', 135: 'tt',
35167   13: 'fi', 43: 'mk', 73: 'kn', 136: 'ug',
35168   14: 'el', 44: 'bg', 74: 'ta', 137: 'dz',
35169   15: 'is', 45: 'uk', 75: 'te', 138: 'jv',
35170   16: 'mt', 46: 'be', 76: 'si', 139: 'su',
35171   17: 'tr', 47: 'uz', 77: 'my', 140: 'gl',
35172   18: 'hr', 48: 'kk', 78: 'km', 141: 'af',
35173   19: 'zh-Hant', 49: 'az-Cyrl', 79: 'lo', 142: 'br',
35174   20: 'ur', 50: 'az-Arab', 80: 'vi', 143: 'iu',
35175   21: 'hi', 51: 'hy', 81: 'id', 144: 'gd',
35176   22: 'th', 52: 'ka', 82: 'tl', 145: 'gv',
35177   23: 'ko', 53: 'mo', 83: 'ms', 146: 'ga',
35178   24: 'lt', 54: 'ky', 84: 'ms-Arab', 147: 'to',
35179   25: 'pl', 55: 'tg', 85: 'am', 148: 'el-polyton',
35180   26: 'hu', 56: 'tk', 86: 'ti', 149: 'kl',
35181   27: 'es', 57: 'mn-CN', 87: 'om', 150: 'az',
35182   28: 'lv', 58: 'mn', 88: 'so', 151: 'nn',
35183   29: 'se', 59: 'ps', 89: 'sw'
35186 // ISO (deprecated)
35187 [], { // windows
35188   0x0436: 'af', 0x4009: 'en-IN', 0x0487: 'rw', 0x0432: 'tn',
35189   0x041C: 'sq', 0x1809: 'en-IE', 0x0441: 'sw', 0x045B: 'si',
35190   0x0484: 'gsw', 0x2009: 'en-JM', 0x0457: 'kok', 0x041B: 'sk',
35191   0x045E: 'am', 0x4409: 'en-MY', 0x0412: 'ko', 0x0424: 'sl',
35192   0x1401: 'ar-DZ', 0x1409: 'en-NZ', 0x0440: 'ky', 0x2C0A: 'es-AR',
35193   0x3C01: 'ar-BH', 0x3409: 'en-PH', 0x0454: 'lo', 0x400A: 'es-BO',
35194   0x0C01: 'ar', 0x4809: 'en-SG', 0x0426: 'lv', 0x340A: 'es-CL',
35195   0x0801: 'ar-IQ', 0x1C09: 'en-ZA', 0x0427: 'lt', 0x240A: 'es-CO',
35196   0x2C01: 'ar-JO', 0x2C09: 'en-TT', 0x082E: 'dsb', 0x140A: 'es-CR',
35197   0x3401: 'ar-KW', 0x0809: 'en-GB', 0x046E: 'lb', 0x1C0A: 'es-DO',
35198   0x3001: 'ar-LB', 0x0409: 'en', 0x042F: 'mk', 0x300A: 'es-EC',
35199   0x1001: 'ar-LY', 0x3009: 'en-ZW', 0x083E: 'ms-BN', 0x440A: 'es-SV',
35200   0x1801: 'ary', 0x0425: 'et', 0x043E: 'ms', 0x100A: 'es-GT',
35201   0x2001: 'ar-OM', 0x0438: 'fo', 0x044C: 'ml', 0x480A: 'es-HN',
35202   0x4001: 'ar-QA', 0x0464: 'fil', 0x043A: 'mt', 0x080A: 'es-MX',
35203   0x0401: 'ar-SA', 0x040B: 'fi', 0x0481: 'mi', 0x4C0A: 'es-NI',
35204   0x2801: 'ar-SY', 0x080C: 'fr-BE', 0x047A: 'arn', 0x180A: 'es-PA',
35205   0x1C01: 'aeb', 0x0C0C: 'fr-CA', 0x044E: 'mr', 0x3C0A: 'es-PY',
35206   0x3801: 'ar-AE', 0x040C: 'fr', 0x047C: 'moh', 0x280A: 'es-PE',
35207   0x2401: 'ar-YE', 0x140C: 'fr-LU', 0x0450: 'mn', 0x500A: 'es-PR',
35208   0x042B: 'hy', 0x180C: 'fr-MC', 0x0850: 'mn-CN', 0x0C0A: 'es',
35209   0x044D: 'as', 0x100C: 'fr-CH', 0x0461: 'ne', 0x040A: 'es',
35210   0x082C: 'az-Cyrl', 0x0462: 'fy', 0x0414: 'nb', 0x540A: 'es-US',
35211   0x042C: 'az', 0x0456: 'gl', 0x0814: 'nn', 0x380A: 'es-UY',
35212   0x046D: 'ba', 0x0437: 'ka', 0x0482: 'oc', 0x200A: 'es-VE',
35213   0x042D: 'eu', 0x0C07: 'de-AT', 0x0448: 'or', 0x081D: 'sv-FI',
35214   0x0423: 'be', 0x0407: 'de', 0x0463: 'ps', 0x041D: 'sv',
35215   0x0845: 'bn', 0x1407: 'de-LI', 0x0415: 'pl', 0x045A: 'syr',
35216   0x0445: 'bn-IN', 0x1007: 'de-LU', 0x0416: 'pt', 0x0428: 'tg',
35217   0x201A: 'bs-Cyrl', 0x0807: 'de-CH', 0x0816: 'pt-PT', 0x085F: 'tzm',
35218   0x141A: 'bs', 0x0408: 'el', 0x0446: 'pa', 0x0449: 'ta',
35219   0x047E: 'br', 0x046F: 'kl', 0x046B: 'qu-BO', 0x0444: 'tt',
35220   0x0402: 'bg', 0x0447: 'gu', 0x086B: 'qu-EC', 0x044A: 'te',
35221   0x0403: 'ca', 0x0468: 'ha', 0x0C6B: 'qu', 0x041E: 'th',
35222   0x0C04: 'zh-HK', 0x040D: 'he', 0x0418: 'ro', 0x0451: 'bo',
35223   0x1404: 'zh-MO', 0x0439: 'hi', 0x0417: 'rm', 0x041F: 'tr',
35224   0x0804: 'zh', 0x040E: 'hu', 0x0419: 'ru', 0x0442: 'tk',
35225   0x1004: 'zh-SG', 0x040F: 'is', 0x243B: 'smn', 0x0480: 'ug',
35226   0x0404: 'zh-TW', 0x0470: 'ig', 0x103B: 'smj-NO', 0x0422: 'uk',
35227   0x0483: 'co', 0x0421: 'id', 0x143B: 'smj', 0x042E: 'hsb',
35228   0x041A: 'hr', 0x045D: 'iu', 0x0C3B: 'se-FI', 0x0420: 'ur',
35229   0x101A: 'hr-BA', 0x085D: 'iu-Latn', 0x043B: 'se', 0x0843: 'uz-Cyrl',
35230   0x0405: 'cs', 0x083C: 'ga', 0x083B: 'se-SE', 0x0443: 'uz',
35231   0x0406: 'da', 0x0434: 'xh', 0x203B: 'sms', 0x042A: 'vi',
35232   0x048C: 'prs', 0x0435: 'zu', 0x183B: 'sma-NO', 0x0452: 'cy',
35233   0x0465: 'dv', 0x0410: 'it', 0x1C3B: 'sms', 0x0488: 'wo',
35234   0x0813: 'nl-BE', 0x0810: 'it-CH', 0x044F: 'sa', 0x0485: 'sah',
35235   0x0413: 'nl', 0x0411: 'ja', 0x1C1A: 'sr-Cyrl-BA', 0x0478: 'ii',
35236   0x0C09: 'en-AU', 0x044B: 'kn', 0x0C1A: 'sr', 0x046A: 'yo',
35237   0x2809: 'en-BZ', 0x043F: 'kk', 0x181A: 'sr-Latn-BA',
35238   0x1009: 'en-CA', 0x0453: 'km', 0x081A: 'sr-Latn',
35239   0x2409: 'en-029', 0x0486: 'quc', 0x046C: 'nso'
35242 var NameRecord = new r.Struct({
35243   platformID: r.uint16,
35244   encodingID: r.uint16,
35245   languageID: r.uint16,
35246   nameID: r.uint16,
35247   length: r.uint16,
35248   string: new r.Pointer(r.uint16, new r.String('length', function (t) {
35249     return getEncoding(t.platformID, t.encodingID, t.languageID);
35250   }), { type: 'parent', relativeTo: 'parent.stringOffset', allowNull: false })
35253 var LangTagRecord = new r.Struct({
35254   length: r.uint16,
35255   tag: new r.Pointer(r.uint16, new r.String('length', 'utf16be'), { type: 'parent', relativeTo: 'stringOffset' })
35258 var NameTable = new r.VersionedStruct(r.uint16, {
35259   0: {
35260     count: r.uint16,
35261     stringOffset: r.uint16,
35262     records: new r.Array(NameRecord, 'count')
35263   },
35264   1: {
35265     count: r.uint16,
35266     stringOffset: r.uint16,
35267     records: new r.Array(NameRecord, 'count'),
35268     langTagCount: r.uint16,
35269     langTags: new r.Array(LangTagRecord, 'langTagCount')
35270   }
35273 var NAMES = ['copyright', 'fontFamily', 'fontSubfamily', 'uniqueSubfamily', 'fullName', 'version', 'postscriptName', // Note: A font may have only one PostScript name and that name must be ASCII.
35274 'trademark', 'manufacturer', 'designer', 'description', 'vendorURL', 'designerURL', 'license', 'licenseURL', null, // reserved
35275 'preferredFamily', 'preferredSubfamily', 'compatibleFull', 'sampleText', 'postscriptCIDFontName', 'wwsFamilyName', 'wwsSubfamilyName'];
35277 NameTable.process = function (stream) {
35278   var records = {};
35279   for (var _iterator = this.records, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
35280     var _ref;
35282     if (_isArray) {
35283       if (_i >= _iterator.length) break;
35284       _ref = _iterator[_i++];
35285     } else {
35286       _i = _iterator.next();
35287       if (_i.done) break;
35288       _ref = _i.value;
35289     }
35291     var record = _ref;
35293     // find out what language this is for
35294     var language = LANGUAGES[record.platformID][record.languageID];
35296     if (language == null && this.langTags != null && record.languageID >= 0x8000) {
35297       language = this.langTags[record.languageID - 0x8000].tag;
35298     }
35300     if (language == null) {
35301       language = record.platformID + '-' + record.languageID;
35302     }
35304     // if the nameID is >= 256, it is a font feature record (AAT)
35305     var key = record.nameID >= 256 ? 'fontFeatures' : NAMES[record.nameID] || record.nameID;
35306     if (records[key] == null) {
35307       records[key] = {};
35308     }
35310     var obj = records[key];
35311     if (record.nameID >= 256) {
35312       obj = obj[record.nameID] || (obj[record.nameID] = {});
35313     }
35315     if (typeof record.string === 'string' || typeof obj[language] !== 'string') {
35316       obj[language] = record.string;
35317     }
35318   }
35320   this.records = records;
35323 NameTable.preEncode = function () {
35324   if (Array.isArray(this.records)) return;
35325   this.version = 0;
35327   var records = [];
35328   for (var key in this.records) {
35329     var val = this.records[key];
35330     if (key === 'fontFeatures') continue;
35332     records.push({
35333       platformID: 3,
35334       encodingID: 1,
35335       languageID: 0x409,
35336       nameID: NAMES.indexOf(key),
35337       length: Buffer.byteLength(val.en, 'utf16le'),
35338       string: val.en
35339     });
35341     if (key === 'postscriptName') {
35342       records.push({
35343         platformID: 1,
35344         encodingID: 0,
35345         languageID: 0,
35346         nameID: NAMES.indexOf(key),
35347         length: val.en.length,
35348         string: val.en
35349       });
35350     }
35351   }
35353   this.records = records;
35354   this.count = records.length;
35355   this.stringOffset = NameTable.size(this, null, false);
35358 var OS2 = new r.VersionedStruct(r.uint16, {
35359   header: {
35360     xAvgCharWidth: r.int16, // average weighted advance width of lower case letters and space
35361     usWeightClass: r.uint16, // visual weight of stroke in glyphs
35362     usWidthClass: r.uint16, // relative change from the normal aspect ratio (width to height ratio)
35363     fsType: new r.Bitfield(r.uint16, [// Indicates font embedding licensing rights
35364     null, 'noEmbedding', 'viewOnly', 'editable', null, null, null, null, 'noSubsetting', 'bitmapOnly']),
35365     ySubscriptXSize: r.int16, // recommended horizontal size in pixels for subscripts
35366     ySubscriptYSize: r.int16, // recommended vertical size in pixels for subscripts
35367     ySubscriptXOffset: r.int16, // recommended horizontal offset for subscripts
35368     ySubscriptYOffset: r.int16, // recommended vertical offset form the baseline for subscripts
35369     ySuperscriptXSize: r.int16, // recommended horizontal size in pixels for superscripts
35370     ySuperscriptYSize: r.int16, // recommended vertical size in pixels for superscripts
35371     ySuperscriptXOffset: r.int16, // recommended horizontal offset for superscripts
35372     ySuperscriptYOffset: r.int16, // recommended vertical offset from the baseline for superscripts
35373     yStrikeoutSize: r.int16, // width of the strikeout stroke
35374     yStrikeoutPosition: r.int16, // position of the strikeout stroke relative to the baseline
35375     sFamilyClass: r.int16, // classification of font-family design
35376     panose: new r.Array(r.uint8, 10), // describe the visual characteristics of a given typeface
35377     ulCharRange: new r.Array(r.uint32, 4),
35378     vendorID: new r.String(4), // four character identifier for the font vendor
35379     fsSelection: new r.Bitfield(r.uint16, [// bit field containing information about the font
35380     'italic', 'underscore', 'negative', 'outlined', 'strikeout', 'bold', 'regular', 'useTypoMetrics', 'wws', 'oblique']),
35381     usFirstCharIndex: r.uint16, // The minimum Unicode index in this font
35382     usLastCharIndex: r.uint16 // The maximum Unicode index in this font
35383   },
35385   // The Apple version of this table ends here, but the Microsoft one continues on...
35386   0: {},
35388   1: {
35389     typoAscender: r.int16,
35390     typoDescender: r.int16,
35391     typoLineGap: r.int16,
35392     winAscent: r.uint16,
35393     winDescent: r.uint16,
35394     codePageRange: new r.Array(r.uint32, 2)
35395   },
35397   2: {
35398     // these should be common with version 1 somehow
35399     typoAscender: r.int16,
35400     typoDescender: r.int16,
35401     typoLineGap: r.int16,
35402     winAscent: r.uint16,
35403     winDescent: r.uint16,
35404     codePageRange: new r.Array(r.uint32, 2),
35406     xHeight: r.int16,
35407     capHeight: r.int16,
35408     defaultChar: r.uint16,
35409     breakChar: r.uint16,
35410     maxContent: r.uint16
35411   },
35413   5: {
35414     typoAscender: r.int16,
35415     typoDescender: r.int16,
35416     typoLineGap: r.int16,
35417     winAscent: r.uint16,
35418     winDescent: r.uint16,
35419     codePageRange: new r.Array(r.uint32, 2),
35421     xHeight: r.int16,
35422     capHeight: r.int16,
35423     defaultChar: r.uint16,
35424     breakChar: r.uint16,
35425     maxContent: r.uint16,
35427     usLowerOpticalPointSize: r.uint16,
35428     usUpperOpticalPointSize: r.uint16
35429   }
35432 var versions = OS2.versions;
35433 versions[3] = versions[4] = versions[2];
35435 // PostScript information
35436 var post = new r.VersionedStruct(r.fixed32, {
35437   header: { // these fields exist at the top of all versions
35438     italicAngle: r.fixed32, // Italic angle in counter-clockwise degrees from the vertical.
35439     underlinePosition: r.int16, // Suggested distance of the top of the underline from the baseline
35440     underlineThickness: r.int16, // Suggested values for the underline thickness
35441     isFixedPitch: r.uint32, // Whether the font is monospaced
35442     minMemType42: r.uint32, // Minimum memory usage when a TrueType font is downloaded as a Type 42 font
35443     maxMemType42: r.uint32, // Maximum memory usage when a TrueType font is downloaded as a Type 42 font
35444     minMemType1: r.uint32, // Minimum memory usage when a TrueType font is downloaded as a Type 1 font
35445     maxMemType1: r.uint32 // Maximum memory usage when a TrueType font is downloaded as a Type 1 font
35446   },
35448   1: {}, // version 1 has no additional fields
35450   2: {
35451     numberOfGlyphs: r.uint16,
35452     glyphNameIndex: new r.Array(r.uint16, 'numberOfGlyphs'),
35453     names: new r.Array(new r.String(r.uint8))
35454   },
35456   2.5: {
35457     numberOfGlyphs: r.uint16,
35458     offsets: new r.Array(r.uint8, 'numberOfGlyphs')
35459   },
35461   3: {}, // version 3 has no additional fields
35463   4: {
35464     map: new r.Array(r.uint32, function (t) {
35465       return t.parent.maxp.numGlyphs;
35466     })
35467   }
35470 // An array of predefined values accessible by instructions
35471 var cvt = new r.Struct({
35472   controlValues: new r.Array(r.int16)
35475 // A list of instructions that are executed once when a font is first used.
35476 // These instructions are known as the font program. The main use of this table
35477 // is for the definition of functions that are used in many different glyph programs.
35478 var fpgm = new r.Struct({
35479   instructions: new r.Array(r.uint8)
35482 var loca = new r.VersionedStruct('head.indexToLocFormat', {
35483   0: {
35484     offsets: new r.Array(r.uint16)
35485   },
35486   1: {
35487     offsets: new r.Array(r.uint32)
35488   }
35491 loca.process = function () {
35492   if (this.version === 0) {
35493     for (var i = 0; i < this.offsets.length; i++) {
35494       this.offsets[i] <<= 1;
35495     }
35496   }
35499 loca.preEncode = function () {
35500   if (this.version != null) return;
35502   // assume this.offsets is a sorted array
35503   this.version = this.offsets[this.offsets.length - 1] > 0xffff ? 1 : 0;
35505   if (this.version === 0) {
35506     for (var i = 0; i < this.offsets.length; i++) {
35507       this.offsets[i] >>>= 1;
35508     }
35509   }
35512 // Set of instructions executed whenever the point size or font transformation change
35513 var prep = new r.Struct({
35514   controlValueProgram: new r.Array(r.uint8)
35517 // only used for encoding
35518 var glyf = new r.Array(new r.Buffer());
35520 var CFFIndex = function () {
35521   function CFFIndex(type) {
35522     _classCallCheck(this, CFFIndex);
35524     this.type = type;
35525   }
35527   CFFIndex.prototype.getCFFVersion = function getCFFVersion(ctx) {
35528     while (ctx && !ctx.hdrSize) {
35529       ctx = ctx.parent;
35530     }
35532     return ctx ? ctx.version : -1;
35533   };
35535   CFFIndex.prototype.decode = function decode(stream, parent) {
35536     var version = this.getCFFVersion(parent);
35537     var count = version >= 2 ? stream.readUInt32BE() : stream.readUInt16BE();
35539     if (count === 0) {
35540       return [];
35541     }
35543     var offSize = stream.readUInt8();
35544     var offsetType = void 0;
35545     if (offSize === 1) {
35546       offsetType = r.uint8;
35547     } else if (offSize === 2) {
35548       offsetType = r.uint16;
35549     } else if (offSize === 3) {
35550       offsetType = r.uint24;
35551     } else if (offSize === 4) {
35552       offsetType = r.uint32;
35553     } else {
35554       throw new Error("Bad offset size in CFFIndex: " + offSize + " " + stream.pos);
35555     }
35557     var ret = [];
35558     var startPos = stream.pos + (count + 1) * offSize - 1;
35560     var start = offsetType.decode(stream);
35561     for (var i = 0; i < count; i++) {
35562       var end = offsetType.decode(stream);
35564       if (this.type != null) {
35565         var pos = stream.pos;
35566         stream.pos = startPos + start;
35568         parent.length = end - start;
35569         ret.push(this.type.decode(stream, parent));
35570         stream.pos = pos;
35571       } else {
35572         ret.push({
35573           offset: startPos + start,
35574           length: end - start
35575         });
35576       }
35578       start = end;
35579     }
35581     stream.pos = startPos + start;
35582     return ret;
35583   };
35585   CFFIndex.prototype.size = function size(arr, parent) {
35586     var size = 2;
35587     if (arr.length === 0) {
35588       return size;
35589     }
35591     var type = this.type || new r.Buffer();
35593     // find maximum offset to detminine offset type
35594     var offset = 1;
35595     for (var i = 0; i < arr.length; i++) {
35596       var item = arr[i];
35597       offset += type.size(item, parent);
35598     }
35600     var offsetType = void 0;
35601     if (offset <= 0xff) {
35602       offsetType = r.uint8;
35603     } else if (offset <= 0xffff) {
35604       offsetType = r.uint16;
35605     } else if (offset <= 0xffffff) {
35606       offsetType = r.uint24;
35607     } else if (offset <= 0xffffffff) {
35608       offsetType = r.uint32;
35609     } else {
35610       throw new Error("Bad offset in CFFIndex");
35611     }
35613     size += 1 + offsetType.size() * (arr.length + 1);
35614     size += offset - 1;
35616     return size;
35617   };
35619   CFFIndex.prototype.encode = function encode(stream, arr, parent) {
35620     stream.writeUInt16BE(arr.length);
35621     if (arr.length === 0) {
35622       return;
35623     }
35625     var type = this.type || new r.Buffer();
35627     // find maximum offset to detminine offset type
35628     var sizes = [];
35629     var offset = 1;
35630     for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
35631       var _ref;
35633       if (_isArray) {
35634         if (_i >= _iterator.length) break;
35635         _ref = _iterator[_i++];
35636       } else {
35637         _i = _iterator.next();
35638         if (_i.done) break;
35639         _ref = _i.value;
35640       }
35642       var item = _ref;
35644       var s = type.size(item, parent);
35645       sizes.push(s);
35646       offset += s;
35647     }
35649     var offsetType = void 0;
35650     if (offset <= 0xff) {
35651       offsetType = r.uint8;
35652     } else if (offset <= 0xffff) {
35653       offsetType = r.uint16;
35654     } else if (offset <= 0xffffff) {
35655       offsetType = r.uint24;
35656     } else if (offset <= 0xffffffff) {
35657       offsetType = r.uint32;
35658     } else {
35659       throw new Error("Bad offset in CFFIndex");
35660     }
35662     // write offset size
35663     stream.writeUInt8(offsetType.size());
35665     // write elements
35666     offset = 1;
35667     offsetType.encode(stream, offset);
35669     for (var _iterator2 = sizes, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
35670       var _ref2;
35672       if (_isArray2) {
35673         if (_i2 >= _iterator2.length) break;
35674         _ref2 = _iterator2[_i2++];
35675       } else {
35676         _i2 = _iterator2.next();
35677         if (_i2.done) break;
35678         _ref2 = _i2.value;
35679       }
35681       var size = _ref2;
35683       offset += size;
35684       offsetType.encode(stream, offset);
35685     }
35687     for (var _iterator3 = arr, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
35688       var _ref3;
35690       if (_isArray3) {
35691         if (_i3 >= _iterator3.length) break;
35692         _ref3 = _iterator3[_i3++];
35693       } else {
35694         _i3 = _iterator3.next();
35695         if (_i3.done) break;
35696         _ref3 = _i3.value;
35697       }
35699       var _item = _ref3;
35701       type.encode(stream, _item, parent);
35702     }
35704     return;
35705   };
35707   return CFFIndex;
35708 }();
35710 var FLOAT_EOF = 0xf;
35711 var FLOAT_LOOKUP = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'E', 'E-', null, '-'];
35713 var FLOAT_ENCODE_LOOKUP = {
35714   '.': 10,
35715   'E': 11,
35716   'E-': 12,
35717   '-': 14
35720 var CFFOperand = function () {
35721   function CFFOperand() {
35722     _classCallCheck(this, CFFOperand);
35723   }
35725   CFFOperand.decode = function decode(stream, value) {
35726     if (32 <= value && value <= 246) {
35727       return value - 139;
35728     }
35730     if (247 <= value && value <= 250) {
35731       return (value - 247) * 256 + stream.readUInt8() + 108;
35732     }
35734     if (251 <= value && value <= 254) {
35735       return -(value - 251) * 256 - stream.readUInt8() - 108;
35736     }
35738     if (value === 28) {
35739       return stream.readInt16BE();
35740     }
35742     if (value === 29) {
35743       return stream.readInt32BE();
35744     }
35746     if (value === 30) {
35747       var str = '';
35748       while (true) {
35749         var b = stream.readUInt8();
35751         var n1 = b >> 4;
35752         if (n1 === FLOAT_EOF) {
35753           break;
35754         }
35755         str += FLOAT_LOOKUP[n1];
35757         var n2 = b & 15;
35758         if (n2 === FLOAT_EOF) {
35759           break;
35760         }
35761         str += FLOAT_LOOKUP[n2];
35762       }
35764       return parseFloat(str);
35765     }
35767     return null;
35768   };
35770   CFFOperand.size = function size(value) {
35771     // if the value needs to be forced to the largest size (32 bit)
35772     // e.g. for unknown pointers, set to 32768
35773     if (value.forceLarge) {
35774       value = 32768;
35775     }
35777     if ((value | 0) !== value) {
35778       // floating point
35779       var str = '' + value;
35780       return 1 + Math.ceil((str.length + 1) / 2);
35781     } else if (-107 <= value && value <= 107) {
35782       return 1;
35783     } else if (108 <= value && value <= 1131 || -1131 <= value && value <= -108) {
35784       return 2;
35785     } else if (-32768 <= value && value <= 32767) {
35786       return 3;
35787     } else {
35788       return 5;
35789     }
35790   };
35792   CFFOperand.encode = function encode(stream, value) {
35793     // if the value needs to be forced to the largest size (32 bit)
35794     // e.g. for unknown pointers, save the old value and set to 32768
35795     var val = Number(value);
35797     if (value.forceLarge) {
35798       stream.writeUInt8(29);
35799       return stream.writeInt32BE(val);
35800     } else if ((val | 0) !== val) {
35801       // floating point
35802       stream.writeUInt8(30);
35804       var str = '' + val;
35805       for (var i = 0; i < str.length; i += 2) {
35806         var c1 = str[i];
35807         var n1 = FLOAT_ENCODE_LOOKUP[c1] || +c1;
35809         if (i === str.length - 1) {
35810           var n2 = FLOAT_EOF;
35811         } else {
35812           var c2 = str[i + 1];
35813           var n2 = FLOAT_ENCODE_LOOKUP[c2] || +c2;
35814         }
35816         stream.writeUInt8(n1 << 4 | n2 & 15);
35817       }
35819       if (n2 !== FLOAT_EOF) {
35820         return stream.writeUInt8(FLOAT_EOF << 4);
35821       }
35822     } else if (-107 <= val && val <= 107) {
35823       return stream.writeUInt8(val + 139);
35824     } else if (108 <= val && val <= 1131) {
35825       val -= 108;
35826       stream.writeUInt8((val >> 8) + 247);
35827       return stream.writeUInt8(val & 0xff);
35828     } else if (-1131 <= val && val <= -108) {
35829       val = -val - 108;
35830       stream.writeUInt8((val >> 8) + 251);
35831       return stream.writeUInt8(val & 0xff);
35832     } else if (-32768 <= val && val <= 32767) {
35833       stream.writeUInt8(28);
35834       return stream.writeInt16BE(val);
35835     } else {
35836       stream.writeUInt8(29);
35837       return stream.writeInt32BE(val);
35838     }
35839   };
35841   return CFFOperand;
35842 }();
35844 var CFFDict = function () {
35845   function CFFDict() {
35846     var ops = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
35848     _classCallCheck(this, CFFDict);
35850     this.ops = ops;
35851     this.fields = {};
35852     for (var _iterator = ops, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
35853       var _ref;
35855       if (_isArray) {
35856         if (_i >= _iterator.length) break;
35857         _ref = _iterator[_i++];
35858       } else {
35859         _i = _iterator.next();
35860         if (_i.done) break;
35861         _ref = _i.value;
35862       }
35864       var field = _ref;
35866       var key = Array.isArray(field[0]) ? field[0][0] << 8 | field[0][1] : field[0];
35867       this.fields[key] = field;
35868     }
35869   }
35871   CFFDict.prototype.decodeOperands = function decodeOperands(type, stream, ret, operands) {
35872     var _this = this;
35874     if (Array.isArray(type)) {
35875       return operands.map(function (op, i) {
35876         return _this.decodeOperands(type[i], stream, ret, [op]);
35877       });
35878     } else if (type.decode != null) {
35879       return type.decode(stream, ret, operands);
35880     } else {
35881       switch (type) {
35882         case 'number':
35883         case 'offset':
35884         case 'sid':
35885           return operands[0];
35886         case 'boolean':
35887           return !!operands[0];
35888         default:
35889           return operands;
35890       }
35891     }
35892   };
35894   CFFDict.prototype.encodeOperands = function encodeOperands(type, stream, ctx, operands) {
35895     var _this2 = this;
35897     if (Array.isArray(type)) {
35898       return operands.map(function (op, i) {
35899         return _this2.encodeOperands(type[i], stream, ctx, op)[0];
35900       });
35901     } else if (type.encode != null) {
35902       return type.encode(stream, operands, ctx);
35903     } else if (typeof operands === 'number') {
35904       return [operands];
35905     } else if (typeof operands === 'boolean') {
35906       return [+operands];
35907     } else if (Array.isArray(operands)) {
35908       return operands;
35909     } else {
35910       return [operands];
35911     }
35912   };
35914   CFFDict.prototype.decode = function decode(stream, parent) {
35915     var end = stream.pos + parent.length;
35916     var ret = {};
35917     var operands = [];
35919     // define hidden properties
35920     _Object$defineProperties(ret, {
35921       parent: { value: parent },
35922       _startOffset: { value: stream.pos }
35923     });
35925     // fill in defaults
35926     for (var key in this.fields) {
35927       var field = this.fields[key];
35928       ret[field[1]] = field[3];
35929     }
35931     while (stream.pos < end) {
35932       var b = stream.readUInt8();
35933       if (b < 28) {
35934         if (b === 12) {
35935           b = b << 8 | stream.readUInt8();
35936         }
35938         var _field = this.fields[b];
35939         if (!_field) {
35940           throw new Error('Unknown operator ' + b);
35941         }
35943         var val = this.decodeOperands(_field[2], stream, ret, operands);
35944         if (val != null) {
35945           if (val instanceof restructure_src_utils.PropertyDescriptor) {
35946             _Object$defineProperty(ret, _field[1], val);
35947           } else {
35948             ret[_field[1]] = val;
35949           }
35950         }
35952         operands = [];
35953       } else {
35954         operands.push(CFFOperand.decode(stream, b));
35955       }
35956     }
35958     return ret;
35959   };
35961   CFFDict.prototype.size = function size(dict, parent) {
35962     var includePointers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
35964     var ctx = {
35965       parent: parent,
35966       val: dict,
35967       pointerSize: 0,
35968       startOffset: parent.startOffset || 0
35969     };
35971     var len = 0;
35973     for (var k in this.fields) {
35974       var field = this.fields[k];
35975       var val = dict[field[1]];
35976       if (val == null || isEqual(val, field[3])) {
35977         continue;
35978       }
35980       var operands = this.encodeOperands(field[2], null, ctx, val);
35981       for (var _iterator2 = operands, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
35982         var _ref2;
35984         if (_isArray2) {
35985           if (_i2 >= _iterator2.length) break;
35986           _ref2 = _iterator2[_i2++];
35987         } else {
35988           _i2 = _iterator2.next();
35989           if (_i2.done) break;
35990           _ref2 = _i2.value;
35991         }
35993         var op = _ref2;
35995         len += CFFOperand.size(op);
35996       }
35998       var key = Array.isArray(field[0]) ? field[0] : [field[0]];
35999       len += key.length;
36000     }
36002     if (includePointers) {
36003       len += ctx.pointerSize;
36004     }
36006     return len;
36007   };
36009   CFFDict.prototype.encode = function encode(stream, dict, parent) {
36010     var ctx = {
36011       pointers: [],
36012       startOffset: stream.pos,
36013       parent: parent,
36014       val: dict,
36015       pointerSize: 0
36016     };
36018     ctx.pointerOffset = stream.pos + this.size(dict, ctx, false);
36020     for (var _iterator3 = this.ops, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
36021       var _ref3;
36023       if (_isArray3) {
36024         if (_i3 >= _iterator3.length) break;
36025         _ref3 = _iterator3[_i3++];
36026       } else {
36027         _i3 = _iterator3.next();
36028         if (_i3.done) break;
36029         _ref3 = _i3.value;
36030       }
36032       var field = _ref3;
36034       var val = dict[field[1]];
36035       if (val == null || isEqual(val, field[3])) {
36036         continue;
36037       }
36039       var operands = this.encodeOperands(field[2], stream, ctx, val);
36040       for (var _iterator4 = operands, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _getIterator(_iterator4);;) {
36041         var _ref4;
36043         if (_isArray4) {
36044           if (_i4 >= _iterator4.length) break;
36045           _ref4 = _iterator4[_i4++];
36046         } else {
36047           _i4 = _iterator4.next();
36048           if (_i4.done) break;
36049           _ref4 = _i4.value;
36050         }
36052         var op = _ref4;
36054         CFFOperand.encode(stream, op);
36055       }
36057       var key = Array.isArray(field[0]) ? field[0] : [field[0]];
36058       for (var _iterator5 = key, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _getIterator(_iterator5);;) {
36059         var _ref5;
36061         if (_isArray5) {
36062           if (_i5 >= _iterator5.length) break;
36063           _ref5 = _iterator5[_i5++];
36064         } else {
36065           _i5 = _iterator5.next();
36066           if (_i5.done) break;
36067           _ref5 = _i5.value;
36068         }
36070         var _op = _ref5;
36072         stream.writeUInt8(_op);
36073       }
36074     }
36076     var i = 0;
36077     while (i < ctx.pointers.length) {
36078       var ptr = ctx.pointers[i++];
36079       ptr.type.encode(stream, ptr.val, ptr.parent);
36080     }
36082     return;
36083   };
36085   return CFFDict;
36086 }();
36088 var CFFPointer = function (_r$Pointer) {
36089   _inherits(CFFPointer, _r$Pointer);
36091   function CFFPointer(type) {
36092     var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
36094     _classCallCheck(this, CFFPointer);
36096     if (options.type == null) {
36097       options.type = 'global';
36098     }
36100     return _possibleConstructorReturn(this, _r$Pointer.call(this, null, type, options));
36101   }
36103   CFFPointer.prototype.decode = function decode(stream, parent, operands) {
36104     this.offsetType = {
36105       decode: function decode() {
36106         return operands[0];
36107       }
36108     };
36110     return _r$Pointer.prototype.decode.call(this, stream, parent, operands);
36111   };
36113   CFFPointer.prototype.encode = function encode(stream, value, ctx) {
36114     if (!stream) {
36115       // compute the size (so ctx.pointerSize is correct)
36116       this.offsetType = {
36117         size: function size() {
36118           return 0;
36119         }
36120       };
36122       this.size(value, ctx);
36123       return [new Ptr(0)];
36124     }
36126     var ptr = null;
36127     this.offsetType = {
36128       encode: function encode(stream, val) {
36129         return ptr = val;
36130       }
36131     };
36133     _r$Pointer.prototype.encode.call(this, stream, value, ctx);
36134     return [new Ptr(ptr)];
36135   };
36137   return CFFPointer;
36138 }(r.Pointer);
36140 var Ptr = function () {
36141   function Ptr(val) {
36142     _classCallCheck(this, Ptr);
36144     this.val = val;
36145     this.forceLarge = true;
36146   }
36148   Ptr.prototype.valueOf = function valueOf() {
36149     return this.val;
36150   };
36152   return Ptr;
36153 }();
36155 var CFFBlendOp = function () {
36156   function CFFBlendOp() {
36157     _classCallCheck(this, CFFBlendOp);
36158   }
36160   CFFBlendOp.decode = function decode(stream, parent, operands) {
36161     var numBlends = operands.pop();
36163     // TODO: actually blend. For now just consume the deltas
36164     // since we don't use any of the values anyway.
36165     while (operands.length > numBlends) {
36166       operands.pop();
36167     }
36168   };
36170   return CFFBlendOp;
36171 }();
36173 var CFFPrivateDict = new CFFDict([
36174 // key       name                    type                                          default
36175 [6, 'BlueValues', 'delta', null], [7, 'OtherBlues', 'delta', null], [8, 'FamilyBlues', 'delta', null], [9, 'FamilyOtherBlues', 'delta', null], [[12, 9], 'BlueScale', 'number', 0.039625], [[12, 10], 'BlueShift', 'number', 7], [[12, 11], 'BlueFuzz', 'number', 1], [10, 'StdHW', 'number', null], [11, 'StdVW', 'number', null], [[12, 12], 'StemSnapH', 'delta', null], [[12, 13], 'StemSnapV', 'delta', null], [[12, 14], 'ForceBold', 'boolean', false], [[12, 17], 'LanguageGroup', 'number', 0], [[12, 18], 'ExpansionFactor', 'number', 0.06], [[12, 19], 'initialRandomSeed', 'number', 0], [20, 'defaultWidthX', 'number', 0], [21, 'nominalWidthX', 'number', 0], [22, 'vsindex', 'number', 0], [23, 'blend', CFFBlendOp, null], [19, 'Subrs', new CFFPointer(new CFFIndex(), { type: 'local' }), null]]);
36177 // Automatically generated from Appendix A of the CFF specification; do
36178 // not edit. Length should be 391.
36179 var standardStrings = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"];
36181 var StandardEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl', 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'];
36183 var ExpertEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];
36185 var ISOAdobeCharset = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron'];
36187 var ExpertCharset = ['.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];
36189 var ExpertSubsetCharset = ['.notdef', 'space', 'dollaroldstyle', 'dollarsuperior', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted', 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior'];
36191 //########################
36192 // Scripts and Languages #
36193 //########################
36195 var LangSysTable = new r.Struct({
36196   reserved: new r.Reserved(r.uint16),
36197   reqFeatureIndex: r.uint16,
36198   featureCount: r.uint16,
36199   featureIndexes: new r.Array(r.uint16, 'featureCount')
36202 var LangSysRecord = new r.Struct({
36203   tag: new r.String(4),
36204   langSys: new r.Pointer(r.uint16, LangSysTable, { type: 'parent' })
36207 var Script = new r.Struct({
36208   defaultLangSys: new r.Pointer(r.uint16, LangSysTable),
36209   count: r.uint16,
36210   langSysRecords: new r.Array(LangSysRecord, 'count')
36213 var ScriptRecord = new r.Struct({
36214   tag: new r.String(4),
36215   script: new r.Pointer(r.uint16, Script, { type: 'parent' })
36218 var ScriptList = new r.Array(ScriptRecord, r.uint16);
36220 //#######################
36221 // Features and Lookups #
36222 //#######################
36224 var Feature = new r.Struct({
36225   featureParams: r.uint16, // pointer
36226   lookupCount: r.uint16,
36227   lookupListIndexes: new r.Array(r.uint16, 'lookupCount')
36230 var FeatureRecord = new r.Struct({
36231   tag: new r.String(4),
36232   feature: new r.Pointer(r.uint16, Feature, { type: 'parent' })
36235 var FeatureList = new r.Array(FeatureRecord, r.uint16);
36237 var LookupFlags = new r.Struct({
36238   markAttachmentType: r.uint8,
36239   flags: new r.Bitfield(r.uint8, ['rightToLeft', 'ignoreBaseGlyphs', 'ignoreLigatures', 'ignoreMarks', 'useMarkFilteringSet'])
36242 function LookupList(SubTable) {
36243   var Lookup = new r.Struct({
36244     lookupType: r.uint16,
36245     flags: LookupFlags,
36246     subTableCount: r.uint16,
36247     subTables: new r.Array(new r.Pointer(r.uint16, SubTable), 'subTableCount'),
36248     markFilteringSet: new r.Optional(r.uint16, function (t) {
36249       return t.flags.flags.useMarkFilteringSet;
36250     })
36251   });
36253   return new r.LazyArray(new r.Pointer(r.uint16, Lookup), r.uint16);
36256 //#################
36257 // Coverage Table #
36258 //#################
36260 var RangeRecord = new r.Struct({
36261   start: r.uint16,
36262   end: r.uint16,
36263   startCoverageIndex: r.uint16
36266 var Coverage = new r.VersionedStruct(r.uint16, {
36267   1: {
36268     glyphCount: r.uint16,
36269     glyphs: new r.Array(r.uint16, 'glyphCount')
36270   },
36271   2: {
36272     rangeCount: r.uint16,
36273     rangeRecords: new r.Array(RangeRecord, 'rangeCount')
36274   }
36277 //#########################
36278 // Class Definition Table #
36279 //#########################
36281 var ClassRangeRecord = new r.Struct({
36282   start: r.uint16,
36283   end: r.uint16,
36284   class: r.uint16
36287 var ClassDef = new r.VersionedStruct(r.uint16, {
36288   1: { // Class array
36289     startGlyph: r.uint16,
36290     glyphCount: r.uint16,
36291     classValueArray: new r.Array(r.uint16, 'glyphCount')
36292   },
36293   2: { // Class ranges
36294     classRangeCount: r.uint16,
36295     classRangeRecord: new r.Array(ClassRangeRecord, 'classRangeCount')
36296   }
36299 //###############
36300 // Device Table #
36301 //###############
36303 var Device = new r.Struct({
36304   a: r.uint16, // startSize for hinting Device, outerIndex for VariationIndex
36305   b: r.uint16, // endSize for Device, innerIndex for VariationIndex
36306   deltaFormat: r.uint16
36309 //#############################################
36310 // Contextual Substitution/Positioning Tables #
36311 //#############################################
36313 var LookupRecord = new r.Struct({
36314   sequenceIndex: r.uint16,
36315   lookupListIndex: r.uint16
36318 var Rule = new r.Struct({
36319   glyphCount: r.uint16,
36320   lookupCount: r.uint16,
36321   input: new r.Array(r.uint16, function (t) {
36322     return t.glyphCount - 1;
36323   }),
36324   lookupRecords: new r.Array(LookupRecord, 'lookupCount')
36327 var RuleSet = new r.Array(new r.Pointer(r.uint16, Rule), r.uint16);
36329 var ClassRule = new r.Struct({
36330   glyphCount: r.uint16,
36331   lookupCount: r.uint16,
36332   classes: new r.Array(r.uint16, function (t) {
36333     return t.glyphCount - 1;
36334   }),
36335   lookupRecords: new r.Array(LookupRecord, 'lookupCount')
36338 var ClassSet = new r.Array(new r.Pointer(r.uint16, ClassRule), r.uint16);
36340 var Context = new r.VersionedStruct(r.uint16, {
36341   1: { // Simple context
36342     coverage: new r.Pointer(r.uint16, Coverage),
36343     ruleSetCount: r.uint16,
36344     ruleSets: new r.Array(new r.Pointer(r.uint16, RuleSet), 'ruleSetCount')
36345   },
36346   2: { // Class-based context
36347     coverage: new r.Pointer(r.uint16, Coverage),
36348     classDef: new r.Pointer(r.uint16, ClassDef),
36349     classSetCnt: r.uint16,
36350     classSet: new r.Array(new r.Pointer(r.uint16, ClassSet), 'classSetCnt')
36351   },
36352   3: {
36353     glyphCount: r.uint16,
36354     lookupCount: r.uint16,
36355     coverages: new r.Array(new r.Pointer(r.uint16, Coverage), 'glyphCount'),
36356     lookupRecords: new r.Array(LookupRecord, 'lookupCount')
36357   }
36360 //######################################################
36361 // Chaining Contextual Substitution/Positioning Tables #
36362 //######################################################
36364 var ChainRule = new r.Struct({
36365   backtrackGlyphCount: r.uint16,
36366   backtrack: new r.Array(r.uint16, 'backtrackGlyphCount'),
36367   inputGlyphCount: r.uint16,
36368   input: new r.Array(r.uint16, function (t) {
36369     return t.inputGlyphCount - 1;
36370   }),
36371   lookaheadGlyphCount: r.uint16,
36372   lookahead: new r.Array(r.uint16, 'lookaheadGlyphCount'),
36373   lookupCount: r.uint16,
36374   lookupRecords: new r.Array(LookupRecord, 'lookupCount')
36377 var ChainRuleSet = new r.Array(new r.Pointer(r.uint16, ChainRule), r.uint16);
36379 var ChainingContext = new r.VersionedStruct(r.uint16, {
36380   1: { // Simple context glyph substitution
36381     coverage: new r.Pointer(r.uint16, Coverage),
36382     chainCount: r.uint16,
36383     chainRuleSets: new r.Array(new r.Pointer(r.uint16, ChainRuleSet), 'chainCount')
36384   },
36386   2: { // Class-based chaining context
36387     coverage: new r.Pointer(r.uint16, Coverage),
36388     backtrackClassDef: new r.Pointer(r.uint16, ClassDef),
36389     inputClassDef: new r.Pointer(r.uint16, ClassDef),
36390     lookaheadClassDef: new r.Pointer(r.uint16, ClassDef),
36391     chainCount: r.uint16,
36392     chainClassSet: new r.Array(new r.Pointer(r.uint16, ChainRuleSet), 'chainCount')
36393   },
36395   3: { // Coverage-based chaining context
36396     backtrackGlyphCount: r.uint16,
36397     backtrackCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'backtrackGlyphCount'),
36398     inputGlyphCount: r.uint16,
36399     inputCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'inputGlyphCount'),
36400     lookaheadGlyphCount: r.uint16,
36401     lookaheadCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'lookaheadGlyphCount'),
36402     lookupCount: r.uint16,
36403     lookupRecords: new r.Array(LookupRecord, 'lookupCount')
36404   }
36407 var _;
36409 /*******************
36410  * Variation Store *
36411  *******************/
36413 var F2DOT14 = new r.Fixed(16, 'BE', 14);
36414 var RegionAxisCoordinates = new r.Struct({
36415   startCoord: F2DOT14,
36416   peakCoord: F2DOT14,
36417   endCoord: F2DOT14
36420 var VariationRegionList = new r.Struct({
36421   axisCount: r.uint16,
36422   regionCount: r.uint16,
36423   variationRegions: new r.Array(new r.Array(RegionAxisCoordinates, 'axisCount'), 'regionCount')
36426 var DeltaSet = new r.Struct({
36427   shortDeltas: new r.Array(r.int16, function (t) {
36428     return t.parent.shortDeltaCount;
36429   }),
36430   regionDeltas: new r.Array(r.int8, function (t) {
36431     return t.parent.regionIndexCount - t.parent.shortDeltaCount;
36432   }),
36433   deltas: function deltas(t) {
36434     return t.shortDeltas.concat(t.regionDeltas);
36435   }
36438 var ItemVariationData = new r.Struct({
36439   itemCount: r.uint16,
36440   shortDeltaCount: r.uint16,
36441   regionIndexCount: r.uint16,
36442   regionIndexes: new r.Array(r.uint16, 'regionIndexCount'),
36443   deltaSets: new r.Array(DeltaSet, 'itemCount')
36446 var ItemVariationStore = new r.Struct({
36447   format: r.uint16,
36448   variationRegionList: new r.Pointer(r.uint32, VariationRegionList),
36449   variationDataCount: r.uint16,
36450   itemVariationData: new r.Array(new r.Pointer(r.uint32, ItemVariationData), 'variationDataCount')
36453 /**********************
36454  * Feature Variations *
36455  **********************/
36457 var ConditionTable = new r.VersionedStruct(r.uint16, {
36458   1: (_ = {
36459     axisIndex: r.uint16
36460   }, _['axisIndex'] = r.uint16, _.filterRangeMinValue = F2DOT14, _.filterRangeMaxValue = F2DOT14, _)
36463 var ConditionSet = new r.Struct({
36464   conditionCount: r.uint16,
36465   conditionTable: new r.Array(new r.Pointer(r.uint32, ConditionTable), 'conditionCount')
36468 var FeatureTableSubstitutionRecord = new r.Struct({
36469   featureIndex: r.uint16,
36470   alternateFeatureTable: new r.Pointer(r.uint32, Feature, { type: 'parent' })
36473 var FeatureTableSubstitution = new r.Struct({
36474   version: r.fixed32,
36475   substitutionCount: r.uint16,
36476   substitutions: new r.Array(FeatureTableSubstitutionRecord, 'substitutionCount')
36479 var FeatureVariationRecord = new r.Struct({
36480   conditionSet: new r.Pointer(r.uint32, ConditionSet, { type: 'parent' }),
36481   featureTableSubstitution: new r.Pointer(r.uint32, FeatureTableSubstitution, { type: 'parent' })
36484 var FeatureVariations = new r.Struct({
36485   majorVersion: r.uint16,
36486   minorVersion: r.uint16,
36487   featureVariationRecordCount: r.uint32,
36488   featureVariationRecords: new r.Array(FeatureVariationRecord, 'featureVariationRecordCount')
36491 // Checks if an operand is an index of a predefined value,
36492 // otherwise delegates to the provided type.
36494 var PredefinedOp = function () {
36495   function PredefinedOp(predefinedOps, type) {
36496     _classCallCheck(this, PredefinedOp);
36498     this.predefinedOps = predefinedOps;
36499     this.type = type;
36500   }
36502   PredefinedOp.prototype.decode = function decode(stream, parent, operands) {
36503     if (this.predefinedOps[operands[0]]) {
36504       return this.predefinedOps[operands[0]];
36505     }
36507     return this.type.decode(stream, parent, operands);
36508   };
36510   PredefinedOp.prototype.size = function size(value, ctx) {
36511     return this.type.size(value, ctx);
36512   };
36514   PredefinedOp.prototype.encode = function encode(stream, value, ctx) {
36515     var index = this.predefinedOps.indexOf(value);
36516     if (index !== -1) {
36517       return index;
36518     }
36520     return this.type.encode(stream, value, ctx);
36521   };
36523   return PredefinedOp;
36524 }();
36526 var CFFEncodingVersion = function (_r$Number) {
36527   _inherits(CFFEncodingVersion, _r$Number);
36529   function CFFEncodingVersion() {
36530     _classCallCheck(this, CFFEncodingVersion);
36532     return _possibleConstructorReturn(this, _r$Number.call(this, 'UInt8'));
36533   }
36535   CFFEncodingVersion.prototype.decode = function decode(stream) {
36536     return r.uint8.decode(stream) & 0x7f;
36537   };
36539   return CFFEncodingVersion;
36540 }(r.Number);
36542 var Range1 = new r.Struct({
36543   first: r.uint16,
36544   nLeft: r.uint8
36547 var Range2 = new r.Struct({
36548   first: r.uint16,
36549   nLeft: r.uint16
36552 var CFFCustomEncoding = new r.VersionedStruct(new CFFEncodingVersion(), {
36553   0: {
36554     nCodes: r.uint8,
36555     codes: new r.Array(r.uint8, 'nCodes')
36556   },
36558   1: {
36559     nRanges: r.uint8,
36560     ranges: new r.Array(Range1, 'nRanges')
36561   }
36563   // TODO: supplement?
36566 var CFFEncoding = new PredefinedOp([StandardEncoding, ExpertEncoding], new CFFPointer(CFFCustomEncoding, { lazy: true }));
36568 // Decodes an array of ranges until the total
36569 // length is equal to the provided length.
36571 var RangeArray = function (_r$Array) {
36572   _inherits(RangeArray, _r$Array);
36574   function RangeArray() {
36575     _classCallCheck(this, RangeArray);
36577     return _possibleConstructorReturn(this, _r$Array.apply(this, arguments));
36578   }
36580   RangeArray.prototype.decode = function decode(stream, parent) {
36581     var length = restructure_src_utils.resolveLength(this.length, stream, parent);
36582     var count = 0;
36583     var res = [];
36584     while (count < length) {
36585       var range = this.type.decode(stream, parent);
36586       range.offset = count;
36587       count += range.nLeft + 1;
36588       res.push(range);
36589     }
36591     return res;
36592   };
36594   return RangeArray;
36595 }(r.Array);
36597 var CFFCustomCharset = new r.VersionedStruct(r.uint8, {
36598   0: {
36599     glyphs: new r.Array(r.uint16, function (t) {
36600       return t.parent.CharStrings.length - 1;
36601     })
36602   },
36604   1: {
36605     ranges: new RangeArray(Range1, function (t) {
36606       return t.parent.CharStrings.length - 1;
36607     })
36608   },
36610   2: {
36611     ranges: new RangeArray(Range2, function (t) {
36612       return t.parent.CharStrings.length - 1;
36613     })
36614   }
36617 var CFFCharset = new PredefinedOp([ISOAdobeCharset, ExpertCharset, ExpertSubsetCharset], new CFFPointer(CFFCustomCharset, { lazy: true }));
36619 var FDRange3 = new r.Struct({
36620   first: r.uint16,
36621   fd: r.uint8
36624 var FDRange4 = new r.Struct({
36625   first: r.uint32,
36626   fd: r.uint16
36629 var FDSelect = new r.VersionedStruct(r.uint8, {
36630   0: {
36631     fds: new r.Array(r.uint8, function (t) {
36632       return t.parent.CharStrings.length;
36633     })
36634   },
36636   3: {
36637     nRanges: r.uint16,
36638     ranges: new r.Array(FDRange3, 'nRanges'),
36639     sentinel: r.uint16
36640   },
36642   4: {
36643     nRanges: r.uint32,
36644     ranges: new r.Array(FDRange4, 'nRanges'),
36645     sentinel: r.uint32
36646   }
36649 var ptr = new CFFPointer(CFFPrivateDict);
36651 var CFFPrivateOp = function () {
36652   function CFFPrivateOp() {
36653     _classCallCheck(this, CFFPrivateOp);
36654   }
36656   CFFPrivateOp.prototype.decode = function decode(stream, parent, operands) {
36657     parent.length = operands[0];
36658     return ptr.decode(stream, parent, [operands[1]]);
36659   };
36661   CFFPrivateOp.prototype.size = function size(dict, ctx) {
36662     return [CFFPrivateDict.size(dict, ctx, false), ptr.size(dict, ctx)[0]];
36663   };
36665   CFFPrivateOp.prototype.encode = function encode(stream, dict, ctx) {
36666     return [CFFPrivateDict.size(dict, ctx, false), ptr.encode(stream, dict, ctx)[0]];
36667   };
36669   return CFFPrivateOp;
36670 }();
36672 var FontDict = new CFFDict([
36673 // key       name                   type(s)                                 default
36674 [18, 'Private', new CFFPrivateOp(), null], [[12, 38], 'FontName', 'sid', null]]);
36676 var CFFTopDict = new CFFDict([
36677 // key       name                   type(s)                                 default
36678 [[12, 30], 'ROS', ['sid', 'sid', 'number'], null], [0, 'version', 'sid', null], [1, 'Notice', 'sid', null], [[12, 0], 'Copyright', 'sid', null], [2, 'FullName', 'sid', null], [3, 'FamilyName', 'sid', null], [4, 'Weight', 'sid', null], [[12, 1], 'isFixedPitch', 'boolean', false], [[12, 2], 'ItalicAngle', 'number', 0], [[12, 3], 'UnderlinePosition', 'number', -100], [[12, 4], 'UnderlineThickness', 'number', 50], [[12, 5], 'PaintType', 'number', 0], [[12, 6], 'CharstringType', 'number', 2], [[12, 7], 'FontMatrix', 'array', [0.001, 0, 0, 0.001, 0, 0]], [13, 'UniqueID', 'number', null], [5, 'FontBBox', 'array', [0, 0, 0, 0]], [[12, 8], 'StrokeWidth', 'number', 0], [14, 'XUID', 'array', null], [15, 'charset', CFFCharset, ISOAdobeCharset], [16, 'Encoding', CFFEncoding, StandardEncoding], [17, 'CharStrings', new CFFPointer(new CFFIndex()), null], [18, 'Private', new CFFPrivateOp(), null], [[12, 20], 'SyntheticBase', 'number', null], [[12, 21], 'PostScript', 'sid', null], [[12, 22], 'BaseFontName', 'sid', null], [[12, 23], 'BaseFontBlend', 'delta', null],
36680 // CID font specific
36681 [[12, 31], 'CIDFontVersion', 'number', 0], [[12, 32], 'CIDFontRevision', 'number', 0], [[12, 33], 'CIDFontType', 'number', 0], [[12, 34], 'CIDCount', 'number', 8720], [[12, 35], 'UIDBase', 'number', null], [[12, 37], 'FDSelect', new CFFPointer(FDSelect), null], [[12, 36], 'FDArray', new CFFPointer(new CFFIndex(FontDict)), null], [[12, 38], 'FontName', 'sid', null]]);
36683 var VariationStore = new r.Struct({
36684   length: r.uint16,
36685   itemVariationStore: ItemVariationStore
36688 var CFF2TopDict = new CFFDict([[[12, 7], 'FontMatrix', 'array', [0.001, 0, 0, 0.001, 0, 0]], [17, 'CharStrings', new CFFPointer(new CFFIndex()), null], [[12, 37], 'FDSelect', new CFFPointer(FDSelect), null], [[12, 36], 'FDArray', new CFFPointer(new CFFIndex(FontDict)), null], [24, 'vstore', new CFFPointer(VariationStore), null], [25, 'maxstack', 'number', 193]]);
36690 var CFFTop = new r.VersionedStruct(r.fixed16, {
36691   1: {
36692     hdrSize: r.uint8,
36693     offSize: r.uint8,
36694     nameIndex: new CFFIndex(new r.String('length')),
36695     topDictIndex: new CFFIndex(CFFTopDict),
36696     stringIndex: new CFFIndex(new r.String('length')),
36697     globalSubrIndex: new CFFIndex()
36698   },
36700   2: {
36701     hdrSize: r.uint8,
36702     length: r.uint16,
36703     topDict: CFF2TopDict,
36704     globalSubrIndex: new CFFIndex()
36705   }
36708 var CFFFont = function () {
36709   function CFFFont(stream) {
36710     _classCallCheck(this, CFFFont);
36712     this.stream = stream;
36713     this.decode();
36714   }
36716   CFFFont.decode = function decode(stream) {
36717     return new CFFFont(stream);
36718   };
36720   CFFFont.prototype.decode = function decode() {
36721     var start = this.stream.pos;
36722     var top = CFFTop.decode(this.stream);
36723     for (var key in top) {
36724       var val = top[key];
36725       this[key] = val;
36726     }
36728     if (this.version < 2) {
36729       if (this.topDictIndex.length !== 1) {
36730         throw new Error("Only a single font is allowed in CFF");
36731       }
36733       this.topDict = this.topDictIndex[0];
36734     }
36736     this.isCIDFont = this.topDict.ROS != null;
36737     return this;
36738   };
36740   CFFFont.prototype.string = function string(sid) {
36741     if (this.version >= 2) {
36742       return null;
36743     }
36745     if (sid < standardStrings.length) {
36746       return standardStrings[sid];
36747     }
36749     return this.stringIndex[sid - standardStrings.length];
36750   };
36752   CFFFont.prototype.getCharString = function getCharString(glyph) {
36753     this.stream.pos = this.topDict.CharStrings[glyph].offset;
36754     return this.stream.readBuffer(this.topDict.CharStrings[glyph].length);
36755   };
36757   CFFFont.prototype.getGlyphName = function getGlyphName(gid) {
36758     // CFF2 glyph names are in the post table.
36759     if (this.version >= 2) {
36760       return null;
36761     }
36763     // CID-keyed fonts don't have glyph names
36764     if (this.isCIDFont) {
36765       return null;
36766     }
36768     var charset = this.topDict.charset;
36770     if (Array.isArray(charset)) {
36771       return charset[gid];
36772     }
36774     if (gid === 0) {
36775       return '.notdef';
36776     }
36778     gid -= 1;
36780     switch (charset.version) {
36781       case 0:
36782         return this.string(charset.glyphs[gid]);
36784       case 1:
36785       case 2:
36786         for (var i = 0; i < charset.ranges.length; i++) {
36787           var range = charset.ranges[i];
36788           if (range.offset <= gid && gid <= range.offset + range.nLeft) {
36789             return this.string(range.first + (gid - range.offset));
36790           }
36791         }
36792         break;
36793     }
36795     return null;
36796   };
36798   CFFFont.prototype.fdForGlyph = function fdForGlyph(gid) {
36799     if (!this.topDict.FDSelect) {
36800       return null;
36801     }
36803     switch (this.topDict.FDSelect.version) {
36804       case 0:
36805         return this.topDict.FDSelect.fds[gid];
36807       case 3:
36808       case 4:
36809         var ranges = this.topDict.FDSelect.ranges;
36811         var low = 0;
36812         var high = ranges.length - 1;
36814         while (low <= high) {
36815           var mid = low + high >> 1;
36817           if (gid < ranges[mid].first) {
36818             high = mid - 1;
36819           } else if (mid < high && gid > ranges[mid + 1].first) {
36820             low = mid + 1;
36821           } else {
36822             return ranges[mid].fd;
36823           }
36824         }
36825       default:
36826         throw new Error('Unknown FDSelect version: ' + this.topDict.FDSelect.version);
36827     }
36828   };
36830   CFFFont.prototype.privateDictForGlyph = function privateDictForGlyph(gid) {
36831     if (this.topDict.FDSelect) {
36832       var fd = this.fdForGlyph(gid);
36833       if (this.topDict.FDArray[fd]) {
36834         return this.topDict.FDArray[fd].Private;
36835       }
36837       return null;
36838     }
36840     if (this.version < 2) {
36841       return this.topDict.Private;
36842     }
36844     return this.topDict.FDArray[0].Private;
36845   };
36847   _createClass(CFFFont, [{
36848     key: 'postscriptName',
36849     get: function get() {
36850       if (this.version < 2) {
36851         return this.nameIndex[0];
36852       }
36854       return null;
36855     }
36856   }, {
36857     key: 'fullName',
36858     get: function get() {
36859       return this.string(this.topDict.FullName);
36860     }
36861   }, {
36862     key: 'familyName',
36863     get: function get() {
36864       return this.string(this.topDict.FamilyName);
36865     }
36866   }]);
36868   return CFFFont;
36869 }();
36871 var VerticalOrigin = new r.Struct({
36872   glyphIndex: r.uint16,
36873   vertOriginY: r.int16
36876 var VORG = new r.Struct({
36877   majorVersion: r.uint16,
36878   minorVersion: r.uint16,
36879   defaultVertOriginY: r.int16,
36880   numVertOriginYMetrics: r.uint16,
36881   metrics: new r.Array(VerticalOrigin, 'numVertOriginYMetrics')
36884 var BigMetrics = new r.Struct({
36885   height: r.uint8,
36886   width: r.uint8,
36887   horiBearingX: r.int8,
36888   horiBearingY: r.int8,
36889   horiAdvance: r.uint8,
36890   vertBearingX: r.int8,
36891   vertBearingY: r.int8,
36892   vertAdvance: r.uint8
36895 var SmallMetrics = new r.Struct({
36896   height: r.uint8,
36897   width: r.uint8,
36898   bearingX: r.int8,
36899   bearingY: r.int8,
36900   advance: r.uint8
36903 var EBDTComponent = new r.Struct({
36904   glyph: r.uint16,
36905   xOffset: r.int8,
36906   yOffset: r.int8
36909 var ByteAligned = function ByteAligned() {
36910   _classCallCheck(this, ByteAligned);
36913 var BitAligned = function BitAligned() {
36914   _classCallCheck(this, BitAligned);
36917 var glyph = new r.VersionedStruct('version', {
36918   1: {
36919     metrics: SmallMetrics,
36920     data: ByteAligned
36921   },
36923   2: {
36924     metrics: SmallMetrics,
36925     data: BitAligned
36926   },
36928   // format 3 is deprecated
36929   // format 4 is not supported by Microsoft
36931   5: {
36932     data: BitAligned
36933   },
36935   6: {
36936     metrics: BigMetrics,
36937     data: ByteAligned
36938   },
36940   7: {
36941     metrics: BigMetrics,
36942     data: BitAligned
36943   },
36945   8: {
36946     metrics: SmallMetrics,
36947     pad: new r.Reserved(r.uint8),
36948     numComponents: r.uint16,
36949     components: new r.Array(EBDTComponent, 'numComponents')
36950   },
36952   9: {
36953     metrics: BigMetrics,
36954     pad: new r.Reserved(r.uint8),
36955     numComponents: r.uint16,
36956     components: new r.Array(EBDTComponent, 'numComponents')
36957   },
36959   17: {
36960     metrics: SmallMetrics,
36961     dataLen: r.uint32,
36962     data: new r.Buffer('dataLen')
36963   },
36965   18: {
36966     metrics: BigMetrics,
36967     dataLen: r.uint32,
36968     data: new r.Buffer('dataLen')
36969   },
36971   19: {
36972     dataLen: r.uint32,
36973     data: new r.Buffer('dataLen')
36974   }
36977 var SBitLineMetrics = new r.Struct({
36978   ascender: r.int8,
36979   descender: r.int8,
36980   widthMax: r.uint8,
36981   caretSlopeNumerator: r.int8,
36982   caretSlopeDenominator: r.int8,
36983   caretOffset: r.int8,
36984   minOriginSB: r.int8,
36985   minAdvanceSB: r.int8,
36986   maxBeforeBL: r.int8,
36987   minAfterBL: r.int8,
36988   pad: new r.Reserved(r.int8, 2)
36991 var CodeOffsetPair = new r.Struct({
36992   glyphCode: r.uint16,
36993   offset: r.uint16
36996 var IndexSubtable = new r.VersionedStruct(r.uint16, {
36997   header: {
36998     imageFormat: r.uint16,
36999     imageDataOffset: r.uint32
37000   },
37002   1: {
37003     offsetArray: new r.Array(r.uint32, function (t) {
37004       return t.parent.lastGlyphIndex - t.parent.firstGlyphIndex + 1;
37005     })
37006   },
37008   2: {
37009     imageSize: r.uint32,
37010     bigMetrics: BigMetrics
37011   },
37013   3: {
37014     offsetArray: new r.Array(r.uint16, function (t) {
37015       return t.parent.lastGlyphIndex - t.parent.firstGlyphIndex + 1;
37016     })
37017   },
37019   4: {
37020     numGlyphs: r.uint32,
37021     glyphArray: new r.Array(CodeOffsetPair, function (t) {
37022       return t.numGlyphs + 1;
37023     })
37024   },
37026   5: {
37027     imageSize: r.uint32,
37028     bigMetrics: BigMetrics,
37029     numGlyphs: r.uint32,
37030     glyphCodeArray: new r.Array(r.uint16, 'numGlyphs')
37031   }
37034 var IndexSubtableArray = new r.Struct({
37035   firstGlyphIndex: r.uint16,
37036   lastGlyphIndex: r.uint16,
37037   subtable: new r.Pointer(r.uint32, IndexSubtable)
37040 var BitmapSizeTable = new r.Struct({
37041   indexSubTableArray: new r.Pointer(r.uint32, new r.Array(IndexSubtableArray, 1), { type: 'parent' }),
37042   indexTablesSize: r.uint32,
37043   numberOfIndexSubTables: r.uint32,
37044   colorRef: r.uint32,
37045   hori: SBitLineMetrics,
37046   vert: SBitLineMetrics,
37047   startGlyphIndex: r.uint16,
37048   endGlyphIndex: r.uint16,
37049   ppemX: r.uint8,
37050   ppemY: r.uint8,
37051   bitDepth: r.uint8,
37052   flags: new r.Bitfield(r.uint8, ['horizontal', 'vertical'])
37055 var EBLC = new r.Struct({
37056   version: r.uint32, // 0x00020000
37057   numSizes: r.uint32,
37058   sizes: new r.Array(BitmapSizeTable, 'numSizes')
37061 var ImageTable = new r.Struct({
37062   ppem: r.uint16,
37063   resolution: r.uint16,
37064   imageOffsets: new r.Array(new r.Pointer(r.uint32, 'void'), function (t) {
37065     return t.parent.parent.maxp.numGlyphs + 1;
37066   })
37069 // This is the Apple sbix table, used by the "Apple Color Emoji" font.
37070 // It includes several image tables with images for each bitmap glyph
37071 // of several different sizes.
37072 var sbix = new r.Struct({
37073   version: r.uint16,
37074   flags: new r.Bitfield(r.uint16, ['renderOutlines']),
37075   numImgTables: r.uint32,
37076   imageTables: new r.Array(new r.Pointer(r.uint32, ImageTable), 'numImgTables')
37079 var LayerRecord = new r.Struct({
37080   gid: r.uint16, // Glyph ID of layer glyph (must be in z-order from bottom to top).
37081   paletteIndex: r.uint16 // Index value to use in the appropriate palette. This value must
37082 }); // be less than numPaletteEntries in the CPAL table, except for
37083 // the special case noted below. Each palette entry is 16 bits.
37084 // A palette index of 0xFFFF is a special case indicating that
37085 // the text foreground color should be used.
37087 var BaseGlyphRecord = new r.Struct({
37088   gid: r.uint16, // Glyph ID of reference glyph. This glyph is for reference only
37089   // and is not rendered for color.
37090   firstLayerIndex: r.uint16, // Index (from beginning of the Layer Records) to the layer record.
37091   // There will be numLayers consecutive entries for this base glyph.
37092   numLayers: r.uint16
37095 var COLR = new r.Struct({
37096   version: r.uint16,
37097   numBaseGlyphRecords: r.uint16,
37098   baseGlyphRecord: new r.Pointer(r.uint32, new r.Array(BaseGlyphRecord, 'numBaseGlyphRecords')),
37099   layerRecords: new r.Pointer(r.uint32, new r.Array(LayerRecord, 'numLayerRecords'), { lazy: true }),
37100   numLayerRecords: r.uint16
37103 var ColorRecord = new r.Struct({
37104   blue: r.uint8,
37105   green: r.uint8,
37106   red: r.uint8,
37107   alpha: r.uint8
37110 var CPAL = new r.VersionedStruct(r.uint16, {
37111   header: {
37112     numPaletteEntries: r.uint16,
37113     numPalettes: r.uint16,
37114     numColorRecords: r.uint16,
37115     colorRecords: new r.Pointer(r.uint32, new r.Array(ColorRecord, 'numColorRecords')),
37116     colorRecordIndices: new r.Array(r.uint16, 'numPalettes')
37117   },
37118   0: {},
37119   1: {
37120     offsetPaletteTypeArray: new r.Pointer(r.uint32, new r.Array(r.uint32, 'numPalettes')),
37121     offsetPaletteLabelArray: new r.Pointer(r.uint32, new r.Array(r.uint16, 'numPalettes')),
37122     offsetPaletteEntryLabelArray: new r.Pointer(r.uint32, new r.Array(r.uint16, 'numPaletteEntries'))
37123   }
37126 var BaseCoord = new r.VersionedStruct(r.uint16, {
37127   1: { // Design units only
37128     coordinate: r.int16 // X or Y value, in design units
37129   },
37131   2: { // Design units plus contour point
37132     coordinate: r.int16, // X or Y value, in design units
37133     referenceGlyph: r.uint16, // GlyphID of control glyph
37134     baseCoordPoint: r.uint16 // Index of contour point on the referenceGlyph
37135   },
37137   3: { // Design units plus Device table
37138     coordinate: r.int16, // X or Y value, in design units
37139     deviceTable: new r.Pointer(r.uint16, Device) // Device table for X or Y value
37140   }
37143 var BaseValues = new r.Struct({
37144   defaultIndex: r.uint16, // Index of default baseline for this script-same index in the BaseTagList
37145   baseCoordCount: r.uint16,
37146   baseCoords: new r.Array(new r.Pointer(r.uint16, BaseCoord), 'baseCoordCount')
37149 var FeatMinMaxRecord = new r.Struct({
37150   tag: new r.String(4), // 4-byte feature identification tag-must match FeatureTag in FeatureList
37151   minCoord: new r.Pointer(r.uint16, BaseCoord, { type: 'parent' }), // May be NULL
37152   maxCoord: new r.Pointer(r.uint16, BaseCoord, { type: 'parent' }) // May be NULL
37155 var MinMax = new r.Struct({
37156   minCoord: new r.Pointer(r.uint16, BaseCoord), // May be NULL
37157   maxCoord: new r.Pointer(r.uint16, BaseCoord), // May be NULL
37158   featMinMaxCount: r.uint16, // May be 0
37159   featMinMaxRecords: new r.Array(FeatMinMaxRecord, 'featMinMaxCount') // In alphabetical order
37162 var BaseLangSysRecord = new r.Struct({
37163   tag: new r.String(4), // 4-byte language system identification tag
37164   minMax: new r.Pointer(r.uint16, MinMax, { type: 'parent' })
37167 var BaseScript = new r.Struct({
37168   baseValues: new r.Pointer(r.uint16, BaseValues), // May be NULL
37169   defaultMinMax: new r.Pointer(r.uint16, MinMax), // May be NULL
37170   baseLangSysCount: r.uint16, // May be 0
37171   baseLangSysRecords: new r.Array(BaseLangSysRecord, 'baseLangSysCount') // in alphabetical order by BaseLangSysTag
37174 var BaseScriptRecord = new r.Struct({
37175   tag: new r.String(4), // 4-byte script identification tag
37176   script: new r.Pointer(r.uint16, BaseScript, { type: 'parent' })
37179 var BaseScriptList = new r.Array(BaseScriptRecord, r.uint16);
37181 // Array of 4-byte baseline identification tags-must be in alphabetical order
37182 var BaseTagList = new r.Array(new r.String(4), r.uint16);
37184 var Axis = new r.Struct({
37185   baseTagList: new r.Pointer(r.uint16, BaseTagList), // May be NULL
37186   baseScriptList: new r.Pointer(r.uint16, BaseScriptList)
37189 var BASE = new r.VersionedStruct(r.uint32, {
37190   header: {
37191     horizAxis: new r.Pointer(r.uint16, Axis), // May be NULL
37192     vertAxis: new r.Pointer(r.uint16, Axis) // May be NULL
37193   },
37195   0x00010000: {},
37196   0x00010001: {
37197     itemVariationStore: new r.Pointer(r.uint32, ItemVariationStore)
37198   }
37201 var AttachPoint = new r.Array(r.uint16, r.uint16);
37202 var AttachList = new r.Struct({
37203   coverage: new r.Pointer(r.uint16, Coverage),
37204   glyphCount: r.uint16,
37205   attachPoints: new r.Array(new r.Pointer(r.uint16, AttachPoint), 'glyphCount')
37208 var CaretValue = new r.VersionedStruct(r.uint16, {
37209   1: { // Design units only
37210     coordinate: r.int16
37211   },
37213   2: { // Contour point
37214     caretValuePoint: r.uint16
37215   },
37217   3: { // Design units plus Device table
37218     coordinate: r.int16,
37219     deviceTable: new r.Pointer(r.uint16, Device)
37220   }
37223 var LigGlyph = new r.Array(new r.Pointer(r.uint16, CaretValue), r.uint16);
37225 var LigCaretList = new r.Struct({
37226   coverage: new r.Pointer(r.uint16, Coverage),
37227   ligGlyphCount: r.uint16,
37228   ligGlyphs: new r.Array(new r.Pointer(r.uint16, LigGlyph), 'ligGlyphCount')
37231 var MarkGlyphSetsDef = new r.Struct({
37232   markSetTableFormat: r.uint16,
37233   markSetCount: r.uint16,
37234   coverage: new r.Array(new r.Pointer(r.uint32, Coverage), 'markSetCount')
37237 var GDEF = new r.VersionedStruct(r.uint32, {
37238   header: {
37239     glyphClassDef: new r.Pointer(r.uint16, ClassDef),
37240     attachList: new r.Pointer(r.uint16, AttachList),
37241     ligCaretList: new r.Pointer(r.uint16, LigCaretList),
37242     markAttachClassDef: new r.Pointer(r.uint16, ClassDef)
37243   },
37245   0x00010000: {},
37246   0x00010002: {
37247     markGlyphSetsDef: new r.Pointer(r.uint16, MarkGlyphSetsDef)
37248   },
37249   0x00010003: {
37250     markGlyphSetsDef: new r.Pointer(r.uint16, MarkGlyphSetsDef),
37251     itemVariationStore: new r.Pointer(r.uint32, ItemVariationStore)
37252   }
37255 var ValueFormat = new r.Bitfield(r.uint16, ['xPlacement', 'yPlacement', 'xAdvance', 'yAdvance', 'xPlaDevice', 'yPlaDevice', 'xAdvDevice', 'yAdvDevice']);
37257 var types = {
37258   xPlacement: r.int16,
37259   yPlacement: r.int16,
37260   xAdvance: r.int16,
37261   yAdvance: r.int16,
37262   xPlaDevice: new r.Pointer(r.uint16, Device, { type: 'global', relativeTo: 'rel' }),
37263   yPlaDevice: new r.Pointer(r.uint16, Device, { type: 'global', relativeTo: 'rel' }),
37264   xAdvDevice: new r.Pointer(r.uint16, Device, { type: 'global', relativeTo: 'rel' }),
37265   yAdvDevice: new r.Pointer(r.uint16, Device, { type: 'global', relativeTo: 'rel' })
37268 var ValueRecord = function () {
37269   function ValueRecord() {
37270     var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'valueFormat';
37272     _classCallCheck(this, ValueRecord);
37274     this.key = key;
37275   }
37277   ValueRecord.prototype.buildStruct = function buildStruct(parent) {
37278     var struct = parent;
37279     while (!struct[this.key] && struct.parent) {
37280       struct = struct.parent;
37281     }
37283     if (!struct[this.key]) return;
37285     var fields = {};
37286     fields.rel = function () {
37287       return struct._startOffset;
37288     };
37290     var format = struct[this.key];
37291     for (var key in format) {
37292       if (format[key]) {
37293         fields[key] = types[key];
37294       }
37295     }
37297     return new r.Struct(fields);
37298   };
37300   ValueRecord.prototype.size = function size(val, ctx) {
37301     return this.buildStruct(ctx).size(val, ctx);
37302   };
37304   ValueRecord.prototype.decode = function decode(stream, parent) {
37305     var res = this.buildStruct(parent).decode(stream, parent);
37306     delete res.rel;
37307     return res;
37308   };
37310   return ValueRecord;
37311 }();
37313 var PairValueRecord = new r.Struct({
37314   secondGlyph: r.uint16,
37315   value1: new ValueRecord('valueFormat1'),
37316   value2: new ValueRecord('valueFormat2')
37319 var PairSet = new r.Array(PairValueRecord, r.uint16);
37321 var Class2Record = new r.Struct({
37322   value1: new ValueRecord('valueFormat1'),
37323   value2: new ValueRecord('valueFormat2')
37326 var Anchor = new r.VersionedStruct(r.uint16, {
37327   1: { // Design units only
37328     xCoordinate: r.int16,
37329     yCoordinate: r.int16
37330   },
37332   2: { // Design units plus contour point
37333     xCoordinate: r.int16,
37334     yCoordinate: r.int16,
37335     anchorPoint: r.uint16
37336   },
37338   3: { // Design units plus Device tables
37339     xCoordinate: r.int16,
37340     yCoordinate: r.int16,
37341     xDeviceTable: new r.Pointer(r.uint16, Device),
37342     yDeviceTable: new r.Pointer(r.uint16, Device)
37343   }
37346 var EntryExitRecord = new r.Struct({
37347   entryAnchor: new r.Pointer(r.uint16, Anchor, { type: 'parent' }),
37348   exitAnchor: new r.Pointer(r.uint16, Anchor, { type: 'parent' })
37351 var MarkRecord = new r.Struct({
37352   class: r.uint16,
37353   markAnchor: new r.Pointer(r.uint16, Anchor, { type: 'parent' })
37356 var MarkArray = new r.Array(MarkRecord, r.uint16);
37358 var BaseRecord = new r.Array(new r.Pointer(r.uint16, Anchor), function (t) {
37359   return t.parent.classCount;
37361 var BaseArray = new r.Array(BaseRecord, r.uint16);
37363 var ComponentRecord = new r.Array(new r.Pointer(r.uint16, Anchor), function (t) {
37364   return t.parent.parent.classCount;
37366 var LigatureAttach = new r.Array(ComponentRecord, r.uint16);
37367 var LigatureArray = new r.Array(new r.Pointer(r.uint16, LigatureAttach), r.uint16);
37369 var GPOSLookup = new r.VersionedStruct('lookupType', {
37370   1: new r.VersionedStruct(r.uint16, { // Single Adjustment
37371     1: { // Single positioning value
37372       coverage: new r.Pointer(r.uint16, Coverage),
37373       valueFormat: ValueFormat,
37374       value: new ValueRecord()
37375     },
37376     2: {
37377       coverage: new r.Pointer(r.uint16, Coverage),
37378       valueFormat: ValueFormat,
37379       valueCount: r.uint16,
37380       values: new r.LazyArray(new ValueRecord(), 'valueCount')
37381     }
37382   }),
37384   2: new r.VersionedStruct(r.uint16, { // Pair Adjustment Positioning
37385     1: { // Adjustments for glyph pairs
37386       coverage: new r.Pointer(r.uint16, Coverage),
37387       valueFormat1: ValueFormat,
37388       valueFormat2: ValueFormat,
37389       pairSetCount: r.uint16,
37390       pairSets: new r.LazyArray(new r.Pointer(r.uint16, PairSet), 'pairSetCount')
37391     },
37393     2: { // Class pair adjustment
37394       coverage: new r.Pointer(r.uint16, Coverage),
37395       valueFormat1: ValueFormat,
37396       valueFormat2: ValueFormat,
37397       classDef1: new r.Pointer(r.uint16, ClassDef),
37398       classDef2: new r.Pointer(r.uint16, ClassDef),
37399       class1Count: r.uint16,
37400       class2Count: r.uint16,
37401       classRecords: new r.LazyArray(new r.LazyArray(Class2Record, 'class2Count'), 'class1Count')
37402     }
37403   }),
37405   3: { // Cursive Attachment Positioning
37406     format: r.uint16,
37407     coverage: new r.Pointer(r.uint16, Coverage),
37408     entryExitCount: r.uint16,
37409     entryExitRecords: new r.Array(EntryExitRecord, 'entryExitCount')
37410   },
37412   4: { // MarkToBase Attachment Positioning
37413     format: r.uint16,
37414     markCoverage: new r.Pointer(r.uint16, Coverage),
37415     baseCoverage: new r.Pointer(r.uint16, Coverage),
37416     classCount: r.uint16,
37417     markArray: new r.Pointer(r.uint16, MarkArray),
37418     baseArray: new r.Pointer(r.uint16, BaseArray)
37419   },
37421   5: { // MarkToLigature Attachment Positioning
37422     format: r.uint16,
37423     markCoverage: new r.Pointer(r.uint16, Coverage),
37424     ligatureCoverage: new r.Pointer(r.uint16, Coverage),
37425     classCount: r.uint16,
37426     markArray: new r.Pointer(r.uint16, MarkArray),
37427     ligatureArray: new r.Pointer(r.uint16, LigatureArray)
37428   },
37430   6: { // MarkToMark Attachment Positioning
37431     format: r.uint16,
37432     mark1Coverage: new r.Pointer(r.uint16, Coverage),
37433     mark2Coverage: new r.Pointer(r.uint16, Coverage),
37434     classCount: r.uint16,
37435     mark1Array: new r.Pointer(r.uint16, MarkArray),
37436     mark2Array: new r.Pointer(r.uint16, BaseArray)
37437   },
37439   7: Context, // Contextual positioning
37440   8: ChainingContext, // Chaining contextual positioning
37442   9: { // Extension Positioning
37443     posFormat: r.uint16,
37444     lookupType: r.uint16, // cannot also be 9
37445     extension: new r.Pointer(r.uint32, GPOSLookup)
37446   }
37449 // Fix circular reference
37450 GPOSLookup.versions[9].extension.type = GPOSLookup;
37452 var GPOS = new r.VersionedStruct(r.uint32, {
37453   header: {
37454     scriptList: new r.Pointer(r.uint16, ScriptList),
37455     featureList: new r.Pointer(r.uint16, FeatureList),
37456     lookupList: new r.Pointer(r.uint16, new LookupList(GPOSLookup))
37457   },
37459   0x00010000: {},
37460   0x00010001: {
37461     featureVariations: new r.Pointer(r.uint32, FeatureVariations)
37462   }
37465 var Sequence = new r.Array(r.uint16, r.uint16);
37466 var AlternateSet = Sequence;
37468 var Ligature = new r.Struct({
37469   glyph: r.uint16,
37470   compCount: r.uint16,
37471   components: new r.Array(r.uint16, function (t) {
37472     return t.compCount - 1;
37473   })
37476 var LigatureSet = new r.Array(new r.Pointer(r.uint16, Ligature), r.uint16);
37478 var GSUBLookup = new r.VersionedStruct('lookupType', {
37479   1: new r.VersionedStruct(r.uint16, { // Single Substitution
37480     1: {
37481       coverage: new r.Pointer(r.uint16, Coverage),
37482       deltaGlyphID: r.int16
37483     },
37484     2: {
37485       coverage: new r.Pointer(r.uint16, Coverage),
37486       glyphCount: r.uint16,
37487       substitute: new r.LazyArray(r.uint16, 'glyphCount')
37488     }
37489   }),
37491   2: { // Multiple Substitution
37492     substFormat: r.uint16,
37493     coverage: new r.Pointer(r.uint16, Coverage),
37494     count: r.uint16,
37495     sequences: new r.LazyArray(new r.Pointer(r.uint16, Sequence), 'count')
37496   },
37498   3: { // Alternate Substitution
37499     substFormat: r.uint16,
37500     coverage: new r.Pointer(r.uint16, Coverage),
37501     count: r.uint16,
37502     alternateSet: new r.LazyArray(new r.Pointer(r.uint16, AlternateSet), 'count')
37503   },
37505   4: { // Ligature Substitution
37506     substFormat: r.uint16,
37507     coverage: new r.Pointer(r.uint16, Coverage),
37508     count: r.uint16,
37509     ligatureSets: new r.LazyArray(new r.Pointer(r.uint16, LigatureSet), 'count')
37510   },
37512   5: Context, // Contextual Substitution
37513   6: ChainingContext, // Chaining Contextual Substitution
37515   7: { // Extension Substitution
37516     substFormat: r.uint16,
37517     lookupType: r.uint16, // cannot also be 7
37518     extension: new r.Pointer(r.uint32, GSUBLookup)
37519   },
37521   8: { // Reverse Chaining Contextual Single Substitution
37522     substFormat: r.uint16,
37523     coverage: new r.Pointer(r.uint16, Coverage),
37524     backtrackCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'backtrackGlyphCount'),
37525     lookaheadGlyphCount: r.uint16,
37526     lookaheadCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'lookaheadGlyphCount'),
37527     glyphCount: r.uint16,
37528     substitutes: new r.Array(r.uint16, 'glyphCount')
37529   }
37532 // Fix circular reference
37533 GSUBLookup.versions[7].extension.type = GSUBLookup;
37535 var GSUB = new r.VersionedStruct(r.uint32, {
37536   header: {
37537     scriptList: new r.Pointer(r.uint16, ScriptList),
37538     featureList: new r.Pointer(r.uint16, FeatureList),
37539     lookupList: new r.Pointer(r.uint16, new LookupList(GSUBLookup))
37540   },
37542   0x00010000: {},
37543   0x00010001: {
37544     featureVariations: new r.Pointer(r.uint32, FeatureVariations)
37545   }
37548 var JstfGSUBModList = new r.Array(r.uint16, r.uint16);
37550 var JstfPriority = new r.Struct({
37551   shrinkageEnableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),
37552   shrinkageDisableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),
37553   shrinkageEnableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),
37554   shrinkageDisableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),
37555   shrinkageJstfMax: new r.Pointer(r.uint16, new LookupList(GPOSLookup)),
37556   extensionEnableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),
37557   extensionDisableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),
37558   extensionEnableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),
37559   extensionDisableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),
37560   extensionJstfMax: new r.Pointer(r.uint16, new LookupList(GPOSLookup))
37563 var JstfLangSys = new r.Array(new r.Pointer(r.uint16, JstfPriority), r.uint16);
37565 var JstfLangSysRecord = new r.Struct({
37566   tag: new r.String(4),
37567   jstfLangSys: new r.Pointer(r.uint16, JstfLangSys)
37570 var JstfScript = new r.Struct({
37571   extenderGlyphs: new r.Pointer(r.uint16, new r.Array(r.uint16, r.uint16)), // array of glyphs to extend line length
37572   defaultLangSys: new r.Pointer(r.uint16, JstfLangSys),
37573   langSysCount: r.uint16,
37574   langSysRecords: new r.Array(JstfLangSysRecord, 'langSysCount')
37577 var JstfScriptRecord = new r.Struct({
37578   tag: new r.String(4),
37579   script: new r.Pointer(r.uint16, JstfScript, { type: 'parent' })
37582 var JSTF = new r.Struct({
37583   version: r.uint32, // should be 0x00010000
37584   scriptCount: r.uint16,
37585   scriptList: new r.Array(JstfScriptRecord, 'scriptCount')
37588 // TODO: add this to restructure
37590 var VariableSizeNumber = function () {
37591   function VariableSizeNumber(size) {
37592     _classCallCheck(this, VariableSizeNumber);
37594     this._size = size;
37595   }
37597   VariableSizeNumber.prototype.decode = function decode(stream, parent) {
37598     switch (this.size(0, parent)) {
37599       case 1:
37600         return stream.readUInt8();
37601       case 2:
37602         return stream.readUInt16BE();
37603       case 3:
37604         return stream.readUInt24BE();
37605       case 4:
37606         return stream.readUInt32BE();
37607     }
37608   };
37610   VariableSizeNumber.prototype.size = function size(val, parent) {
37611     return restructure_src_utils.resolveLength(this._size, null, parent);
37612   };
37614   return VariableSizeNumber;
37615 }();
37617 var MapDataEntry = new r.Struct({
37618   entry: new VariableSizeNumber(function (t) {
37619     return ((t.parent.entryFormat & 0x0030) >> 4) + 1;
37620   }),
37621   outerIndex: function outerIndex(t) {
37622     return t.entry >> (t.parent.entryFormat & 0x000F) + 1;
37623   },
37624   innerIndex: function innerIndex(t) {
37625     return t.entry & (1 << (t.parent.entryFormat & 0x000F) + 1) - 1;
37626   }
37629 var DeltaSetIndexMap = new r.Struct({
37630   entryFormat: r.uint16,
37631   mapCount: r.uint16,
37632   mapData: new r.Array(MapDataEntry, 'mapCount')
37635 var HVAR = new r.Struct({
37636   majorVersion: r.uint16,
37637   minorVersion: r.uint16,
37638   itemVariationStore: new r.Pointer(r.uint32, ItemVariationStore),
37639   advanceWidthMapping: new r.Pointer(r.uint32, DeltaSetIndexMap),
37640   LSBMapping: new r.Pointer(r.uint32, DeltaSetIndexMap),
37641   RSBMapping: new r.Pointer(r.uint32, DeltaSetIndexMap)
37644 var Signature = new r.Struct({
37645   format: r.uint32,
37646   length: r.uint32,
37647   offset: r.uint32
37650 var SignatureBlock = new r.Struct({
37651   reserved: new r.Reserved(r.uint16, 2),
37652   cbSignature: r.uint32, // Length (in bytes) of the PKCS#7 packet in pbSignature
37653   signature: new r.Buffer('cbSignature')
37656 var DSIG = new r.Struct({
37657   ulVersion: r.uint32, // Version number of the DSIG table (0x00000001)
37658   usNumSigs: r.uint16, // Number of signatures in the table
37659   usFlag: r.uint16, // Permission flags
37660   signatures: new r.Array(Signature, 'usNumSigs'),
37661   signatureBlocks: new r.Array(SignatureBlock, 'usNumSigs')
37664 var GaspRange = new r.Struct({
37665   rangeMaxPPEM: r.uint16, // Upper limit of range, in ppem
37666   rangeGaspBehavior: new r.Bitfield(r.uint16, [// Flags describing desired rasterizer behavior
37667   'grayscale', 'gridfit', 'symmetricSmoothing', 'symmetricGridfit' // only in version 1, for ClearType
37668   ])
37671 var gasp = new r.Struct({
37672   version: r.uint16, // set to 0
37673   numRanges: r.uint16,
37674   gaspRanges: new r.Array(GaspRange, 'numRanges') // Sorted by ppem
37677 var DeviceRecord = new r.Struct({
37678   pixelSize: r.uint8,
37679   maximumWidth: r.uint8,
37680   widths: new r.Array(r.uint8, function (t) {
37681     return t.parent.parent.maxp.numGlyphs;
37682   })
37685 // The Horizontal Device Metrics table stores integer advance widths scaled to particular pixel sizes
37686 var hdmx = new r.Struct({
37687   version: r.uint16,
37688   numRecords: r.int16,
37689   sizeDeviceRecord: r.int32,
37690   records: new r.Array(DeviceRecord, 'numRecords')
37693 var KernPair = new r.Struct({
37694   left: r.uint16,
37695   right: r.uint16,
37696   value: r.int16
37699 var ClassTable = new r.Struct({
37700   firstGlyph: r.uint16,
37701   nGlyphs: r.uint16,
37702   offsets: new r.Array(r.uint16, 'nGlyphs'),
37703   max: function max(t) {
37704     return t.offsets.length && Math.max.apply(Math, t.offsets);
37705   }
37708 var Kern2Array = new r.Struct({
37709   off: function off(t) {
37710     return t._startOffset - t.parent.parent._startOffset;
37711   },
37712   len: function len(t) {
37713     return ((t.parent.leftTable.max - t.off) / t.parent.rowWidth + 1) * (t.parent.rowWidth / 2);
37714   },
37715   values: new r.LazyArray(r.int16, 'len')
37718 var KernSubtable = new r.VersionedStruct('format', {
37719   0: {
37720     nPairs: r.uint16,
37721     searchRange: r.uint16,
37722     entrySelector: r.uint16,
37723     rangeShift: r.uint16,
37724     pairs: new r.Array(KernPair, 'nPairs')
37725   },
37727   2: {
37728     rowWidth: r.uint16,
37729     leftTable: new r.Pointer(r.uint16, ClassTable, { type: 'parent' }),
37730     rightTable: new r.Pointer(r.uint16, ClassTable, { type: 'parent' }),
37731     array: new r.Pointer(r.uint16, Kern2Array, { type: 'parent' })
37732   },
37734   3: {
37735     glyphCount: r.uint16,
37736     kernValueCount: r.uint8,
37737     leftClassCount: r.uint8,
37738     rightClassCount: r.uint8,
37739     flags: r.uint8,
37740     kernValue: new r.Array(r.int16, 'kernValueCount'),
37741     leftClass: new r.Array(r.uint8, 'glyphCount'),
37742     rightClass: new r.Array(r.uint8, 'glyphCount'),
37743     kernIndex: new r.Array(r.uint8, function (t) {
37744       return t.leftClassCount * t.rightClassCount;
37745     })
37746   }
37749 var KernTable = new r.VersionedStruct('version', {
37750   0: { // Microsoft uses this format
37751     subVersion: r.uint16, // Microsoft has an extra sub-table version number
37752     length: r.uint16, // Length of the subtable, in bytes
37753     format: r.uint8, // Format of subtable
37754     coverage: new r.Bitfield(r.uint8, ['horizontal', // 1 if table has horizontal data, 0 if vertical
37755     'minimum', // If set to 1, the table has minimum values. If set to 0, the table has kerning values.
37756     'crossStream', // If set to 1, kerning is perpendicular to the flow of the text
37757     'override' // If set to 1 the value in this table replaces the accumulated value
37758     ]),
37759     subtable: KernSubtable,
37760     padding: new r.Reserved(r.uint8, function (t) {
37761       return t.length - t._currentOffset;
37762     })
37763   },
37764   1: { // Apple uses this format
37765     length: r.uint32,
37766     coverage: new r.Bitfield(r.uint8, [null, null, null, null, null, 'variation', // Set if table has variation kerning values
37767     'crossStream', // Set if table has cross-stream kerning values
37768     'vertical' // Set if table has vertical kerning values
37769     ]),
37770     format: r.uint8,
37771     tupleIndex: r.uint16,
37772     subtable: KernSubtable,
37773     padding: new r.Reserved(r.uint8, function (t) {
37774       return t.length - t._currentOffset;
37775     })
37776   }
37779 var kern = new r.VersionedStruct(r.uint16, {
37780   0: { // Microsoft Version
37781     nTables: r.uint16,
37782     tables: new r.Array(KernTable, 'nTables')
37783   },
37785   1: { // Apple Version
37786     reserved: new r.Reserved(r.uint16), // the other half of the version number
37787     nTables: r.uint32,
37788     tables: new r.Array(KernTable, 'nTables')
37789   }
37792 // Linear Threshold table
37793 // Records the ppem for each glyph at which the scaling becomes linear again,
37794 // despite instructions effecting the advance width
37795 var LTSH = new r.Struct({
37796   version: r.uint16,
37797   numGlyphs: r.uint16,
37798   yPels: new r.Array(r.uint8, 'numGlyphs')
37801 // PCL 5 Table
37802 // NOTE: The PCLT table is strongly discouraged for OpenType fonts with TrueType outlines
37803 var PCLT = new r.Struct({
37804   version: r.uint16,
37805   fontNumber: r.uint32,
37806   pitch: r.uint16,
37807   xHeight: r.uint16,
37808   style: r.uint16,
37809   typeFamily: r.uint16,
37810   capHeight: r.uint16,
37811   symbolSet: r.uint16,
37812   typeface: new r.String(16),
37813   characterComplement: new r.String(8),
37814   fileName: new r.String(6),
37815   strokeWeight: new r.String(1),
37816   widthType: new r.String(1),
37817   serifStyle: r.uint8,
37818   reserved: new r.Reserved(r.uint8)
37821 // VDMX tables contain ascender/descender overrides for certain (usually small)
37822 // sizes. This is needed in order to match font metrics on Windows.
37824 var Ratio = new r.Struct({
37825   bCharSet: r.uint8, // Character set
37826   xRatio: r.uint8, // Value to use for x-Ratio
37827   yStartRatio: r.uint8, // Starting y-Ratio value
37828   yEndRatio: r.uint8 // Ending y-Ratio value
37831 var vTable = new r.Struct({
37832   yPelHeight: r.uint16, // yPelHeight to which values apply
37833   yMax: r.int16, // Maximum value (in pels) for this yPelHeight
37834   yMin: r.int16 // Minimum value (in pels) for this yPelHeight
37837 var VdmxGroup = new r.Struct({
37838   recs: r.uint16, // Number of height records in this group
37839   startsz: r.uint8, // Starting yPelHeight
37840   endsz: r.uint8, // Ending yPelHeight
37841   entries: new r.Array(vTable, 'recs') // The VDMX records
37844 var VDMX = new r.Struct({
37845   version: r.uint16, // Version number (0 or 1)
37846   numRecs: r.uint16, // Number of VDMX groups present
37847   numRatios: r.uint16, // Number of aspect ratio groupings
37848   ratioRanges: new r.Array(Ratio, 'numRatios'), // Ratio ranges
37849   offsets: new r.Array(r.uint16, 'numRatios'), // Offset to the VDMX group for this ratio range
37850   groups: new r.Array(VdmxGroup, 'numRecs') // The actual VDMX groupings
37853 // Vertical Header Table
37854 var vhea = new r.Struct({
37855   version: r.uint16, // Version number of the Vertical Header Table
37856   ascent: r.int16, // The vertical typographic ascender for this font
37857   descent: r.int16, // The vertical typographic descender for this font
37858   lineGap: r.int16, // The vertical typographic line gap for this font
37859   advanceHeightMax: r.int16, // The maximum advance height measurement found in the font
37860   minTopSideBearing: r.int16, // The minimum top side bearing measurement found in the font
37861   minBottomSideBearing: r.int16, // The minimum bottom side bearing measurement found in the font
37862   yMaxExtent: r.int16,
37863   caretSlopeRise: r.int16, // Caret slope (rise/run)
37864   caretSlopeRun: r.int16,
37865   caretOffset: r.int16, // Set value equal to 0 for nonslanted fonts
37866   reserved: new r.Reserved(r.int16, 4),
37867   metricDataFormat: r.int16, // Set to 0
37868   numberOfMetrics: r.uint16 // Number of advance heights in the Vertical Metrics table
37871 var VmtxEntry = new r.Struct({
37872   advance: r.uint16, // The advance height of the glyph
37873   bearing: r.int16 // The top sidebearing of the glyph
37876 // Vertical Metrics Table
37877 var vmtx = new r.Struct({
37878   metrics: new r.LazyArray(VmtxEntry, function (t) {
37879     return t.parent.vhea.numberOfMetrics;
37880   }),
37881   bearings: new r.LazyArray(r.int16, function (t) {
37882     return t.parent.maxp.numGlyphs - t.parent.vhea.numberOfMetrics;
37883   })
37886 var shortFrac = new r.Fixed(16, 'BE', 14);
37888 var Correspondence = new r.Struct({
37889   fromCoord: shortFrac,
37890   toCoord: shortFrac
37893 var Segment = new r.Struct({
37894   pairCount: r.uint16,
37895   correspondence: new r.Array(Correspondence, 'pairCount')
37898 var avar = new r.Struct({
37899   version: r.fixed32,
37900   axisCount: r.uint32,
37901   segment: new r.Array(Segment, 'axisCount')
37904 var UnboundedArrayAccessor = function () {
37905   function UnboundedArrayAccessor(type, stream, parent) {
37906     _classCallCheck(this, UnboundedArrayAccessor);
37908     this.type = type;
37909     this.stream = stream;
37910     this.parent = parent;
37911     this.base = this.stream.pos;
37912     this._items = [];
37913   }
37915   UnboundedArrayAccessor.prototype.getItem = function getItem(index) {
37916     if (this._items[index] == null) {
37917       var pos = this.stream.pos;
37918       this.stream.pos = this.base + this.type.size(null, this.parent) * index;
37919       this._items[index] = this.type.decode(this.stream, this.parent);
37920       this.stream.pos = pos;
37921     }
37923     return this._items[index];
37924   };
37926   UnboundedArrayAccessor.prototype.inspect = function inspect() {
37927     return '[UnboundedArray ' + this.type.constructor.name + ']';
37928   };
37930   return UnboundedArrayAccessor;
37931 }();
37933 var UnboundedArray = function (_r$Array) {
37934   _inherits(UnboundedArray, _r$Array);
37936   function UnboundedArray(type) {
37937     _classCallCheck(this, UnboundedArray);
37939     return _possibleConstructorReturn(this, _r$Array.call(this, type, 0));
37940   }
37942   UnboundedArray.prototype.decode = function decode(stream, parent) {
37943     return new UnboundedArrayAccessor(this.type, stream, parent);
37944   };
37946   return UnboundedArray;
37947 }(r.Array);
37949 var LookupTable = function LookupTable() {
37950   var ValueType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : r.uint16;
37952   // Helper class that makes internal structures invisible to pointers
37953   var Shadow = function () {
37954     function Shadow(type) {
37955       _classCallCheck(this, Shadow);
37957       this.type = type;
37958     }
37960     Shadow.prototype.decode = function decode(stream, ctx) {
37961       ctx = ctx.parent.parent;
37962       return this.type.decode(stream, ctx);
37963     };
37965     Shadow.prototype.size = function size(val, ctx) {
37966       ctx = ctx.parent.parent;
37967       return this.type.size(val, ctx);
37968     };
37970     Shadow.prototype.encode = function encode(stream, val, ctx) {
37971       ctx = ctx.parent.parent;
37972       return this.type.encode(stream, val, ctx);
37973     };
37975     return Shadow;
37976   }();
37978   ValueType = new Shadow(ValueType);
37980   var BinarySearchHeader = new r.Struct({
37981     unitSize: r.uint16,
37982     nUnits: r.uint16,
37983     searchRange: r.uint16,
37984     entrySelector: r.uint16,
37985     rangeShift: r.uint16
37986   });
37988   var LookupSegmentSingle = new r.Struct({
37989     lastGlyph: r.uint16,
37990     firstGlyph: r.uint16,
37991     value: ValueType
37992   });
37994   var LookupSegmentArray = new r.Struct({
37995     lastGlyph: r.uint16,
37996     firstGlyph: r.uint16,
37997     values: new r.Pointer(r.uint16, new r.Array(ValueType, function (t) {
37998       return t.lastGlyph - t.firstGlyph + 1;
37999     }), { type: 'parent' })
38000   });
38002   var LookupSingle = new r.Struct({
38003     glyph: r.uint16,
38004     value: ValueType
38005   });
38007   return new r.VersionedStruct(r.uint16, {
38008     0: {
38009       values: new UnboundedArray(ValueType) // length == number of glyphs maybe?
38010     },
38011     2: {
38012       binarySearchHeader: BinarySearchHeader,
38013       segments: new r.Array(LookupSegmentSingle, function (t) {
38014         return t.binarySearchHeader.nUnits;
38015       })
38016     },
38017     4: {
38018       binarySearchHeader: BinarySearchHeader,
38019       segments: new r.Array(LookupSegmentArray, function (t) {
38020         return t.binarySearchHeader.nUnits;
38021       })
38022     },
38023     6: {
38024       binarySearchHeader: BinarySearchHeader,
38025       segments: new r.Array(LookupSingle, function (t) {
38026         return t.binarySearchHeader.nUnits;
38027       })
38028     },
38029     8: {
38030       firstGlyph: r.uint16,
38031       count: r.uint16,
38032       values: new r.Array(ValueType, 'count')
38033     }
38034   });
38037 function StateTable() {
38038   var entryData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
38039   var lookupType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : r.uint16;
38041   var entry = _Object$assign({
38042     newState: r.uint16,
38043     flags: r.uint16
38044   }, entryData);
38046   var Entry = new r.Struct(entry);
38047   var StateArray = new UnboundedArray(new r.Array(r.uint16, function (t) {
38048     return t.nClasses;
38049   }));
38051   var StateHeader = new r.Struct({
38052     nClasses: r.uint32,
38053     classTable: new r.Pointer(r.uint32, new LookupTable(lookupType)),
38054     stateArray: new r.Pointer(r.uint32, StateArray),
38055     entryTable: new r.Pointer(r.uint32, new UnboundedArray(Entry))
38056   });
38058   return StateHeader;
38061 // This is the old version of the StateTable structure
38062 function StateTable1() {
38063   var entryData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
38064   var lookupType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : r.uint16;
38066   var ClassLookupTable = new r.Struct({
38067     version: function version() {
38068       return 8;
38069     },
38070     // simulate LookupTable
38071     firstGlyph: r.uint16,
38072     values: new r.Array(r.uint8, r.uint16)
38073   });
38075   var entry = _Object$assign({
38076     newStateOffset: r.uint16,
38077     // convert offset to stateArray index
38078     newState: function newState(t) {
38079       return (t.newStateOffset - (t.parent.stateArray.base - t.parent._startOffset)) / t.parent.nClasses;
38080     },
38081     flags: r.uint16
38082   }, entryData);
38084   var Entry = new r.Struct(entry);
38085   var StateArray = new UnboundedArray(new r.Array(r.uint8, function (t) {
38086     return t.nClasses;
38087   }));
38089   var StateHeader1 = new r.Struct({
38090     nClasses: r.uint16,
38091     classTable: new r.Pointer(r.uint16, ClassLookupTable),
38092     stateArray: new r.Pointer(r.uint16, StateArray),
38093     entryTable: new r.Pointer(r.uint16, new UnboundedArray(Entry))
38094   });
38096   return StateHeader1;
38099 var BslnSubtable = new r.VersionedStruct('format', {
38100   0: { // Distance-based, no mapping
38101     deltas: new r.Array(r.int16, 32)
38102   },
38104   1: { // Distance-based, with mapping
38105     deltas: new r.Array(r.int16, 32),
38106     mappingData: new LookupTable(r.uint16)
38107   },
38109   2: { // Control point-based, no mapping
38110     standardGlyph: r.uint16,
38111     controlPoints: new r.Array(r.uint16, 32)
38112   },
38114   3: { // Control point-based, with mapping
38115     standardGlyph: r.uint16,
38116     controlPoints: new r.Array(r.uint16, 32),
38117     mappingData: new LookupTable(r.uint16)
38118   }
38121 var bsln = new r.Struct({
38122   version: r.fixed32,
38123   format: r.uint16,
38124   defaultBaseline: r.uint16,
38125   subtable: BslnSubtable
38128 var Setting = new r.Struct({
38129   setting: r.uint16,
38130   nameIndex: r.int16,
38131   name: function name(t) {
38132     return t.parent.parent.parent.name.records.fontFeatures[t.nameIndex];
38133   }
38136 var FeatureName = new r.Struct({
38137   feature: r.uint16,
38138   nSettings: r.uint16,
38139   settingTable: new r.Pointer(r.uint32, new r.Array(Setting, 'nSettings'), { type: 'parent' }),
38140   featureFlags: new r.Bitfield(r.uint8, [null, null, null, null, null, null, 'hasDefault', 'exclusive']),
38141   defaultSetting: r.uint8,
38142   nameIndex: r.int16,
38143   name: function name(t) {
38144     return t.parent.parent.name.records.fontFeatures[t.nameIndex];
38145   }
38148 var feat = new r.Struct({
38149   version: r.fixed32,
38150   featureNameCount: r.uint16,
38151   reserved1: new r.Reserved(r.uint16),
38152   reserved2: new r.Reserved(r.uint32),
38153   featureNames: new r.Array(FeatureName, 'featureNameCount')
38156 var Axis$1 = new r.Struct({
38157   axisTag: new r.String(4),
38158   minValue: r.fixed32,
38159   defaultValue: r.fixed32,
38160   maxValue: r.fixed32,
38161   flags: r.uint16,
38162   nameID: r.uint16,
38163   name: function name(t) {
38164     return t.parent.parent.name.records.fontFeatures[t.nameID];
38165   }
38168 var Instance = new r.Struct({
38169   nameID: r.uint16,
38170   name: function name(t) {
38171     return t.parent.parent.name.records.fontFeatures[t.nameID];
38172   },
38173   flags: r.uint16,
38174   coord: new r.Array(r.fixed32, function (t) {
38175     return t.parent.axisCount;
38176   }),
38177   postscriptNameID: new r.Optional(r.uint16, function (t) {
38178     return t.parent.instanceSize - t._currentOffset > 0;
38179   })
38182 var fvar = new r.Struct({
38183   version: r.fixed32,
38184   offsetToData: r.uint16,
38185   countSizePairs: r.uint16,
38186   axisCount: r.uint16,
38187   axisSize: r.uint16,
38188   instanceCount: r.uint16,
38189   instanceSize: r.uint16,
38190   axis: new r.Array(Axis$1, 'axisCount'),
38191   instance: new r.Array(Instance, 'instanceCount')
38194 var shortFrac$1 = new r.Fixed(16, 'BE', 14);
38196 var Offset = function () {
38197   function Offset() {
38198     _classCallCheck(this, Offset);
38199   }
38201   Offset.decode = function decode(stream, parent) {
38202     // In short format, offsets are multiplied by 2.
38203     // This doesn't seem to be documented by Apple, but it
38204     // is implemented this way in Freetype.
38205     return parent.flags ? stream.readUInt32BE() : stream.readUInt16BE() * 2;
38206   };
38208   return Offset;
38209 }();
38211 var gvar = new r.Struct({
38212   version: r.uint16,
38213   reserved: new r.Reserved(r.uint16),
38214   axisCount: r.uint16,
38215   globalCoordCount: r.uint16,
38216   globalCoords: new r.Pointer(r.uint32, new r.Array(new r.Array(shortFrac$1, 'axisCount'), 'globalCoordCount')),
38217   glyphCount: r.uint16,
38218   flags: r.uint16,
38219   offsetToData: r.uint32,
38220   offsets: new r.Array(new r.Pointer(Offset, 'void', { relativeTo: 'offsetToData', allowNull: false }), function (t) {
38221     return t.glyphCount + 1;
38222   })
38225 var ClassTable$1 = new r.Struct({
38226   length: r.uint16,
38227   coverage: r.uint16,
38228   subFeatureFlags: r.uint32,
38229   stateTable: new StateTable1()
38232 var WidthDeltaRecord = new r.Struct({
38233   justClass: r.uint32,
38234   beforeGrowLimit: r.fixed32,
38235   beforeShrinkLimit: r.fixed32,
38236   afterGrowLimit: r.fixed32,
38237   afterShrinkLimit: r.fixed32,
38238   growFlags: r.uint16,
38239   shrinkFlags: r.uint16
38242 var WidthDeltaCluster = new r.Array(WidthDeltaRecord, r.uint32);
38244 var ActionData = new r.VersionedStruct('actionType', {
38245   0: { // Decomposition action
38246     lowerLimit: r.fixed32,
38247     upperLimit: r.fixed32,
38248     order: r.uint16,
38249     glyphs: new r.Array(r.uint16, r.uint16)
38250   },
38252   1: { // Unconditional add glyph action
38253     addGlyph: r.uint16
38254   },
38256   2: { // Conditional add glyph action
38257     substThreshold: r.fixed32,
38258     addGlyph: r.uint16,
38259     substGlyph: r.uint16
38260   },
38262   3: {}, // Stretch glyph action (no data, not supported by CoreText)
38264   4: { // Ductile glyph action (not supported by CoreText)
38265     variationAxis: r.uint32,
38266     minimumLimit: r.fixed32,
38267     noStretchValue: r.fixed32,
38268     maximumLimit: r.fixed32
38269   },
38271   5: { // Repeated add glyph action
38272     flags: r.uint16,
38273     glyph: r.uint16
38274   }
38277 var Action = new r.Struct({
38278   actionClass: r.uint16,
38279   actionType: r.uint16,
38280   actionLength: r.uint32,
38281   actionData: ActionData,
38282   padding: new r.Reserved(r.uint8, function (t) {
38283     return t.actionLength - t._currentOffset;
38284   })
38287 var PostcompensationAction = new r.Array(Action, r.uint32);
38288 var PostCompensationTable = new r.Struct({
38289   lookupTable: new LookupTable(new r.Pointer(r.uint16, PostcompensationAction))
38292 var JustificationTable = new r.Struct({
38293   classTable: new r.Pointer(r.uint16, ClassTable$1, { type: 'parent' }),
38294   wdcOffset: r.uint16,
38295   postCompensationTable: new r.Pointer(r.uint16, PostCompensationTable, { type: 'parent' }),
38296   widthDeltaClusters: new LookupTable(new r.Pointer(r.uint16, WidthDeltaCluster, { type: 'parent', relativeTo: 'wdcOffset' }))
38299 var just = new r.Struct({
38300   version: r.uint32,
38301   format: r.uint16,
38302   horizontal: new r.Pointer(r.uint16, JustificationTable),
38303   vertical: new r.Pointer(r.uint16, JustificationTable)
38306 var LigatureData = {
38307   action: r.uint16
38310 var ContextualData = {
38311   markIndex: r.uint16,
38312   currentIndex: r.uint16
38315 var InsertionData = {
38316   currentInsertIndex: r.uint16,
38317   markedInsertIndex: r.uint16
38320 var SubstitutionTable = new r.Struct({
38321   items: new UnboundedArray(new r.Pointer(r.uint32, new LookupTable()))
38324 var SubtableData = new r.VersionedStruct('type', {
38325   0: { // Indic Rearrangement Subtable
38326     stateTable: new StateTable()
38327   },
38329   1: { // Contextual Glyph Substitution Subtable
38330     stateTable: new StateTable(ContextualData),
38331     substitutionTable: new r.Pointer(r.uint32, SubstitutionTable)
38332   },
38334   2: { // Ligature subtable
38335     stateTable: new StateTable(LigatureData),
38336     ligatureActions: new r.Pointer(r.uint32, new UnboundedArray(r.uint32)),
38337     components: new r.Pointer(r.uint32, new UnboundedArray(r.uint16)),
38338     ligatureList: new r.Pointer(r.uint32, new UnboundedArray(r.uint16))
38339   },
38341   4: { // Non-contextual Glyph Substitution Subtable
38342     lookupTable: new LookupTable()
38343   },
38345   5: { // Glyph Insertion Subtable
38346     stateTable: new StateTable(InsertionData),
38347     insertionActions: new r.Pointer(r.uint32, new UnboundedArray(r.uint16))
38348   }
38351 var Subtable = new r.Struct({
38352   length: r.uint32,
38353   coverage: r.uint24,
38354   type: r.uint8,
38355   subFeatureFlags: r.uint32,
38356   table: SubtableData,
38357   padding: new r.Reserved(r.uint8, function (t) {
38358     return t.length - t._currentOffset;
38359   })
38362 var FeatureEntry = new r.Struct({
38363   featureType: r.uint16,
38364   featureSetting: r.uint16,
38365   enableFlags: r.uint32,
38366   disableFlags: r.uint32
38369 var MorxChain = new r.Struct({
38370   defaultFlags: r.uint32,
38371   chainLength: r.uint32,
38372   nFeatureEntries: r.uint32,
38373   nSubtables: r.uint32,
38374   features: new r.Array(FeatureEntry, 'nFeatureEntries'),
38375   subtables: new r.Array(Subtable, 'nSubtables')
38378 var morx = new r.Struct({
38379   version: r.uint16,
38380   unused: new r.Reserved(r.uint16),
38381   nChains: r.uint32,
38382   chains: new r.Array(MorxChain, 'nChains')
38385 var OpticalBounds = new r.Struct({
38386   left: r.int16,
38387   top: r.int16,
38388   right: r.int16,
38389   bottom: r.int16
38392 var opbd = new r.Struct({
38393   version: r.fixed32,
38394   format: r.uint16,
38395   lookupTable: new LookupTable(OpticalBounds)
38398 var tables = {};
38399 // Required Tables
38400 tables.cmap = cmap;
38401 tables.head = head;
38402 tables.hhea = hhea;
38403 tables.hmtx = hmtx;
38404 tables.maxp = maxp;
38405 tables.name = NameTable;
38406 tables['OS/2'] = OS2;
38407 tables.post = post;
38409 // TrueType Outlines
38410 tables.fpgm = fpgm;
38411 tables.loca = loca;
38412 tables.prep = prep;
38413 tables['cvt '] = cvt;
38414 tables.glyf = glyf;
38416 // PostScript Outlines
38417 tables['CFF '] = CFFFont;
38418 tables['CFF2'] = CFFFont;
38419 tables.VORG = VORG;
38421 // Bitmap Glyphs
38422 tables.EBLC = EBLC;
38423 tables.CBLC = tables.EBLC;
38424 tables.sbix = sbix;
38425 tables.COLR = COLR;
38426 tables.CPAL = CPAL;
38428 // Advanced OpenType Tables
38429 tables.BASE = BASE;
38430 tables.GDEF = GDEF;
38431 tables.GPOS = GPOS;
38432 tables.GSUB = GSUB;
38433 tables.JSTF = JSTF;
38435 // OpenType variations tables
38436 tables.HVAR = HVAR;
38438 // Other OpenType Tables
38439 tables.DSIG = DSIG;
38440 tables.gasp = gasp;
38441 tables.hdmx = hdmx;
38442 tables.kern = kern;
38443 tables.LTSH = LTSH;
38444 tables.PCLT = PCLT;
38445 tables.VDMX = VDMX;
38446 tables.vhea = vhea;
38447 tables.vmtx = vmtx;
38449 // Apple Advanced Typography Tables
38450 tables.avar = avar;
38451 tables.bsln = bsln;
38452 tables.feat = feat;
38453 tables.fvar = fvar;
38454 tables.gvar = gvar;
38455 tables.just = just;
38456 tables.morx = morx;
38457 tables.opbd = opbd;
38459 var TableEntry = new r.Struct({
38460   tag: new r.String(4),
38461   checkSum: r.uint32,
38462   offset: new r.Pointer(r.uint32, 'void', { type: 'global' }),
38463   length: r.uint32
38466 var Directory = new r.Struct({
38467   tag: new r.String(4),
38468   numTables: r.uint16,
38469   searchRange: r.uint16,
38470   entrySelector: r.uint16,
38471   rangeShift: r.uint16,
38472   tables: new r.Array(TableEntry, 'numTables')
38475 Directory.process = function () {
38476   var tables = {};
38477   for (var _iterator = this.tables, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
38478     var _ref;
38480     if (_isArray) {
38481       if (_i >= _iterator.length) break;
38482       _ref = _iterator[_i++];
38483     } else {
38484       _i = _iterator.next();
38485       if (_i.done) break;
38486       _ref = _i.value;
38487     }
38489     var table = _ref;
38491     tables[table.tag] = table;
38492   }
38494   this.tables = tables;
38497 Directory.preEncode = function (stream) {
38498   var tables$$ = [];
38499   for (var tag in this.tables) {
38500     var table = this.tables[tag];
38501     if (table) {
38502       tables$$.push({
38503         tag: tag,
38504         checkSum: 0,
38505         offset: new r.VoidPointer(tables[tag], table),
38506         length: tables[tag].size(table)
38507       });
38508     }
38509   }
38511   this.tag = 'true';
38512   this.numTables = tables$$.length;
38513   this.tables = tables$$;
38515   this.searchRange = Math.floor(Math.log(this.numTables) / Math.LN2) * 16;
38516   this.entrySelector = Math.floor(this.searchRange / Math.LN2);
38517   this.rangeShift = this.numTables * 16 - this.searchRange;
38520 function binarySearch(arr, cmp) {
38521   var min = 0;
38522   var max = arr.length - 1;
38523   while (min <= max) {
38524     var mid = min + max >> 1;
38525     var res = cmp(arr[mid]);
38527     if (res < 0) {
38528       max = mid - 1;
38529     } else if (res > 0) {
38530       min = mid + 1;
38531     } else {
38532       return mid;
38533     }
38534   }
38536   return -1;
38539 function range(index, end) {
38540   var range = [];
38541   while (index < end) {
38542     range.push(index++);
38543   }
38544   return range;
38547 var _class$1;
38548 function _applyDecoratedDescriptor$1(target, property, decorators, descriptor, context) {
38549   var desc = {};
38550   Object['ke' + 'ys'](descriptor).forEach(function (key) {
38551     desc[key] = descriptor[key];
38552   });
38553   desc.enumerable = !!desc.enumerable;
38554   desc.configurable = !!desc.configurable;
38556   if ('value' in desc || desc.initializer) {
38557     desc.writable = true;
38558   }
38560   desc = decorators.slice().reverse().reduce(function (desc, decorator) {
38561     return decorator(target, property, desc) || desc;
38562   }, desc);
38564   if (context && desc.initializer !== void 0) {
38565     desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
38566     desc.initializer = undefined;
38567   }
38569   if (desc.initializer === void 0) {
38570     Object['define' + 'Property'](target, property, desc);
38571     desc = null;
38572   }
38574   return desc;
38577 // iconv-lite is an optional dependency.
38578 try {
38579   var iconv = __webpack_require__(52);
38580 } catch (err) {}
38582 var CmapProcessor = (_class$1 = function () {
38583   function CmapProcessor(cmapTable) {
38584     _classCallCheck(this, CmapProcessor);
38586     // Attempt to find a Unicode cmap first
38587     this.encoding = null;
38588     this.cmap = this.findSubtable(cmapTable, [
38589     // 32-bit subtables
38590     [3, 10], [0, 6], [0, 4],
38592     // 16-bit subtables
38593     [3, 1], [0, 3], [0, 2], [0, 1], [0, 0]]);
38595     // If not unicode cmap was found, and iconv-lite is installed,
38596     // take the first table with a supported encoding.
38597     if (!this.cmap && iconv) {
38598       for (var _iterator = cmapTable.tables, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
38599         var _ref;
38601         if (_isArray) {
38602           if (_i >= _iterator.length) break;
38603           _ref = _iterator[_i++];
38604         } else {
38605           _i = _iterator.next();
38606           if (_i.done) break;
38607           _ref = _i.value;
38608         }
38610         var cmap = _ref;
38612         var encoding = getEncoding(cmap.platformID, cmap.encodingID, cmap.table.language - 1);
38613         if (iconv.encodingExists(encoding)) {
38614           this.cmap = cmap.table;
38615           this.encoding = encoding;
38616         }
38617       }
38618     }
38620     if (!this.cmap) {
38621       throw new Error("Could not find a supported cmap table");
38622     }
38624     this.uvs = this.findSubtable(cmapTable, [[0, 5]]);
38625     if (this.uvs && this.uvs.version !== 14) {
38626       this.uvs = null;
38627     }
38628   }
38630   CmapProcessor.prototype.findSubtable = function findSubtable(cmapTable, pairs) {
38631     for (var _iterator2 = pairs, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
38632       var _ref2;
38634       if (_isArray2) {
38635         if (_i2 >= _iterator2.length) break;
38636         _ref2 = _iterator2[_i2++];
38637       } else {
38638         _i2 = _iterator2.next();
38639         if (_i2.done) break;
38640         _ref2 = _i2.value;
38641       }
38643       var _ref3 = _ref2,
38644           platformID = _ref3[0],
38645           encodingID = _ref3[1];
38647       for (var _iterator3 = cmapTable.tables, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
38648         var _ref4;
38650         if (_isArray3) {
38651           if (_i3 >= _iterator3.length) break;
38652           _ref4 = _iterator3[_i3++];
38653         } else {
38654           _i3 = _iterator3.next();
38655           if (_i3.done) break;
38656           _ref4 = _i3.value;
38657         }
38659         var cmap = _ref4;
38661         if (cmap.platformID === platformID && cmap.encodingID === encodingID) {
38662           return cmap.table;
38663         }
38664       }
38665     }
38667     return null;
38668   };
38670   CmapProcessor.prototype.lookup = function lookup(codepoint, variationSelector) {
38671     // If there is no Unicode cmap in this font, we need to re-encode
38672     // the codepoint in the encoding that the cmap supports.
38673     if (this.encoding) {
38674       var buf = iconv.encode(_String$fromCodePoint(codepoint), this.encoding);
38675       codepoint = 0;
38676       for (var i = 0; i < buf.length; i++) {
38677         codepoint = codepoint << 8 | buf[i];
38678       }
38680       // Otherwise, try to get a Unicode variation selector for this codepoint if one is provided.
38681     } else if (variationSelector) {
38682       var gid = this.getVariationSelector(codepoint, variationSelector);
38683       if (gid) {
38684         return gid;
38685       }
38686     }
38688     var cmap = this.cmap;
38689     switch (cmap.version) {
38690       case 0:
38691         return cmap.codeMap.get(codepoint) || 0;
38693       case 4:
38694         {
38695           var min = 0;
38696           var max = cmap.segCount - 1;
38697           while (min <= max) {
38698             var mid = min + max >> 1;
38700             if (codepoint < cmap.startCode.get(mid)) {
38701               max = mid - 1;
38702             } else if (codepoint > cmap.endCode.get(mid)) {
38703               min = mid + 1;
38704             } else {
38705               var rangeOffset = cmap.idRangeOffset.get(mid);
38706               var _gid = void 0;
38708               if (rangeOffset === 0) {
38709                 _gid = codepoint + cmap.idDelta.get(mid);
38710               } else {
38711                 var index = rangeOffset / 2 + (codepoint - cmap.startCode.get(mid)) - (cmap.segCount - mid);
38712                 _gid = cmap.glyphIndexArray.get(index) || 0;
38713                 if (_gid !== 0) {
38714                   _gid += cmap.idDelta.get(mid);
38715                 }
38716               }
38718               return _gid & 0xffff;
38719             }
38720           }
38722           return 0;
38723         }
38725       case 8:
38726         throw new Error('TODO: cmap format 8');
38728       case 6:
38729       case 10:
38730         return cmap.glyphIndices.get(codepoint - cmap.firstCode) || 0;
38732       case 12:
38733       case 13:
38734         {
38735           var _min = 0;
38736           var _max = cmap.nGroups - 1;
38737           while (_min <= _max) {
38738             var _mid = _min + _max >> 1;
38739             var group = cmap.groups.get(_mid);
38741             if (codepoint < group.startCharCode) {
38742               _max = _mid - 1;
38743             } else if (codepoint > group.endCharCode) {
38744               _min = _mid + 1;
38745             } else {
38746               if (cmap.version === 12) {
38747                 return group.glyphID + (codepoint - group.startCharCode);
38748               } else {
38749                 return group.glyphID;
38750               }
38751             }
38752           }
38754           return 0;
38755         }
38757       case 14:
38758         throw new Error('TODO: cmap format 14');
38760       default:
38761         throw new Error('Unknown cmap format ' + cmap.version);
38762     }
38763   };
38765   CmapProcessor.prototype.getVariationSelector = function getVariationSelector(codepoint, variationSelector) {
38766     if (!this.uvs) {
38767       return 0;
38768     }
38770     var selectors = this.uvs.varSelectors.toArray();
38771     var i = binarySearch(selectors, function (x) {
38772       return variationSelector - x.varSelector;
38773     });
38774     var sel = selectors[i];
38776     if (i !== -1 && sel.defaultUVS) {
38777       i = binarySearch(sel.defaultUVS, function (x) {
38778         return codepoint < x.startUnicodeValue ? -1 : codepoint > x.startUnicodeValue + x.additionalCount ? +1 : 0;
38779       });
38780     }
38782     if (i !== -1 && sel.nonDefaultUVS) {
38783       i = binarySearch(sel.nonDefaultUVS, function (x) {
38784         return codepoint - x.unicodeValue;
38785       });
38786       if (i !== -1) {
38787         return sel.nonDefaultUVS[i].glyphID;
38788       }
38789     }
38791     return 0;
38792   };
38794   CmapProcessor.prototype.getCharacterSet = function getCharacterSet() {
38795     var cmap = this.cmap;
38796     switch (cmap.version) {
38797       case 0:
38798         return range(0, cmap.codeMap.length);
38800       case 4:
38801         {
38802           var res = [];
38803           var endCodes = cmap.endCode.toArray();
38804           for (var i = 0; i < endCodes.length; i++) {
38805             var tail = endCodes[i] + 1;
38806             var start = cmap.startCode.get(i);
38807             res.push.apply(res, range(start, tail));
38808           }
38810           return res;
38811         }
38813       case 8:
38814         throw new Error('TODO: cmap format 8');
38816       case 6:
38817       case 10:
38818         return range(cmap.firstCode, cmap.firstCode + cmap.glyphIndices.length);
38820       case 12:
38821       case 13:
38822         {
38823           var _res = [];
38824           for (var _iterator4 = cmap.groups.toArray(), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _getIterator(_iterator4);;) {
38825             var _ref5;
38827             if (_isArray4) {
38828               if (_i4 >= _iterator4.length) break;
38829               _ref5 = _iterator4[_i4++];
38830             } else {
38831               _i4 = _iterator4.next();
38832               if (_i4.done) break;
38833               _ref5 = _i4.value;
38834             }
38836             var group = _ref5;
38838             _res.push.apply(_res, range(group.startCharCode, group.endCharCode + 1));
38839           }
38841           return _res;
38842         }
38844       case 14:
38845         throw new Error('TODO: cmap format 14');
38847       default:
38848         throw new Error('Unknown cmap format ' + cmap.version);
38849     }
38850   };
38852   CmapProcessor.prototype.codePointsForGlyph = function codePointsForGlyph(gid) {
38853     var cmap = this.cmap;
38854     switch (cmap.version) {
38855       case 0:
38856         {
38857           var res = [];
38858           for (var i = 0; i < 256; i++) {
38859             if (cmap.codeMap.get(i) === gid) {
38860               res.push(i);
38861             }
38862           }
38864           return res;
38865         }
38867       case 4:
38868         {
38869           var _res2 = [];
38870           for (var _i5 = 0; _i5 < cmap.segCount; _i5++) {
38871             var end = cmap.endCode.get(_i5);
38872             var start = cmap.startCode.get(_i5);
38873             var rangeOffset = cmap.idRangeOffset.get(_i5);
38874             var delta = cmap.idDelta.get(_i5);
38876             for (var c = start; c <= end; c++) {
38877               var g = 0;
38878               if (rangeOffset === 0) {
38879                 g = c + delta;
38880               } else {
38881                 var index = rangeOffset / 2 + (c - start) - (cmap.segCount - _i5);
38882                 g = cmap.glyphIndexArray.get(index) || 0;
38883                 if (g !== 0) {
38884                   g += delta;
38885                 }
38886               }
38888               if (g === gid) {
38889                 _res2.push(c);
38890               }
38891             }
38892           }
38894           return _res2;
38895         }
38897       case 12:
38898         {
38899           var _res3 = [];
38900           for (var _iterator5 = cmap.groups.toArray(), _isArray5 = Array.isArray(_iterator5), _i6 = 0, _iterator5 = _isArray5 ? _iterator5 : _getIterator(_iterator5);;) {
38901             var _ref6;
38903             if (_isArray5) {
38904               if (_i6 >= _iterator5.length) break;
38905               _ref6 = _iterator5[_i6++];
38906             } else {
38907               _i6 = _iterator5.next();
38908               if (_i6.done) break;
38909               _ref6 = _i6.value;
38910             }
38912             var group = _ref6;
38914             if (gid >= group.glyphID && gid <= group.glyphID + (group.endCharCode - group.startCharCode)) {
38915               _res3.push(group.startCharCode + (gid - group.glyphID));
38916             }
38917           }
38919           return _res3;
38920         }
38922       case 13:
38923         {
38924           var _res4 = [];
38925           for (var _iterator6 = cmap.groups.toArray(), _isArray6 = Array.isArray(_iterator6), _i7 = 0, _iterator6 = _isArray6 ? _iterator6 : _getIterator(_iterator6);;) {
38926             var _ref7;
38928             if (_isArray6) {
38929               if (_i7 >= _iterator6.length) break;
38930               _ref7 = _iterator6[_i7++];
38931             } else {
38932               _i7 = _iterator6.next();
38933               if (_i7.done) break;
38934               _ref7 = _i7.value;
38935             }
38937             var _group = _ref7;
38939             if (gid === _group.glyphID) {
38940               _res4.push.apply(_res4, range(_group.startCharCode, _group.endCharCode + 1));
38941             }
38942           }
38944           return _res4;
38945         }
38947       default:
38948         throw new Error('Unknown cmap format ' + cmap.version);
38949     }
38950   };
38952   return CmapProcessor;
38953 }(), (_applyDecoratedDescriptor$1(_class$1.prototype, 'getCharacterSet', [cache], _Object$getOwnPropertyDescriptor(_class$1.prototype, 'getCharacterSet'), _class$1.prototype), _applyDecoratedDescriptor$1(_class$1.prototype, 'codePointsForGlyph', [cache], _Object$getOwnPropertyDescriptor(_class$1.prototype, 'codePointsForGlyph'), _class$1.prototype)), _class$1);
38955 var KernProcessor = function () {
38956   function KernProcessor(font) {
38957     _classCallCheck(this, KernProcessor);
38959     this.kern = font.kern;
38960   }
38962   KernProcessor.prototype.process = function process(glyphs, positions) {
38963     for (var glyphIndex = 0; glyphIndex < glyphs.length - 1; glyphIndex++) {
38964       var left = glyphs[glyphIndex].id;
38965       var right = glyphs[glyphIndex + 1].id;
38966       positions[glyphIndex].xAdvance += this.getKerning(left, right);
38967     }
38968   };
38970   KernProcessor.prototype.getKerning = function getKerning(left, right) {
38971     var res = 0;
38973     for (var _iterator = this.kern.tables, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
38974       var _ref;
38976       if (_isArray) {
38977         if (_i >= _iterator.length) break;
38978         _ref = _iterator[_i++];
38979       } else {
38980         _i = _iterator.next();
38981         if (_i.done) break;
38982         _ref = _i.value;
38983       }
38985       var table = _ref;
38987       if (table.coverage.crossStream) {
38988         continue;
38989       }
38991       switch (table.version) {
38992         case 0:
38993           if (!table.coverage.horizontal) {
38994             continue;
38995           }
38997           break;
38998         case 1:
38999           if (table.coverage.vertical || table.coverage.variation) {
39000             continue;
39001           }
39003           break;
39004         default:
39005           throw new Error('Unsupported kerning table version ' + table.version);
39006       }
39008       var val = 0;
39009       var s = table.subtable;
39010       switch (table.format) {
39011         case 0:
39012           var pairIdx = binarySearch(s.pairs, function (pair) {
39013             return left - pair.left || right - pair.right;
39014           });
39016           if (pairIdx >= 0) {
39017             val = s.pairs[pairIdx].value;
39018           }
39020           break;
39022         case 2:
39023           var leftOffset = 0,
39024               rightOffset = 0;
39025           if (left >= s.leftTable.firstGlyph && left < s.leftTable.firstGlyph + s.leftTable.nGlyphs) {
39026             leftOffset = s.leftTable.offsets[left - s.leftTable.firstGlyph];
39027           } else {
39028             leftOffset = s.array.off;
39029           }
39031           if (right >= s.rightTable.firstGlyph && right < s.rightTable.firstGlyph + s.rightTable.nGlyphs) {
39032             rightOffset = s.rightTable.offsets[right - s.rightTable.firstGlyph];
39033           }
39035           var index = (leftOffset + rightOffset - s.array.off) / 2;
39036           val = s.array.values.get(index);
39037           break;
39039         case 3:
39040           if (left >= s.glyphCount || right >= s.glyphCount) {
39041             return 0;
39042           }
39044           val = s.kernValue[s.kernIndex[s.leftClass[left] * s.rightClassCount + s.rightClass[right]]];
39045           break;
39047         default:
39048           throw new Error('Unsupported kerning sub-table format ' + table.format);
39049       }
39051       // Microsoft supports the override flag, which resets the result
39052       // Otherwise, the sum of the results from all subtables is returned
39053       if (table.coverage.override) {
39054         res = val;
39055       } else {
39056         res += val;
39057       }
39058     }
39060     return res;
39061   };
39063   return KernProcessor;
39064 }();
39067  * This class is used when GPOS does not define 'mark' or 'mkmk' features
39068  * for positioning marks relative to base glyphs. It uses the unicode
39069  * combining class property to position marks.
39071  * Based on code from Harfbuzz, thanks!
39072  * https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-fallback.cc
39073  */
39075 var UnicodeLayoutEngine = function () {
39076   function UnicodeLayoutEngine(font) {
39077     _classCallCheck(this, UnicodeLayoutEngine);
39079     this.font = font;
39080   }
39082   UnicodeLayoutEngine.prototype.positionGlyphs = function positionGlyphs(glyphs, positions) {
39083     // find each base + mark cluster, and position the marks relative to the base
39084     var clusterStart = 0;
39085     var clusterEnd = 0;
39086     for (var index = 0; index < glyphs.length; index++) {
39087       var glyph = glyphs[index];
39088       if (glyph.isMark) {
39089         // TODO: handle ligatures
39090         clusterEnd = index;
39091       } else {
39092         if (clusterStart !== clusterEnd) {
39093           this.positionCluster(glyphs, positions, clusterStart, clusterEnd);
39094         }
39096         clusterStart = clusterEnd = index;
39097       }
39098     }
39100     if (clusterStart !== clusterEnd) {
39101       this.positionCluster(glyphs, positions, clusterStart, clusterEnd);
39102     }
39104     return positions;
39105   };
39107   UnicodeLayoutEngine.prototype.positionCluster = function positionCluster(glyphs, positions, clusterStart, clusterEnd) {
39108     var base = glyphs[clusterStart];
39109     var baseBox = base.cbox.copy();
39111     // adjust bounding box for ligature glyphs
39112     if (base.codePoints.length > 1) {
39113       // LTR. TODO: RTL support.
39114       baseBox.minX += (base.codePoints.length - 1) * baseBox.width / base.codePoints.length;
39115     }
39117     var xOffset = -positions[clusterStart].xAdvance;
39118     var yOffset = 0;
39119     var yGap = this.font.unitsPerEm / 16;
39121     // position each of the mark glyphs relative to the base glyph
39122     for (var index = clusterStart + 1; index <= clusterEnd; index++) {
39123       var mark = glyphs[index];
39124       var markBox = mark.cbox;
39125       var position = positions[index];
39127       var combiningClass = this.getCombiningClass(mark.codePoints[0]);
39129       if (combiningClass !== 'Not_Reordered') {
39130         position.xOffset = position.yOffset = 0;
39132         // x positioning
39133         switch (combiningClass) {
39134           case 'Double_Above':
39135           case 'Double_Below':
39136             // LTR. TODO: RTL support.
39137             position.xOffset += baseBox.minX - markBox.width / 2 - markBox.minX;
39138             break;
39140           case 'Attached_Below_Left':
39141           case 'Below_Left':
39142           case 'Above_Left':
39143             // left align
39144             position.xOffset += baseBox.minX - markBox.minX;
39145             break;
39147           case 'Attached_Above_Right':
39148           case 'Below_Right':
39149           case 'Above_Right':
39150             // right align
39151             position.xOffset += baseBox.maxX - markBox.width - markBox.minX;
39152             break;
39154           default:
39155             // Attached_Below, Attached_Above, Below, Above, other
39156             // center align
39157             position.xOffset += baseBox.minX + (baseBox.width - markBox.width) / 2 - markBox.minX;
39158         }
39160         // y positioning
39161         switch (combiningClass) {
39162           case 'Double_Below':
39163           case 'Below_Left':
39164           case 'Below':
39165           case 'Below_Right':
39166           case 'Attached_Below_Left':
39167           case 'Attached_Below':
39168             // add a small gap between the glyphs if they are not attached
39169             if (combiningClass === 'Attached_Below_Left' || combiningClass === 'Attached_Below') {
39170               baseBox.minY += yGap;
39171             }
39173             position.yOffset = -baseBox.minY - markBox.maxY;
39174             baseBox.minY += markBox.height;
39175             break;
39177           case 'Double_Above':
39178           case 'Above_Left':
39179           case 'Above':
39180           case 'Above_Right':
39181           case 'Attached_Above':
39182           case 'Attached_Above_Right':
39183             // add a small gap between the glyphs if they are not attached
39184             if (combiningClass === 'Attached_Above' || combiningClass === 'Attached_Above_Right') {
39185               baseBox.maxY += yGap;
39186             }
39188             position.yOffset = baseBox.maxY - markBox.minY;
39189             baseBox.maxY += markBox.height;
39190             break;
39191         }
39193         position.xAdvance = position.yAdvance = 0;
39194         position.xOffset += xOffset;
39195         position.yOffset += yOffset;
39196       } else {
39197         xOffset -= position.xAdvance;
39198         yOffset -= position.yAdvance;
39199       }
39200     }
39202     return;
39203   };
39205   UnicodeLayoutEngine.prototype.getCombiningClass = function getCombiningClass(codePoint) {
39206     var combiningClass = unicode.getCombiningClass(codePoint);
39208     // Thai / Lao need some per-character work
39209     if ((codePoint & ~0xff) === 0x0e00) {
39210       if (combiningClass === 'Not_Reordered') {
39211         switch (codePoint) {
39212           case 0x0e31:
39213           case 0x0e34:
39214           case 0x0e35:
39215           case 0x0e36:
39216           case 0x0e37:
39217           case 0x0e47:
39218           case 0x0e4c:
39219           case 0x0e3d:
39220           case 0x0e4e:
39221             return 'Above_Right';
39223           case 0x0eb1:
39224           case 0x0eb4:
39225           case 0x0eb5:
39226           case 0x0eb6:
39227           case 0x0eb7:
39228           case 0x0ebb:
39229           case 0x0ecc:
39230           case 0x0ecd:
39231             return 'Above';
39233           case 0x0ebc:
39234             return 'Below';
39235         }
39236       } else if (codePoint === 0x0e3a) {
39237         // virama
39238         return 'Below_Right';
39239       }
39240     }
39242     switch (combiningClass) {
39243       // Hebrew
39245       case 'CCC10': // sheva
39246       case 'CCC11': // hataf segol
39247       case 'CCC12': // hataf patah
39248       case 'CCC13': // hataf qamats
39249       case 'CCC14': // hiriq
39250       case 'CCC15': // tsere
39251       case 'CCC16': // segol
39252       case 'CCC17': // patah
39253       case 'CCC18': // qamats
39254       case 'CCC20': // qubuts
39255       case 'CCC22':
39256         // meteg
39257         return 'Below';
39259       case 'CCC23':
39260         // rafe
39261         return 'Attached_Above';
39263       case 'CCC24':
39264         // shin dot
39265         return 'Above_Right';
39267       case 'CCC25': // sin dot
39268       case 'CCC19':
39269         // holam
39270         return 'Above_Left';
39272       case 'CCC26':
39273         // point varika
39274         return 'Above';
39276       case 'CCC21':
39277         // dagesh
39278         break;
39280       // Arabic and Syriac
39282       case 'CCC27': // fathatan
39283       case 'CCC28': // dammatan
39284       case 'CCC30': // fatha
39285       case 'CCC31': // damma
39286       case 'CCC33': // shadda
39287       case 'CCC34': // sukun
39288       case 'CCC35': // superscript alef
39289       case 'CCC36':
39290         // superscript alaph
39291         return 'Above';
39293       case 'CCC29': // kasratan
39294       case 'CCC32':
39295         // kasra
39296         return 'Below';
39298       // Thai
39300       case 'CCC103':
39301         // sara u / sara uu
39302         return 'Below_Right';
39304       case 'CCC107':
39305         // mai
39306         return 'Above_Right';
39308       // Lao
39310       case 'CCC118':
39311         // sign u / sign uu
39312         return 'Below';
39314       case 'CCC122':
39315         // mai
39316         return 'Above';
39318       // Tibetan
39320       case 'CCC129': // sign aa
39321       case 'CCC132':
39322         // sign u
39323         return 'Below';
39325       case 'CCC130':
39326         // sign i
39327         return 'Above';
39328     }
39330     return combiningClass;
39331   };
39333   return UnicodeLayoutEngine;
39334 }();
39337  * Represents a glyph bounding box
39338  */
39339 var BBox = function () {
39340   function BBox() {
39341     var minX = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity;
39342     var minY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity;
39343     var maxX = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -Infinity;
39344     var maxY = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : -Infinity;
39346     _classCallCheck(this, BBox);
39348     /**
39349      * The minimum X position in the bounding box
39350      * @type {number}
39351      */
39352     this.minX = minX;
39354     /**
39355      * The minimum Y position in the bounding box
39356      * @type {number}
39357      */
39358     this.minY = minY;
39360     /**
39361      * The maxmimum X position in the bounding box
39362      * @type {number}
39363      */
39364     this.maxX = maxX;
39366     /**
39367      * The maxmimum Y position in the bounding box
39368      * @type {number}
39369      */
39370     this.maxY = maxY;
39371   }
39373   /**
39374    * The width of the bounding box
39375    * @type {number}
39376    */
39379   BBox.prototype.addPoint = function addPoint(x, y) {
39380     if (Math.abs(x) !== Infinity) {
39381       if (x < this.minX) {
39382         this.minX = x;
39383       }
39385       if (x > this.maxX) {
39386         this.maxX = x;
39387       }
39388     }
39390     if (Math.abs(y) !== Infinity) {
39391       if (y < this.minY) {
39392         this.minY = y;
39393       }
39395       if (y > this.maxY) {
39396         this.maxY = y;
39397       }
39398     }
39399   };
39401   BBox.prototype.copy = function copy() {
39402     return new BBox(this.minX, this.minY, this.maxX, this.maxY);
39403   };
39405   _createClass(BBox, [{
39406     key: "width",
39407     get: function get() {
39408       return this.maxX - this.minX;
39409     }
39411     /**
39412      * The height of the bounding box
39413      * @type {number}
39414      */
39416   }, {
39417     key: "height",
39418     get: function get() {
39419       return this.maxY - this.minY;
39420     }
39421   }]);
39423   return BBox;
39424 }();
39426 // This maps the Unicode Script property to an OpenType script tag
39427 // Data from http://www.microsoft.com/typography/otspec/scripttags.htm
39428 // and http://www.unicode.org/Public/UNIDATA/PropertyValueAliases.txt.
39429 var UNICODE_SCRIPTS = {
39430   Caucasian_Albanian: 'aghb',
39431   Arabic: 'arab',
39432   Imperial_Aramaic: 'armi',
39433   Armenian: 'armn',
39434   Avestan: 'avst',
39435   Balinese: 'bali',
39436   Bamum: 'bamu',
39437   Bassa_Vah: 'bass',
39438   Batak: 'batk',
39439   Bengali: ['bng2', 'beng'],
39440   Bopomofo: 'bopo',
39441   Brahmi: 'brah',
39442   Braille: 'brai',
39443   Buginese: 'bugi',
39444   Buhid: 'buhd',
39445   Chakma: 'cakm',
39446   Canadian_Aboriginal: 'cans',
39447   Carian: 'cari',
39448   Cham: 'cham',
39449   Cherokee: 'cher',
39450   Coptic: 'copt',
39451   Cypriot: 'cprt',
39452   Cyrillic: 'cyrl',
39453   Devanagari: ['dev2', 'deva'],
39454   Deseret: 'dsrt',
39455   Duployan: 'dupl',
39456   Egyptian_Hieroglyphs: 'egyp',
39457   Elbasan: 'elba',
39458   Ethiopic: 'ethi',
39459   Georgian: 'geor',
39460   Glagolitic: 'glag',
39461   Gothic: 'goth',
39462   Grantha: 'gran',
39463   Greek: 'grek',
39464   Gujarati: ['gjr2', 'gujr'],
39465   Gurmukhi: ['gur2', 'guru'],
39466   Hangul: 'hang',
39467   Han: 'hani',
39468   Hanunoo: 'hano',
39469   Hebrew: 'hebr',
39470   Hiragana: 'hira',
39471   Pahawh_Hmong: 'hmng',
39472   Katakana_Or_Hiragana: 'hrkt',
39473   Old_Italic: 'ital',
39474   Javanese: 'java',
39475   Kayah_Li: 'kali',
39476   Katakana: 'kana',
39477   Kharoshthi: 'khar',
39478   Khmer: 'khmr',
39479   Khojki: 'khoj',
39480   Kannada: ['knd2', 'knda'],
39481   Kaithi: 'kthi',
39482   Tai_Tham: 'lana',
39483   Lao: 'lao ',
39484   Latin: 'latn',
39485   Lepcha: 'lepc',
39486   Limbu: 'limb',
39487   Linear_A: 'lina',
39488   Linear_B: 'linb',
39489   Lisu: 'lisu',
39490   Lycian: 'lyci',
39491   Lydian: 'lydi',
39492   Mahajani: 'mahj',
39493   Mandaic: 'mand',
39494   Manichaean: 'mani',
39495   Mende_Kikakui: 'mend',
39496   Meroitic_Cursive: 'merc',
39497   Meroitic_Hieroglyphs: 'mero',
39498   Malayalam: ['mlm2', 'mlym'],
39499   Modi: 'modi',
39500   Mongolian: 'mong',
39501   Mro: 'mroo',
39502   Meetei_Mayek: 'mtei',
39503   Myanmar: ['mym2', 'mymr'],
39504   Old_North_Arabian: 'narb',
39505   Nabataean: 'nbat',
39506   Nko: 'nko ',
39507   Ogham: 'ogam',
39508   Ol_Chiki: 'olck',
39509   Old_Turkic: 'orkh',
39510   Oriya: ['ory2', 'orya'],
39511   Osmanya: 'osma',
39512   Palmyrene: 'palm',
39513   Pau_Cin_Hau: 'pauc',
39514   Old_Permic: 'perm',
39515   Phags_Pa: 'phag',
39516   Inscriptional_Pahlavi: 'phli',
39517   Psalter_Pahlavi: 'phlp',
39518   Phoenician: 'phnx',
39519   Miao: 'plrd',
39520   Inscriptional_Parthian: 'prti',
39521   Rejang: 'rjng',
39522   Runic: 'runr',
39523   Samaritan: 'samr',
39524   Old_South_Arabian: 'sarb',
39525   Saurashtra: 'saur',
39526   Shavian: 'shaw',
39527   Sharada: 'shrd',
39528   Siddham: 'sidd',
39529   Khudawadi: 'sind',
39530   Sinhala: 'sinh',
39531   Sora_Sompeng: 'sora',
39532   Sundanese: 'sund',
39533   Syloti_Nagri: 'sylo',
39534   Syriac: 'syrc',
39535   Tagbanwa: 'tagb',
39536   Takri: 'takr',
39537   Tai_Le: 'tale',
39538   New_Tai_Lue: 'talu',
39539   Tamil: ['tml2', 'taml'],
39540   Tai_Viet: 'tavt',
39541   Telugu: ['tel2', 'telu'],
39542   Tifinagh: 'tfng',
39543   Tagalog: 'tglg',
39544   Thaana: 'thaa',
39545   Thai: 'thai',
39546   Tibetan: 'tibt',
39547   Tirhuta: 'tirh',
39548   Ugaritic: 'ugar',
39549   Vai: 'vai ',
39550   Warang_Citi: 'wara',
39551   Old_Persian: 'xpeo',
39552   Cuneiform: 'xsux',
39553   Yi: 'yi  ',
39554   Inherited: 'zinh',
39555   Common: 'zyyy',
39556   Unknown: 'zzzz'
39559 var OPENTYPE_SCRIPTS = {};
39560 for (var script in UNICODE_SCRIPTS) {
39561   var tag = UNICODE_SCRIPTS[script];
39562   if (Array.isArray(tag)) {
39563     for (var _iterator = tag, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
39564       var _ref;
39566       if (_isArray) {
39567         if (_i >= _iterator.length) break;
39568         _ref = _iterator[_i++];
39569       } else {
39570         _i = _iterator.next();
39571         if (_i.done) break;
39572         _ref = _i.value;
39573       }
39575       var t = _ref;
39577       OPENTYPE_SCRIPTS[t] = script;
39578     }
39579   } else {
39580     OPENTYPE_SCRIPTS[tag] = script;
39581   }
39584 function fromOpenType(tag) {
39585   return OPENTYPE_SCRIPTS[tag];
39588 function forString(string) {
39589   var len = string.length;
39590   var idx = 0;
39591   while (idx < len) {
39592     var code = string.charCodeAt(idx++);
39594     // Check if this is a high surrogate
39595     if (0xd800 <= code && code <= 0xdbff && idx < len) {
39596       var next = string.charCodeAt(idx);
39598       // Check if this is a low surrogate
39599       if (0xdc00 <= next && next <= 0xdfff) {
39600         idx++;
39601         code = ((code & 0x3FF) << 10) + (next & 0x3FF) + 0x10000;
39602       }
39603     }
39605     var _script = unicode.getScript(code);
39606     if (_script !== 'Common' && _script !== 'Inherited' && _script !== 'Unknown') {
39607       return UNICODE_SCRIPTS[_script];
39608     }
39609   }
39611   return UNICODE_SCRIPTS.Unknown;
39614 function forCodePoints(codePoints) {
39615   for (var i = 0; i < codePoints.length; i++) {
39616     var codePoint = codePoints[i];
39617     var _script2 = unicode.getScript(codePoint);
39618     if (_script2 !== 'Common' && _script2 !== 'Inherited' && _script2 !== 'Unknown') {
39619       return UNICODE_SCRIPTS[_script2];
39620     }
39621   }
39623   return UNICODE_SCRIPTS.Unknown;
39626 // The scripts in this map are written from right to left
39627 var RTL = {
39628   arab: true, // Arabic
39629   hebr: true, // Hebrew
39630   syrc: true, // Syriac
39631   thaa: true, // Thaana
39632   cprt: true, // Cypriot Syllabary
39633   khar: true, // Kharosthi
39634   phnx: true, // Phoenician
39635   'nko ': true, // N'Ko
39636   lydi: true, // Lydian
39637   avst: true, // Avestan
39638   armi: true, // Imperial Aramaic
39639   phli: true, // Inscriptional Pahlavi
39640   prti: true, // Inscriptional Parthian
39641   sarb: true, // Old South Arabian
39642   orkh: true, // Old Turkic, Orkhon Runic
39643   samr: true, // Samaritan
39644   mand: true, // Mandaic, Mandaean
39645   merc: true, // Meroitic Cursive
39646   mero: true, // Meroitic Hieroglyphs
39648   // Unicode 7.0 (not listed on http://www.microsoft.com/typography/otspec/scripttags.htm)
39649   mani: true, // Manichaean
39650   mend: true, // Mende Kikakui
39651   nbat: true, // Nabataean
39652   narb: true, // Old North Arabian
39653   palm: true, // Palmyrene
39654   phlp: true // Psalter Pahlavi
39657 function direction(script) {
39658   if (RTL[script]) {
39659     return 'rtl';
39660   }
39662   return 'ltr';
39666  * Represents a run of Glyph and GlyphPosition objects.
39667  * Returned by the font layout method.
39668  */
39670 var GlyphRun = function () {
39671   function GlyphRun(glyphs, features, script, language, direction$$) {
39672     _classCallCheck(this, GlyphRun);
39674     /**
39675      * An array of Glyph objects in the run
39676      * @type {Glyph[]}
39677      */
39678     this.glyphs = glyphs;
39680     /**
39681      * An array of GlyphPosition objects for each glyph in the run
39682      * @type {GlyphPosition[]}
39683      */
39684     this.positions = null;
39686     /**
39687      * The script that was requested for shaping. This was either passed in or detected automatically.
39688      * @type {string}
39689      */
39690     this.script = script;
39692     /**
39693      * The language requested for shaping, as passed in. If `null`, the default language for the
39694      * script was used.
39695      * @type {string}
39696      */
39697     this.language = language || null;
39699     /**
39700      * The direction requested for shaping, as passed in (either ltr or rtl).
39701      * If `null`, the default direction of the script is used.
39702      * @type {string}
39703      */
39704     this.direction = direction$$ || direction(script);
39706     /**
39707      * The features requested during shaping. This is a combination of user
39708      * specified features and features chosen by the shaper.
39709      * @type {object}
39710      */
39711     this.features = {};
39713     // Convert features to an object
39714     if (Array.isArray(features)) {
39715       for (var _iterator = features, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
39716         var _ref;
39718         if (_isArray) {
39719           if (_i >= _iterator.length) break;
39720           _ref = _iterator[_i++];
39721         } else {
39722           _i = _iterator.next();
39723           if (_i.done) break;
39724           _ref = _i.value;
39725         }
39727         var tag = _ref;
39729         this.features[tag] = true;
39730       }
39731     } else if ((typeof features === 'undefined' ? 'undefined' : _typeof(features)) === 'object') {
39732       this.features = features;
39733     }
39734   }
39736   /**
39737    * The total advance width of the run.
39738    * @type {number}
39739    */
39742   _createClass(GlyphRun, [{
39743     key: 'advanceWidth',
39744     get: function get() {
39745       var width = 0;
39746       for (var _iterator2 = this.positions, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
39747         var _ref2;
39749         if (_isArray2) {
39750           if (_i2 >= _iterator2.length) break;
39751           _ref2 = _iterator2[_i2++];
39752         } else {
39753           _i2 = _iterator2.next();
39754           if (_i2.done) break;
39755           _ref2 = _i2.value;
39756         }
39758         var position = _ref2;
39760         width += position.xAdvance;
39761       }
39763       return width;
39764     }
39766     /**
39767      * The total advance height of the run.
39768      * @type {number}
39769      */
39771   }, {
39772     key: 'advanceHeight',
39773     get: function get() {
39774       var height = 0;
39775       for (var _iterator3 = this.positions, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
39776         var _ref3;
39778         if (_isArray3) {
39779           if (_i3 >= _iterator3.length) break;
39780           _ref3 = _iterator3[_i3++];
39781         } else {
39782           _i3 = _iterator3.next();
39783           if (_i3.done) break;
39784           _ref3 = _i3.value;
39785         }
39787         var position = _ref3;
39789         height += position.yAdvance;
39790       }
39792       return height;
39793     }
39795     /**
39796      * The bounding box containing all glyphs in the run.
39797      * @type {BBox}
39798      */
39800   }, {
39801     key: 'bbox',
39802     get: function get() {
39803       var bbox = new BBox();
39805       var x = 0;
39806       var y = 0;
39807       for (var index = 0; index < this.glyphs.length; index++) {
39808         var glyph = this.glyphs[index];
39809         var p = this.positions[index];
39810         var b = glyph.bbox;
39812         bbox.addPoint(b.minX + x + p.xOffset, b.minY + y + p.yOffset);
39813         bbox.addPoint(b.maxX + x + p.xOffset, b.maxY + y + p.yOffset);
39815         x += p.xAdvance;
39816         y += p.yAdvance;
39817       }
39819       return bbox;
39820     }
39821   }]);
39823   return GlyphRun;
39824 }();
39827  * Represents positioning information for a glyph in a GlyphRun.
39828  */
39829 var GlyphPosition = function GlyphPosition() {
39830   var xAdvance = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
39831   var yAdvance = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
39832   var xOffset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
39833   var yOffset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
39835   _classCallCheck(this, GlyphPosition);
39837   /**
39838    * The amount to move the virtual pen in the X direction after rendering this glyph.
39839    * @type {number}
39840    */
39841   this.xAdvance = xAdvance;
39843   /**
39844    * The amount to move the virtual pen in the Y direction after rendering this glyph.
39845    * @type {number}
39846    */
39847   this.yAdvance = yAdvance;
39849   /**
39850    * The offset from the pen position in the X direction at which to render this glyph.
39851    * @type {number}
39852    */
39853   this.xOffset = xOffset;
39855   /**
39856    * The offset from the pen position in the Y direction at which to render this glyph.
39857    * @type {number}
39858    */
39859   this.yOffset = yOffset;
39862 // see https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html
39863 // and /System/Library/Frameworks/CoreText.framework/Versions/A/Headers/SFNTLayoutTypes.h on a Mac
39864 var features = {
39865   allTypographicFeatures: {
39866     code: 0,
39867     exclusive: false,
39868     allTypeFeatures: 0
39869   },
39870   ligatures: {
39871     code: 1,
39872     exclusive: false,
39873     requiredLigatures: 0,
39874     commonLigatures: 2,
39875     rareLigatures: 4,
39876     // logos: 6
39877     rebusPictures: 8,
39878     diphthongLigatures: 10,
39879     squaredLigatures: 12,
39880     abbrevSquaredLigatures: 14,
39881     symbolLigatures: 16,
39882     contextualLigatures: 18,
39883     historicalLigatures: 20
39884   },
39885   cursiveConnection: {
39886     code: 2,
39887     exclusive: true,
39888     unconnected: 0,
39889     partiallyConnected: 1,
39890     cursive: 2
39891   },
39892   letterCase: {
39893     code: 3,
39894     exclusive: true
39895   },
39896   // upperAndLowerCase: 0          # deprecated
39897   // allCaps: 1                    # deprecated
39898   // allLowerCase: 2               # deprecated
39899   // smallCaps: 3                  # deprecated
39900   // initialCaps: 4                # deprecated
39901   // initialCapsAndSmallCaps: 5    # deprecated
39902   verticalSubstitution: {
39903     code: 4,
39904     exclusive: false,
39905     substituteVerticalForms: 0
39906   },
39907   linguisticRearrangement: {
39908     code: 5,
39909     exclusive: false,
39910     linguisticRearrangement: 0
39911   },
39912   numberSpacing: {
39913     code: 6,
39914     exclusive: true,
39915     monospacedNumbers: 0,
39916     proportionalNumbers: 1,
39917     thirdWidthNumbers: 2,
39918     quarterWidthNumbers: 3
39919   },
39920   smartSwash: {
39921     code: 8,
39922     exclusive: false,
39923     wordInitialSwashes: 0,
39924     wordFinalSwashes: 2,
39925     // lineInitialSwashes: 4
39926     // lineFinalSwashes: 6
39927     nonFinalSwashes: 8
39928   },
39929   diacritics: {
39930     code: 9,
39931     exclusive: true,
39932     showDiacritics: 0,
39933     hideDiacritics: 1,
39934     decomposeDiacritics: 2
39935   },
39936   verticalPosition: {
39937     code: 10,
39938     exclusive: true,
39939     normalPosition: 0,
39940     superiors: 1,
39941     inferiors: 2,
39942     ordinals: 3,
39943     scientificInferiors: 4
39944   },
39945   fractions: {
39946     code: 11,
39947     exclusive: true,
39948     noFractions: 0,
39949     verticalFractions: 1,
39950     diagonalFractions: 2
39951   },
39952   overlappingCharacters: {
39953     code: 13,
39954     exclusive: false,
39955     preventOverlap: 0
39956   },
39957   typographicExtras: {
39958     code: 14,
39959     exclusive: false,
39960     // hyphensToEmDash: 0
39961     // hyphenToEnDash: 2
39962     slashedZero: 4
39963   },
39964   // formInterrobang: 6
39965   // smartQuotes: 8
39966   // periodsToEllipsis: 10
39967   mathematicalExtras: {
39968     code: 15,
39969     exclusive: false,
39970     // hyphenToMinus: 0
39971     // asteristoMultiply: 2
39972     // slashToDivide: 4
39973     // inequalityLigatures: 6
39974     // exponents: 8
39975     mathematicalGreek: 10
39976   },
39977   ornamentSets: {
39978     code: 16,
39979     exclusive: true,
39980     noOrnaments: 0,
39981     dingbats: 1,
39982     piCharacters: 2,
39983     fleurons: 3,
39984     decorativeBorders: 4,
39985     internationalSymbols: 5,
39986     mathSymbols: 6
39987   },
39988   characterAlternatives: {
39989     code: 17,
39990     exclusive: true,
39991     noAlternates: 0
39992   },
39993   // user defined options
39994   designComplexity: {
39995     code: 18,
39996     exclusive: true,
39997     designLevel1: 0,
39998     designLevel2: 1,
39999     designLevel3: 2,
40000     designLevel4: 3,
40001     designLevel5: 4
40002   },
40003   styleOptions: {
40004     code: 19,
40005     exclusive: true,
40006     noStyleOptions: 0,
40007     displayText: 1,
40008     engravedText: 2,
40009     illuminatedCaps: 3,
40010     titlingCaps: 4,
40011     tallCaps: 5
40012   },
40013   characterShape: {
40014     code: 20,
40015     exclusive: true,
40016     traditionalCharacters: 0,
40017     simplifiedCharacters: 1,
40018     JIS1978Characters: 2,
40019     JIS1983Characters: 3,
40020     JIS1990Characters: 4,
40021     traditionalAltOne: 5,
40022     traditionalAltTwo: 6,
40023     traditionalAltThree: 7,
40024     traditionalAltFour: 8,
40025     traditionalAltFive: 9,
40026     expertCharacters: 10,
40027     JIS2004Characters: 11,
40028     hojoCharacters: 12,
40029     NLCCharacters: 13,
40030     traditionalNamesCharacters: 14
40031   },
40032   numberCase: {
40033     code: 21,
40034     exclusive: true,
40035     lowerCaseNumbers: 0,
40036     upperCaseNumbers: 1
40037   },
40038   textSpacing: {
40039     code: 22,
40040     exclusive: true,
40041     proportionalText: 0,
40042     monospacedText: 1,
40043     halfWidthText: 2,
40044     thirdWidthText: 3,
40045     quarterWidthText: 4,
40046     altProportionalText: 5,
40047     altHalfWidthText: 6
40048   },
40049   transliteration: {
40050     code: 23,
40051     exclusive: true,
40052     noTransliteration: 0
40053   },
40054   // hanjaToHangul: 1
40055   // hiraganaToKatakana: 2
40056   // katakanaToHiragana: 3
40057   // kanaToRomanization: 4
40058   // romanizationToHiragana: 5
40059   // romanizationToKatakana: 6
40060   // hanjaToHangulAltOne: 7
40061   // hanjaToHangulAltTwo: 8
40062   // hanjaToHangulAltThree: 9
40063   annotation: {
40064     code: 24,
40065     exclusive: true,
40066     noAnnotation: 0,
40067     boxAnnotation: 1,
40068     roundedBoxAnnotation: 2,
40069     circleAnnotation: 3,
40070     invertedCircleAnnotation: 4,
40071     parenthesisAnnotation: 5,
40072     periodAnnotation: 6,
40073     romanNumeralAnnotation: 7,
40074     diamondAnnotation: 8,
40075     invertedBoxAnnotation: 9,
40076     invertedRoundedBoxAnnotation: 10
40077   },
40078   kanaSpacing: {
40079     code: 25,
40080     exclusive: true,
40081     fullWidthKana: 0,
40082     proportionalKana: 1
40083   },
40084   ideographicSpacing: {
40085     code: 26,
40086     exclusive: true,
40087     fullWidthIdeographs: 0,
40088     proportionalIdeographs: 1,
40089     halfWidthIdeographs: 2
40090   },
40091   unicodeDecomposition: {
40092     code: 27,
40093     exclusive: false,
40094     canonicalComposition: 0,
40095     compatibilityComposition: 2,
40096     transcodingComposition: 4
40097   },
40098   rubyKana: {
40099     code: 28,
40100     exclusive: false,
40101     // noRubyKana: 0     # deprecated - use rubyKanaOff instead
40102     // rubyKana: 1     # deprecated - use rubyKanaOn instead
40103     rubyKana: 2
40104   },
40105   CJKSymbolAlternatives: {
40106     code: 29,
40107     exclusive: true,
40108     noCJKSymbolAlternatives: 0,
40109     CJKSymbolAltOne: 1,
40110     CJKSymbolAltTwo: 2,
40111     CJKSymbolAltThree: 3,
40112     CJKSymbolAltFour: 4,
40113     CJKSymbolAltFive: 5
40114   },
40115   ideographicAlternatives: {
40116     code: 30,
40117     exclusive: true,
40118     noIdeographicAlternatives: 0,
40119     ideographicAltOne: 1,
40120     ideographicAltTwo: 2,
40121     ideographicAltThree: 3,
40122     ideographicAltFour: 4,
40123     ideographicAltFive: 5
40124   },
40125   CJKVerticalRomanPlacement: {
40126     code: 31,
40127     exclusive: true,
40128     CJKVerticalRomanCentered: 0,
40129     CJKVerticalRomanHBaseline: 1
40130   },
40131   italicCJKRoman: {
40132     code: 32,
40133     exclusive: false,
40134     // noCJKItalicRoman: 0     # deprecated - use CJKItalicRomanOff instead
40135     // CJKItalicRoman: 1     # deprecated - use CJKItalicRomanOn instead
40136     CJKItalicRoman: 2
40137   },
40138   caseSensitiveLayout: {
40139     code: 33,
40140     exclusive: false,
40141     caseSensitiveLayout: 0,
40142     caseSensitiveSpacing: 2
40143   },
40144   alternateKana: {
40145     code: 34,
40146     exclusive: false,
40147     alternateHorizKana: 0,
40148     alternateVertKana: 2
40149   },
40150   stylisticAlternatives: {
40151     code: 35,
40152     exclusive: false,
40153     noStylisticAlternates: 0,
40154     stylisticAltOne: 2,
40155     stylisticAltTwo: 4,
40156     stylisticAltThree: 6,
40157     stylisticAltFour: 8,
40158     stylisticAltFive: 10,
40159     stylisticAltSix: 12,
40160     stylisticAltSeven: 14,
40161     stylisticAltEight: 16,
40162     stylisticAltNine: 18,
40163     stylisticAltTen: 20,
40164     stylisticAltEleven: 22,
40165     stylisticAltTwelve: 24,
40166     stylisticAltThirteen: 26,
40167     stylisticAltFourteen: 28,
40168     stylisticAltFifteen: 30,
40169     stylisticAltSixteen: 32,
40170     stylisticAltSeventeen: 34,
40171     stylisticAltEighteen: 36,
40172     stylisticAltNineteen: 38,
40173     stylisticAltTwenty: 40
40174   },
40175   contextualAlternates: {
40176     code: 36,
40177     exclusive: false,
40178     contextualAlternates: 0,
40179     swashAlternates: 2,
40180     contextualSwashAlternates: 4
40181   },
40182   lowerCase: {
40183     code: 37,
40184     exclusive: true,
40185     defaultLowerCase: 0,
40186     lowerCaseSmallCaps: 1,
40187     lowerCasePetiteCaps: 2
40188   },
40189   upperCase: {
40190     code: 38,
40191     exclusive: true,
40192     defaultUpperCase: 0,
40193     upperCaseSmallCaps: 1,
40194     upperCasePetiteCaps: 2
40195   },
40196   languageTag: { // indices into ltag table
40197     code: 39,
40198     exclusive: true
40199   },
40200   CJKRomanSpacing: {
40201     code: 103,
40202     exclusive: true,
40203     halfWidthCJKRoman: 0,
40204     proportionalCJKRoman: 1,
40205     defaultCJKRoman: 2,
40206     fullWidthCJKRoman: 3
40207   }
40210 var feature = function feature(name, selector) {
40211   return [features[name].code, features[name][selector]];
40214 var OTMapping = {
40215   rlig: feature('ligatures', 'requiredLigatures'),
40216   clig: feature('ligatures', 'contextualLigatures'),
40217   dlig: feature('ligatures', 'rareLigatures'),
40218   hlig: feature('ligatures', 'historicalLigatures'),
40219   liga: feature('ligatures', 'commonLigatures'),
40220   hist: feature('ligatures', 'historicalLigatures'), // ??
40222   smcp: feature('lowerCase', 'lowerCaseSmallCaps'),
40223   pcap: feature('lowerCase', 'lowerCasePetiteCaps'),
40225   frac: feature('fractions', 'diagonalFractions'),
40226   dnom: feature('fractions', 'diagonalFractions'), // ??
40227   numr: feature('fractions', 'diagonalFractions'), // ??
40228   afrc: feature('fractions', 'verticalFractions'),
40229   // aalt
40230   // abvf, abvm, abvs, akhn, blwf, blwm, blws, cfar, cjct, cpsp, falt, isol, jalt, ljmo, mset?
40231   // ltra, ltrm, nukt, pref, pres, pstf, psts, rand, rkrf, rphf, rtla, rtlm, size, tjmo, tnum?
40232   // unic, vatu, vhal, vjmo, vpal, vrt2
40233   // dist -> trak table?
40234   // kern, vkrn -> kern table
40235   // lfbd + opbd + rtbd -> opbd table?
40236   // mark, mkmk -> acnt table?
40237   // locl -> languageTag + ltag table
40239   case: feature('caseSensitiveLayout', 'caseSensitiveLayout'), // also caseSensitiveSpacing
40240   ccmp: feature('unicodeDecomposition', 'canonicalComposition'), // compatibilityComposition?
40241   cpct: feature('CJKVerticalRomanPlacement', 'CJKVerticalRomanCentered'), // guess..., probably not given below
40242   valt: feature('CJKVerticalRomanPlacement', 'CJKVerticalRomanCentered'),
40243   swsh: feature('contextualAlternates', 'swashAlternates'),
40244   cswh: feature('contextualAlternates', 'contextualSwashAlternates'),
40245   curs: feature('cursiveConnection', 'cursive'), // ??
40246   c2pc: feature('upperCase', 'upperCasePetiteCaps'),
40247   c2sc: feature('upperCase', 'upperCaseSmallCaps'),
40249   init: feature('smartSwash', 'wordInitialSwashes'), // ??
40250   fin2: feature('smartSwash', 'wordFinalSwashes'), // ??
40251   medi: feature('smartSwash', 'nonFinalSwashes'), // ??
40252   med2: feature('smartSwash', 'nonFinalSwashes'), // ??
40253   fin3: feature('smartSwash', 'wordFinalSwashes'), // ??
40254   fina: feature('smartSwash', 'wordFinalSwashes'), // ??
40256   pkna: feature('kanaSpacing', 'proportionalKana'),
40257   half: feature('textSpacing', 'halfWidthText'), // also HalfWidthCJKRoman, HalfWidthIdeographs?
40258   halt: feature('textSpacing', 'altHalfWidthText'),
40260   hkna: feature('alternateKana', 'alternateHorizKana'),
40261   vkna: feature('alternateKana', 'alternateVertKana'),
40262   // hngl: feature 'transliteration', 'hanjaToHangulSelector' # deprecated
40264   ital: feature('italicCJKRoman', 'CJKItalicRoman'),
40265   lnum: feature('numberCase', 'upperCaseNumbers'),
40266   onum: feature('numberCase', 'lowerCaseNumbers'),
40267   mgrk: feature('mathematicalExtras', 'mathematicalGreek'),
40269   // nalt: not enough info. what type of annotation?
40270   // ornm: ditto, which ornament style?
40272   calt: feature('contextualAlternates', 'contextualAlternates'), // or more?
40273   vrt2: feature('verticalSubstitution', 'substituteVerticalForms'), // oh... below?
40274   vert: feature('verticalSubstitution', 'substituteVerticalForms'),
40275   tnum: feature('numberSpacing', 'monospacedNumbers'),
40276   pnum: feature('numberSpacing', 'proportionalNumbers'),
40277   sups: feature('verticalPosition', 'superiors'),
40278   subs: feature('verticalPosition', 'inferiors'),
40279   ordn: feature('verticalPosition', 'ordinals'),
40280   pwid: feature('textSpacing', 'proportionalText'),
40281   hwid: feature('textSpacing', 'halfWidthText'),
40282   qwid: feature('textSpacing', 'quarterWidthText'), // also QuarterWidthNumbers?
40283   twid: feature('textSpacing', 'thirdWidthText'), // also ThirdWidthNumbers?
40284   fwid: feature('textSpacing', 'proportionalText'), //??
40285   palt: feature('textSpacing', 'altProportionalText'),
40286   trad: feature('characterShape', 'traditionalCharacters'),
40287   smpl: feature('characterShape', 'simplifiedCharacters'),
40288   jp78: feature('characterShape', 'JIS1978Characters'),
40289   jp83: feature('characterShape', 'JIS1983Characters'),
40290   jp90: feature('characterShape', 'JIS1990Characters'),
40291   jp04: feature('characterShape', 'JIS2004Characters'),
40292   expt: feature('characterShape', 'expertCharacters'),
40293   hojo: feature('characterShape', 'hojoCharacters'),
40294   nlck: feature('characterShape', 'NLCCharacters'),
40295   tnam: feature('characterShape', 'traditionalNamesCharacters'),
40296   ruby: feature('rubyKana', 'rubyKana'),
40297   titl: feature('styleOptions', 'titlingCaps'),
40298   zero: feature('typographicExtras', 'slashedZero'),
40300   ss01: feature('stylisticAlternatives', 'stylisticAltOne'),
40301   ss02: feature('stylisticAlternatives', 'stylisticAltTwo'),
40302   ss03: feature('stylisticAlternatives', 'stylisticAltThree'),
40303   ss04: feature('stylisticAlternatives', 'stylisticAltFour'),
40304   ss05: feature('stylisticAlternatives', 'stylisticAltFive'),
40305   ss06: feature('stylisticAlternatives', 'stylisticAltSix'),
40306   ss07: feature('stylisticAlternatives', 'stylisticAltSeven'),
40307   ss08: feature('stylisticAlternatives', 'stylisticAltEight'),
40308   ss09: feature('stylisticAlternatives', 'stylisticAltNine'),
40309   ss10: feature('stylisticAlternatives', 'stylisticAltTen'),
40310   ss11: feature('stylisticAlternatives', 'stylisticAltEleven'),
40311   ss12: feature('stylisticAlternatives', 'stylisticAltTwelve'),
40312   ss13: feature('stylisticAlternatives', 'stylisticAltThirteen'),
40313   ss14: feature('stylisticAlternatives', 'stylisticAltFourteen'),
40314   ss15: feature('stylisticAlternatives', 'stylisticAltFifteen'),
40315   ss16: feature('stylisticAlternatives', 'stylisticAltSixteen'),
40316   ss17: feature('stylisticAlternatives', 'stylisticAltSeventeen'),
40317   ss18: feature('stylisticAlternatives', 'stylisticAltEighteen'),
40318   ss19: feature('stylisticAlternatives', 'stylisticAltNineteen'),
40319   ss20: feature('stylisticAlternatives', 'stylisticAltTwenty')
40322 // salt: feature 'stylisticAlternatives', 'stylisticAltOne' # hmm, which one to choose
40324 // Add cv01-cv99 features
40325 for (var i = 1; i <= 99; i++) {
40326   OTMapping['cv' + ('00' + i).slice(-2)] = [features.characterAlternatives.code, i];
40329 // create inverse mapping
40330 var AATMapping = {};
40331 for (var ot in OTMapping) {
40332   var aat = OTMapping[ot];
40333   if (AATMapping[aat[0]] == null) {
40334     AATMapping[aat[0]] = {};
40335   }
40337   AATMapping[aat[0]][aat[1]] = ot;
40340 // Maps an array of OpenType features to AAT features
40341 // in the form of {featureType:{featureSetting:true}}
40342 function mapOTToAAT(features) {
40343   var res = {};
40344   for (var k in features) {
40345     var r = void 0;
40346     if (r = OTMapping[k]) {
40347       if (res[r[0]] == null) {
40348         res[r[0]] = {};
40349       }
40351       res[r[0]][r[1]] = features[k];
40352     }
40353   }
40355   return res;
40358 // Maps strings in a [featureType, featureSetting]
40359 // to their equivalent number codes
40360 function mapFeatureStrings(f) {
40361   var type = f[0],
40362       setting = f[1];
40364   if (isNaN(type)) {
40365     var typeCode = features[type] && features[type].code;
40366   } else {
40367     var typeCode = type;
40368   }
40370   if (isNaN(setting)) {
40371     var settingCode = features[type] && features[type][setting];
40372   } else {
40373     var settingCode = setting;
40374   }
40376   return [typeCode, settingCode];
40379 // Maps AAT features to an array of OpenType features
40380 // Supports both arrays in the form of [[featureType, featureSetting]]
40381 // and objects in the form of {featureType:{featureSetting:true}}
40382 // featureTypes and featureSettings can be either strings or number codes
40383 function mapAATToOT(features) {
40384   var res = {};
40385   if (Array.isArray(features)) {
40386     for (var k = 0; k < features.length; k++) {
40387       var r = void 0;
40388       var f = mapFeatureStrings(features[k]);
40389       if (r = AATMapping[f[0]] && AATMapping[f[0]][f[1]]) {
40390         res[r] = true;
40391       }
40392     }
40393   } else if ((typeof features === 'undefined' ? 'undefined' : _typeof(features)) === 'object') {
40394     for (var type in features) {
40395       var _feature = features[type];
40396       for (var setting in _feature) {
40397         var _r = void 0;
40398         var _f = mapFeatureStrings([type, setting]);
40399         if (_feature[setting] && (_r = AATMapping[_f[0]] && AATMapping[_f[0]][_f[1]])) {
40400           res[_r] = true;
40401         }
40402       }
40403     }
40404   }
40406   return _Object$keys(res);
40409 var _class$3;
40410 function _applyDecoratedDescriptor$3(target, property, decorators, descriptor, context) {
40411   var desc = {};
40412   Object['ke' + 'ys'](descriptor).forEach(function (key) {
40413     desc[key] = descriptor[key];
40414   });
40415   desc.enumerable = !!desc.enumerable;
40416   desc.configurable = !!desc.configurable;
40418   if ('value' in desc || desc.initializer) {
40419     desc.writable = true;
40420   }
40422   desc = decorators.slice().reverse().reduce(function (desc, decorator) {
40423     return decorator(target, property, desc) || desc;
40424   }, desc);
40426   if (context && desc.initializer !== void 0) {
40427     desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
40428     desc.initializer = undefined;
40429   }
40431   if (desc.initializer === void 0) {
40432     Object['define' + 'Property'](target, property, desc);
40433     desc = null;
40434   }
40436   return desc;
40439 var AATLookupTable = (_class$3 = function () {
40440   function AATLookupTable(table) {
40441     _classCallCheck(this, AATLookupTable);
40443     this.table = table;
40444   }
40446   AATLookupTable.prototype.lookup = function lookup(glyph) {
40447     switch (this.table.version) {
40448       case 0:
40449         // simple array format
40450         return this.table.values.getItem(glyph);
40452       case 2: // segment format
40453       case 4:
40454         {
40455           var min = 0;
40456           var max = this.table.binarySearchHeader.nUnits - 1;
40458           while (min <= max) {
40459             var mid = min + max >> 1;
40460             var seg = this.table.segments[mid];
40462             // special end of search value
40463             if (seg.firstGlyph === 0xffff) {
40464               return null;
40465             }
40467             if (glyph < seg.firstGlyph) {
40468               max = mid - 1;
40469             } else if (glyph > seg.lastGlyph) {
40470               min = mid + 1;
40471             } else {
40472               if (this.table.version === 2) {
40473                 return seg.value;
40474               } else {
40475                 return seg.values[glyph - seg.firstGlyph];
40476               }
40477             }
40478           }
40480           return null;
40481         }
40483       case 6:
40484         {
40485           // lookup single
40486           var _min = 0;
40487           var _max = this.table.binarySearchHeader.nUnits - 1;
40489           while (_min <= _max) {
40490             var mid = _min + _max >> 1;
40491             var seg = this.table.segments[mid];
40493             // special end of search value
40494             if (seg.glyph === 0xffff) {
40495               return null;
40496             }
40498             if (glyph < seg.glyph) {
40499               _max = mid - 1;
40500             } else if (glyph > seg.glyph) {
40501               _min = mid + 1;
40502             } else {
40503               return seg.value;
40504             }
40505           }
40507           return null;
40508         }
40510       case 8:
40511         // lookup trimmed
40512         return this.table.values[glyph - this.table.firstGlyph];
40514       default:
40515         throw new Error('Unknown lookup table format: ' + this.table.version);
40516     }
40517   };
40519   AATLookupTable.prototype.glyphsForValue = function glyphsForValue(classValue) {
40520     var res = [];
40522     switch (this.table.version) {
40523       case 2: // segment format
40524       case 4:
40525         {
40526           for (var _iterator = this.table.segments, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
40527             var _ref;
40529             if (_isArray) {
40530               if (_i >= _iterator.length) break;
40531               _ref = _iterator[_i++];
40532             } else {
40533               _i = _iterator.next();
40534               if (_i.done) break;
40535               _ref = _i.value;
40536             }
40538             var segment = _ref;
40540             if (this.table.version === 2 && segment.value === classValue) {
40541               res.push.apply(res, range(segment.firstGlyph, segment.lastGlyph + 1));
40542             } else {
40543               for (var index = 0; index < segment.values.length; index++) {
40544                 if (segment.values[index] === classValue) {
40545                   res.push(segment.firstGlyph + index);
40546                 }
40547               }
40548             }
40549           }
40551           break;
40552         }
40554       case 6:
40555         {
40556           // lookup single
40557           for (var _iterator2 = this.table.segments, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
40558             var _ref2;
40560             if (_isArray2) {
40561               if (_i2 >= _iterator2.length) break;
40562               _ref2 = _iterator2[_i2++];
40563             } else {
40564               _i2 = _iterator2.next();
40565               if (_i2.done) break;
40566               _ref2 = _i2.value;
40567             }
40569             var _segment = _ref2;
40571             if (_segment.value === classValue) {
40572               res.push(_segment.glyph);
40573             }
40574           }
40576           break;
40577         }
40579       case 8:
40580         {
40581           // lookup trimmed
40582           for (var i = 0; i < this.table.values.length; i++) {
40583             if (this.table.values[i] === classValue) {
40584               res.push(this.table.firstGlyph + i);
40585             }
40586           }
40588           break;
40589         }
40591       default:
40592         throw new Error('Unknown lookup table format: ' + this.table.version);
40593     }
40595     return res;
40596   };
40598   return AATLookupTable;
40599 }(), (_applyDecoratedDescriptor$3(_class$3.prototype, 'glyphsForValue', [cache], _Object$getOwnPropertyDescriptor(_class$3.prototype, 'glyphsForValue'), _class$3.prototype)), _class$3);
40601 var START_OF_TEXT_STATE = 0;
40602 var END_OF_TEXT_CLASS = 0;
40603 var OUT_OF_BOUNDS_CLASS = 1;
40604 var DELETED_GLYPH_CLASS = 2;
40605 var DONT_ADVANCE = 0x4000;
40607 var AATStateMachine = function () {
40608   function AATStateMachine(stateTable) {
40609     _classCallCheck(this, AATStateMachine);
40611     this.stateTable = stateTable;
40612     this.lookupTable = new AATLookupTable(stateTable.classTable);
40613   }
40615   AATStateMachine.prototype.process = function process(glyphs, reverse, processEntry) {
40616     var currentState = START_OF_TEXT_STATE; // START_OF_LINE_STATE is used for kashida glyph insertions sometimes I think?
40617     var index = reverse ? glyphs.length - 1 : 0;
40618     var dir = reverse ? -1 : 1;
40620     while (dir === 1 && index <= glyphs.length || dir === -1 && index >= -1) {
40621       var glyph = null;
40622       var classCode = OUT_OF_BOUNDS_CLASS;
40623       var shouldAdvance = true;
40625       if (index === glyphs.length || index === -1) {
40626         classCode = END_OF_TEXT_CLASS;
40627       } else {
40628         glyph = glyphs[index];
40629         if (glyph.id === 0xffff) {
40630           // deleted glyph
40631           classCode = DELETED_GLYPH_CLASS;
40632         } else {
40633           classCode = this.lookupTable.lookup(glyph.id);
40634           if (classCode == null) {
40635             classCode = OUT_OF_BOUNDS_CLASS;
40636           }
40637         }
40638       }
40640       var row = this.stateTable.stateArray.getItem(currentState);
40641       var entryIndex = row[classCode];
40642       var entry = this.stateTable.entryTable.getItem(entryIndex);
40644       if (classCode !== END_OF_TEXT_CLASS && classCode !== DELETED_GLYPH_CLASS) {
40645         processEntry(glyph, entry, index);
40646         shouldAdvance = !(entry.flags & DONT_ADVANCE);
40647       }
40649       currentState = entry.newState;
40650       if (shouldAdvance) {
40651         index += dir;
40652       }
40653     }
40655     return glyphs;
40656   };
40658   /**
40659    * Performs a depth-first traversal of the glyph strings
40660    * represented by the state machine.
40661    */
40664   AATStateMachine.prototype.traverse = function traverse(opts) {
40665     var state = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
40666     var visited = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new _Set();
40668     if (visited.has(state)) {
40669       return;
40670     }
40672     visited.add(state);
40674     var _stateTable = this.stateTable,
40675         nClasses = _stateTable.nClasses,
40676         stateArray = _stateTable.stateArray,
40677         entryTable = _stateTable.entryTable;
40679     var row = stateArray.getItem(state);
40681     // Skip predefined classes
40682     for (var classCode = 4; classCode < nClasses; classCode++) {
40683       var entryIndex = row[classCode];
40684       var entry = entryTable.getItem(entryIndex);
40686       // Try all glyphs in the class
40687       for (var _iterator = this.lookupTable.glyphsForValue(classCode), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
40688         var _ref;
40690         if (_isArray) {
40691           if (_i >= _iterator.length) break;
40692           _ref = _iterator[_i++];
40693         } else {
40694           _i = _iterator.next();
40695           if (_i.done) break;
40696           _ref = _i.value;
40697         }
40699         var glyph = _ref;
40701         if (opts.enter) {
40702           opts.enter(glyph, entry);
40703         }
40705         if (entry.newState !== 0) {
40706           this.traverse(opts, entry.newState, visited);
40707         }
40709         if (opts.exit) {
40710           opts.exit(glyph, entry);
40711         }
40712       }
40713     }
40714   };
40716   return AATStateMachine;
40717 }();
40719 var _class$2;
40720 function _applyDecoratedDescriptor$2(target, property, decorators, descriptor, context) {
40721   var desc = {};
40722   Object['ke' + 'ys'](descriptor).forEach(function (key) {
40723     desc[key] = descriptor[key];
40724   });
40725   desc.enumerable = !!desc.enumerable;
40726   desc.configurable = !!desc.configurable;
40728   if ('value' in desc || desc.initializer) {
40729     desc.writable = true;
40730   }
40732   desc = decorators.slice().reverse().reduce(function (desc, decorator) {
40733     return decorator(target, property, desc) || desc;
40734   }, desc);
40736   if (context && desc.initializer !== void 0) {
40737     desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
40738     desc.initializer = undefined;
40739   }
40741   if (desc.initializer === void 0) {
40742     Object['define' + 'Property'](target, property, desc);
40743     desc = null;
40744   }
40746   return desc;
40749 // indic replacement flags
40750 var MARK_FIRST = 0x8000;
40751 var MARK_LAST = 0x2000;
40752 var VERB = 0x000F;
40754 // contextual substitution and glyph insertion flag
40755 var SET_MARK = 0x8000;
40757 // ligature entry flags
40758 var SET_COMPONENT = 0x8000;
40759 var PERFORM_ACTION = 0x2000;
40761 // ligature action masks
40762 var LAST_MASK = 0x80000000;
40763 var STORE_MASK = 0x40000000;
40764 var OFFSET_MASK = 0x3FFFFFFF;
40766 var REVERSE_DIRECTION = 0x400000;
40767 var CURRENT_INSERT_BEFORE = 0x0800;
40768 var MARKED_INSERT_BEFORE = 0x0400;
40769 var CURRENT_INSERT_COUNT = 0x03E0;
40770 var MARKED_INSERT_COUNT = 0x001F;
40772 var AATMorxProcessor = (_class$2 = function () {
40773   function AATMorxProcessor(font) {
40774     _classCallCheck(this, AATMorxProcessor);
40776     this.processIndicRearragement = this.processIndicRearragement.bind(this);
40777     this.processContextualSubstitution = this.processContextualSubstitution.bind(this);
40778     this.processLigature = this.processLigature.bind(this);
40779     this.processNoncontextualSubstitutions = this.processNoncontextualSubstitutions.bind(this);
40780     this.processGlyphInsertion = this.processGlyphInsertion.bind(this);
40781     this.font = font;
40782     this.morx = font.morx;
40783     this.inputCache = null;
40784   }
40786   // Processes an array of glyphs and applies the specified features
40787   // Features should be in the form of {featureType:{featureSetting:true}}
40790   AATMorxProcessor.prototype.process = function process(glyphs) {
40791     var features = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
40793     for (var _iterator = this.morx.chains, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
40794       var _ref;
40796       if (_isArray) {
40797         if (_i >= _iterator.length) break;
40798         _ref = _iterator[_i++];
40799       } else {
40800         _i = _iterator.next();
40801         if (_i.done) break;
40802         _ref = _i.value;
40803       }
40805       var chain = _ref;
40807       var flags = chain.defaultFlags;
40809       // enable/disable the requested features
40810       for (var _iterator2 = chain.features, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
40811         var _ref2;
40813         if (_isArray2) {
40814           if (_i2 >= _iterator2.length) break;
40815           _ref2 = _iterator2[_i2++];
40816         } else {
40817           _i2 = _iterator2.next();
40818           if (_i2.done) break;
40819           _ref2 = _i2.value;
40820         }
40822         var feature = _ref2;
40824         var f = void 0;
40825         if ((f = features[feature.featureType]) && f[feature.featureSetting]) {
40826           flags &= feature.disableFlags;
40827           flags |= feature.enableFlags;
40828         }
40829       }
40831       for (var _iterator3 = chain.subtables, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
40832         var _ref3;
40834         if (_isArray3) {
40835           if (_i3 >= _iterator3.length) break;
40836           _ref3 = _iterator3[_i3++];
40837         } else {
40838           _i3 = _iterator3.next();
40839           if (_i3.done) break;
40840           _ref3 = _i3.value;
40841         }
40843         var subtable = _ref3;
40845         if (subtable.subFeatureFlags & flags) {
40846           this.processSubtable(subtable, glyphs);
40847         }
40848       }
40849     }
40851     // remove deleted glyphs
40852     var index = glyphs.length - 1;
40853     while (index >= 0) {
40854       if (glyphs[index].id === 0xffff) {
40855         glyphs.splice(index, 1);
40856       }
40858       index--;
40859     }
40861     return glyphs;
40862   };
40864   AATMorxProcessor.prototype.processSubtable = function processSubtable(subtable, glyphs) {
40865     this.subtable = subtable;
40866     this.glyphs = glyphs;
40867     if (this.subtable.type === 4) {
40868       this.processNoncontextualSubstitutions(this.subtable, this.glyphs);
40869       return;
40870     }
40872     this.ligatureStack = [];
40873     this.markedGlyph = null;
40874     this.firstGlyph = null;
40875     this.lastGlyph = null;
40876     this.markedIndex = null;
40878     var stateMachine = this.getStateMachine(subtable);
40879     var process = this.getProcessor();
40881     var reverse = !!(this.subtable.coverage & REVERSE_DIRECTION);
40882     return stateMachine.process(this.glyphs, reverse, process);
40883   };
40885   AATMorxProcessor.prototype.getStateMachine = function getStateMachine(subtable) {
40886     return new AATStateMachine(subtable.table.stateTable);
40887   };
40889   AATMorxProcessor.prototype.getProcessor = function getProcessor() {
40890     switch (this.subtable.type) {
40891       case 0:
40892         return this.processIndicRearragement;
40893       case 1:
40894         return this.processContextualSubstitution;
40895       case 2:
40896         return this.processLigature;
40897       case 4:
40898         return this.processNoncontextualSubstitutions;
40899       case 5:
40900         return this.processGlyphInsertion;
40901       default:
40902         throw new Error('Invalid morx subtable type: ' + this.subtable.type);
40903     }
40904   };
40906   AATMorxProcessor.prototype.processIndicRearragement = function processIndicRearragement(glyph, entry, index) {
40907     if (entry.flags & MARK_FIRST) {
40908       this.firstGlyph = index;
40909     }
40911     if (entry.flags & MARK_LAST) {
40912       this.lastGlyph = index;
40913     }
40915     reorderGlyphs(this.glyphs, entry.flags & VERB, this.firstGlyph, this.lastGlyph);
40916   };
40918   AATMorxProcessor.prototype.processContextualSubstitution = function processContextualSubstitution(glyph, entry, index) {
40919     var subsitutions = this.subtable.table.substitutionTable.items;
40920     if (entry.markIndex !== 0xffff) {
40921       var lookup = subsitutions.getItem(entry.markIndex);
40922       var lookupTable = new AATLookupTable(lookup);
40923       glyph = this.glyphs[this.markedGlyph];
40924       var gid = lookupTable.lookup(glyph.id);
40925       if (gid) {
40926         this.glyphs[this.markedGlyph] = this.font.getGlyph(gid, glyph.codePoints);
40927       }
40928     }
40930     if (entry.currentIndex !== 0xffff) {
40931       var _lookup = subsitutions.getItem(entry.currentIndex);
40932       var _lookupTable = new AATLookupTable(_lookup);
40933       glyph = this.glyphs[index];
40934       var gid = _lookupTable.lookup(glyph.id);
40935       if (gid) {
40936         this.glyphs[index] = this.font.getGlyph(gid, glyph.codePoints);
40937       }
40938     }
40940     if (entry.flags & SET_MARK) {
40941       this.markedGlyph = index;
40942     }
40943   };
40945   AATMorxProcessor.prototype.processLigature = function processLigature(glyph, entry, index) {
40946     if (entry.flags & SET_COMPONENT) {
40947       this.ligatureStack.push(index);
40948     }
40950     if (entry.flags & PERFORM_ACTION) {
40951       var _ligatureStack;
40953       var actions = this.subtable.table.ligatureActions;
40954       var components = this.subtable.table.components;
40955       var ligatureList = this.subtable.table.ligatureList;
40957       var actionIndex = entry.action;
40958       var last = false;
40959       var ligatureIndex = 0;
40960       var codePoints = [];
40961       var ligatureGlyphs = [];
40963       while (!last) {
40964         var _codePoints;
40966         var componentGlyph = this.ligatureStack.pop();
40967         (_codePoints = codePoints).unshift.apply(_codePoints, this.glyphs[componentGlyph].codePoints);
40969         var action = actions.getItem(actionIndex++);
40970         last = !!(action & LAST_MASK);
40971         var store = !!(action & STORE_MASK);
40972         var offset = (action & OFFSET_MASK) << 2 >> 2; // sign extend 30 to 32 bits
40973         offset += this.glyphs[componentGlyph].id;
40975         var component = components.getItem(offset);
40976         ligatureIndex += component;
40978         if (last || store) {
40979           var ligatureEntry = ligatureList.getItem(ligatureIndex);
40980           this.glyphs[componentGlyph] = this.font.getGlyph(ligatureEntry, codePoints);
40981           ligatureGlyphs.push(componentGlyph);
40982           ligatureIndex = 0;
40983           codePoints = [];
40984         } else {
40985           this.glyphs[componentGlyph] = this.font.getGlyph(0xffff);
40986         }
40987       }
40989       // Put ligature glyph indexes back on the stack
40990       (_ligatureStack = this.ligatureStack).push.apply(_ligatureStack, ligatureGlyphs);
40991     }
40992   };
40994   AATMorxProcessor.prototype.processNoncontextualSubstitutions = function processNoncontextualSubstitutions(subtable, glyphs, index) {
40995     var lookupTable = new AATLookupTable(subtable.table.lookupTable);
40997     for (index = 0; index < glyphs.length; index++) {
40998       var glyph = glyphs[index];
40999       if (glyph.id !== 0xffff) {
41000         var gid = lookupTable.lookup(glyph.id);
41001         if (gid) {
41002           // 0 means do nothing
41003           glyphs[index] = this.font.getGlyph(gid, glyph.codePoints);
41004         }
41005       }
41006     }
41007   };
41009   AATMorxProcessor.prototype._insertGlyphs = function _insertGlyphs(glyphIndex, insertionActionIndex, count, isBefore) {
41010     var _glyphs;
41012     var insertions = [];
41013     while (count--) {
41014       var gid = this.subtable.table.insertionActions.getItem(insertionActionIndex++);
41015       insertions.push(this.font.getGlyph(gid));
41016     }
41018     if (!isBefore) {
41019       glyphIndex++;
41020     }
41022     (_glyphs = this.glyphs).splice.apply(_glyphs, [glyphIndex, 0].concat(insertions));
41023   };
41025   AATMorxProcessor.prototype.processGlyphInsertion = function processGlyphInsertion(glyph, entry, index) {
41026     if (entry.flags & SET_MARK) {
41027       this.markedIndex = index;
41028     }
41030     if (entry.markedInsertIndex !== 0xffff) {
41031       var count = (entry.flags & MARKED_INSERT_COUNT) >>> 5;
41032       var isBefore = !!(entry.flags & MARKED_INSERT_BEFORE);
41033       this._insertGlyphs(this.markedIndex, entry.markedInsertIndex, count, isBefore);
41034     }
41036     if (entry.currentInsertIndex !== 0xffff) {
41037       var _count = (entry.flags & CURRENT_INSERT_COUNT) >>> 5;
41038       var _isBefore = !!(entry.flags & CURRENT_INSERT_BEFORE);
41039       this._insertGlyphs(index, entry.currentInsertIndex, _count, _isBefore);
41040     }
41041   };
41043   AATMorxProcessor.prototype.getSupportedFeatures = function getSupportedFeatures() {
41044     var features = [];
41045     for (var _iterator4 = this.morx.chains, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _getIterator(_iterator4);;) {
41046       var _ref4;
41048       if (_isArray4) {
41049         if (_i4 >= _iterator4.length) break;
41050         _ref4 = _iterator4[_i4++];
41051       } else {
41052         _i4 = _iterator4.next();
41053         if (_i4.done) break;
41054         _ref4 = _i4.value;
41055       }
41057       var chain = _ref4;
41059       for (var _iterator5 = chain.features, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _getIterator(_iterator5);;) {
41060         var _ref5;
41062         if (_isArray5) {
41063           if (_i5 >= _iterator5.length) break;
41064           _ref5 = _iterator5[_i5++];
41065         } else {
41066           _i5 = _iterator5.next();
41067           if (_i5.done) break;
41068           _ref5 = _i5.value;
41069         }
41071         var feature = _ref5;
41073         features.push([feature.featureType, feature.featureSetting]);
41074       }
41075     }
41077     return features;
41078   };
41080   AATMorxProcessor.prototype.generateInputs = function generateInputs(gid) {
41081     if (!this.inputCache) {
41082       this.generateInputCache();
41083     }
41085     return this.inputCache[gid] || [];
41086   };
41088   AATMorxProcessor.prototype.generateInputCache = function generateInputCache() {
41089     this.inputCache = {};
41091     for (var _iterator6 = this.morx.chains, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _getIterator(_iterator6);;) {
41092       var _ref6;
41094       if (_isArray6) {
41095         if (_i6 >= _iterator6.length) break;
41096         _ref6 = _iterator6[_i6++];
41097       } else {
41098         _i6 = _iterator6.next();
41099         if (_i6.done) break;
41100         _ref6 = _i6.value;
41101       }
41103       var chain = _ref6;
41105       var flags = chain.defaultFlags;
41107       for (var _iterator7 = chain.subtables, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _getIterator(_iterator7);;) {
41108         var _ref7;
41110         if (_isArray7) {
41111           if (_i7 >= _iterator7.length) break;
41112           _ref7 = _iterator7[_i7++];
41113         } else {
41114           _i7 = _iterator7.next();
41115           if (_i7.done) break;
41116           _ref7 = _i7.value;
41117         }
41119         var subtable = _ref7;
41121         if (subtable.subFeatureFlags & flags) {
41122           this.generateInputsForSubtable(subtable);
41123         }
41124       }
41125     }
41126   };
41128   AATMorxProcessor.prototype.generateInputsForSubtable = function generateInputsForSubtable(subtable) {
41129     var _this = this;
41131     // Currently, only supporting ligature subtables.
41132     if (subtable.type !== 2) {
41133       return;
41134     }
41136     var reverse = !!(subtable.coverage & REVERSE_DIRECTION);
41137     if (reverse) {
41138       throw new Error('Reverse subtable, not supported.');
41139     }
41141     this.subtable = subtable;
41142     this.ligatureStack = [];
41144     var stateMachine = this.getStateMachine(subtable);
41145     var process = this.getProcessor();
41147     var input = [];
41148     var stack = [];
41149     this.glyphs = [];
41151     stateMachine.traverse({
41152       enter: function enter(glyph, entry) {
41153         var glyphs = _this.glyphs;
41154         stack.push({
41155           glyphs: glyphs.slice(),
41156           ligatureStack: _this.ligatureStack.slice()
41157         });
41159         // Add glyph to input and glyphs to process.
41160         var g = _this.font.getGlyph(glyph);
41161         input.push(g);
41162         glyphs.push(input[input.length - 1]);
41164         // Process ligature substitution
41165         process(glyphs[glyphs.length - 1], entry, glyphs.length - 1);
41167         // Add input to result if only one matching (non-deleted) glyph remains.
41168         var count = 0;
41169         var found = 0;
41170         for (var i = 0; i < glyphs.length && count <= 1; i++) {
41171           if (glyphs[i].id !== 0xffff) {
41172             count++;
41173             found = glyphs[i].id;
41174           }
41175         }
41177         if (count === 1) {
41178           var result = input.map(function (g) {
41179             return g.id;
41180           });
41181           var _cache = _this.inputCache[found];
41182           if (_cache) {
41183             _cache.push(result);
41184           } else {
41185             _this.inputCache[found] = [result];
41186           }
41187         }
41188       },
41190       exit: function exit() {
41191         var _stack$pop = stack.pop();
41193         _this.glyphs = _stack$pop.glyphs;
41194         _this.ligatureStack = _stack$pop.ligatureStack;
41196         input.pop();
41197       }
41198     });
41199   };
41201   return AATMorxProcessor;
41202 }(), (_applyDecoratedDescriptor$2(_class$2.prototype, 'getStateMachine', [cache], _Object$getOwnPropertyDescriptor(_class$2.prototype, 'getStateMachine'), _class$2.prototype)), _class$2);
41204 function swap(glyphs, rangeA, rangeB) {
41205   var reverseA = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
41206   var reverseB = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
41208   var end = glyphs.splice(rangeB[0] - (rangeB[1] - 1), rangeB[1]);
41209   if (reverseB) {
41210     end.reverse();
41211   }
41213   var start = glyphs.splice.apply(glyphs, [rangeA[0], rangeA[1]].concat(end));
41214   if (reverseA) {
41215     start.reverse();
41216   }
41218   glyphs.splice.apply(glyphs, [rangeB[0] - (rangeA[1] - 1), 0].concat(start));
41219   return glyphs;
41222 function reorderGlyphs(glyphs, verb, firstGlyph, lastGlyph) {
41223   var length = lastGlyph - firstGlyph + 1;
41224   switch (verb) {
41225     case 0:
41226       // no change
41227       return glyphs;
41229     case 1:
41230       // Ax => xA
41231       return swap(glyphs, [firstGlyph, 1], [lastGlyph, 0]);
41233     case 2:
41234       // xD => Dx
41235       return swap(glyphs, [firstGlyph, 0], [lastGlyph, 1]);
41237     case 3:
41238       // AxD => DxA
41239       return swap(glyphs, [firstGlyph, 1], [lastGlyph, 1]);
41241     case 4:
41242       // ABx => xAB
41243       return swap(glyphs, [firstGlyph, 2], [lastGlyph, 0]);
41245     case 5:
41246       // ABx => xBA
41247       return swap(glyphs, [firstGlyph, 2], [lastGlyph, 0], true, false);
41249     case 6:
41250       // xCD => CDx
41251       return swap(glyphs, [firstGlyph, 0], [lastGlyph, 2]);
41253     case 7:
41254       // xCD => DCx
41255       return swap(glyphs, [firstGlyph, 0], [lastGlyph, 2], false, true);
41257     case 8:
41258       // AxCD => CDxA
41259       return swap(glyphs, [firstGlyph, 1], [lastGlyph, 2]);
41261     case 9:
41262       // AxCD => DCxA
41263       return swap(glyphs, [firstGlyph, 1], [lastGlyph, 2], false, true);
41265     case 10:
41266       // ABxD => DxAB
41267       return swap(glyphs, [firstGlyph, 2], [lastGlyph, 1]);
41269     case 11:
41270       // ABxD => DxBA
41271       return swap(glyphs, [firstGlyph, 2], [lastGlyph, 1], true, false);
41273     case 12:
41274       // ABxCD => CDxAB
41275       return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2]);
41277     case 13:
41278       // ABxCD => CDxBA
41279       return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2], true, false);
41281     case 14:
41282       // ABxCD => DCxAB
41283       return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2], false, true);
41285     case 15:
41286       // ABxCD => DCxBA
41287       return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2], true, true);
41289     default:
41290       throw new Error('Unknown verb: ' + verb);
41291   }
41294 var AATLayoutEngine = function () {
41295   function AATLayoutEngine(font) {
41296     _classCallCheck(this, AATLayoutEngine);
41298     this.font = font;
41299     this.morxProcessor = new AATMorxProcessor(font);
41300     this.fallbackPosition = false;
41301   }
41303   AATLayoutEngine.prototype.substitute = function substitute(glyphRun) {
41304     // AAT expects the glyphs to be in visual order prior to morx processing,
41305     // so reverse the glyphs if the script is right-to-left.
41306     if (glyphRun.direction === 'rtl') {
41307       glyphRun.glyphs.reverse();
41308     }
41310     this.morxProcessor.process(glyphRun.glyphs, mapOTToAAT(glyphRun.features));
41311   };
41313   AATLayoutEngine.prototype.getAvailableFeatures = function getAvailableFeatures(script, language) {
41314     return mapAATToOT(this.morxProcessor.getSupportedFeatures());
41315   };
41317   AATLayoutEngine.prototype.stringsForGlyph = function stringsForGlyph(gid) {
41318     var glyphStrings = this.morxProcessor.generateInputs(gid);
41319     var result = new _Set();
41321     for (var _iterator = glyphStrings, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
41322       var _ref;
41324       if (_isArray) {
41325         if (_i >= _iterator.length) break;
41326         _ref = _iterator[_i++];
41327       } else {
41328         _i = _iterator.next();
41329         if (_i.done) break;
41330         _ref = _i.value;
41331       }
41333       var glyphs = _ref;
41335       this._addStrings(glyphs, 0, result, '');
41336     }
41338     return result;
41339   };
41341   AATLayoutEngine.prototype._addStrings = function _addStrings(glyphs, index, strings, string) {
41342     var codePoints = this.font._cmapProcessor.codePointsForGlyph(glyphs[index]);
41344     for (var _iterator2 = codePoints, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
41345       var _ref2;
41347       if (_isArray2) {
41348         if (_i2 >= _iterator2.length) break;
41349         _ref2 = _iterator2[_i2++];
41350       } else {
41351         _i2 = _iterator2.next();
41352         if (_i2.done) break;
41353         _ref2 = _i2.value;
41354       }
41356       var codePoint = _ref2;
41358       var s = string + _String$fromCodePoint(codePoint);
41359       if (index < glyphs.length - 1) {
41360         this._addStrings(glyphs, index + 1, strings, s);
41361       } else {
41362         strings.add(s);
41363       }
41364     }
41365   };
41367   return AATLayoutEngine;
41368 }();
41371  * ShapingPlans are used by the OpenType shapers to store which
41372  * features should by applied, and in what order to apply them.
41373  * The features are applied in groups called stages. A feature
41374  * can be applied globally to all glyphs, or locally to only
41375  * specific glyphs.
41377  * @private
41378  */
41380 var ShapingPlan = function () {
41381   function ShapingPlan(font, script, direction) {
41382     _classCallCheck(this, ShapingPlan);
41384     this.font = font;
41385     this.script = script;
41386     this.direction = direction;
41387     this.stages = [];
41388     this.globalFeatures = {};
41389     this.allFeatures = {};
41390   }
41392   /**
41393    * Adds the given features to the last stage.
41394    * Ignores features that have already been applied.
41395    */
41398   ShapingPlan.prototype._addFeatures = function _addFeatures(features, global) {
41399     var stageIndex = this.stages.length - 1;
41400     var stage = this.stages[stageIndex];
41401     for (var _iterator = features, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
41402       var _ref;
41404       if (_isArray) {
41405         if (_i >= _iterator.length) break;
41406         _ref = _iterator[_i++];
41407       } else {
41408         _i = _iterator.next();
41409         if (_i.done) break;
41410         _ref = _i.value;
41411       }
41413       var feature = _ref;
41415       if (this.allFeatures[feature] == null) {
41416         stage.push(feature);
41417         this.allFeatures[feature] = stageIndex;
41419         if (global) {
41420           this.globalFeatures[feature] = true;
41421         }
41422       }
41423     }
41424   };
41426   /**
41427    * Add features to the last stage
41428    */
41431   ShapingPlan.prototype.add = function add(arg) {
41432     var global = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
41434     if (this.stages.length === 0) {
41435       this.stages.push([]);
41436     }
41438     if (typeof arg === 'string') {
41439       arg = [arg];
41440     }
41442     if (Array.isArray(arg)) {
41443       this._addFeatures(arg, global);
41444     } else if ((typeof arg === 'undefined' ? 'undefined' : _typeof(arg)) === 'object') {
41445       this._addFeatures(arg.global || [], true);
41446       this._addFeatures(arg.local || [], false);
41447     } else {
41448       throw new Error("Unsupported argument to ShapingPlan#add");
41449     }
41450   };
41452   /**
41453    * Add a new stage
41454    */
41457   ShapingPlan.prototype.addStage = function addStage(arg, global) {
41458     if (typeof arg === 'function') {
41459       this.stages.push(arg, []);
41460     } else {
41461       this.stages.push([]);
41462       this.add(arg, global);
41463     }
41464   };
41466   ShapingPlan.prototype.setFeatureOverrides = function setFeatureOverrides(features) {
41467     if (Array.isArray(features)) {
41468       this.add(features);
41469     } else if ((typeof features === 'undefined' ? 'undefined' : _typeof(features)) === 'object') {
41470       for (var tag in features) {
41471         if (features[tag]) {
41472           this.add(tag);
41473         } else if (this.allFeatures[tag] != null) {
41474           var stage = this.stages[this.allFeatures[tag]];
41475           stage.splice(stage.indexOf(tag), 1);
41476           delete this.allFeatures[tag];
41477           delete this.globalFeatures[tag];
41478         }
41479       }
41480     }
41481   };
41483   /**
41484    * Assigns the global features to the given glyphs
41485    */
41488   ShapingPlan.prototype.assignGlobalFeatures = function assignGlobalFeatures(glyphs) {
41489     for (var _iterator2 = glyphs, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
41490       var _ref2;
41492       if (_isArray2) {
41493         if (_i2 >= _iterator2.length) break;
41494         _ref2 = _iterator2[_i2++];
41495       } else {
41496         _i2 = _iterator2.next();
41497         if (_i2.done) break;
41498         _ref2 = _i2.value;
41499       }
41501       var glyph = _ref2;
41503       for (var feature in this.globalFeatures) {
41504         glyph.features[feature] = true;
41505       }
41506     }
41507   };
41509   /**
41510    * Executes the planned stages using the given OTProcessor
41511    */
41514   ShapingPlan.prototype.process = function process(processor, glyphs, positions) {
41515     for (var _iterator3 = this.stages, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
41516       var _ref3;
41518       if (_isArray3) {
41519         if (_i3 >= _iterator3.length) break;
41520         _ref3 = _iterator3[_i3++];
41521       } else {
41522         _i3 = _iterator3.next();
41523         if (_i3.done) break;
41524         _ref3 = _i3.value;
41525       }
41527       var stage = _ref3;
41529       if (typeof stage === 'function') {
41530         if (!positions) {
41531           stage(this.font, glyphs, this);
41532         }
41533       } else if (stage.length > 0) {
41534         processor.applyFeatures(stage, glyphs, positions);
41535       }
41536     }
41537   };
41539   return ShapingPlan;
41540 }();
41542 var _class$4;
41543 var _temp;
41544 var VARIATION_FEATURES = ['rvrn'];
41545 var COMMON_FEATURES = ['ccmp', 'locl', 'rlig', 'mark', 'mkmk'];
41546 var FRACTIONAL_FEATURES = ['frac', 'numr', 'dnom'];
41547 var HORIZONTAL_FEATURES = ['calt', 'clig', 'liga', 'rclt', 'curs', 'kern'];
41548 var DIRECTIONAL_FEATURES = {
41549   ltr: ['ltra', 'ltrm'],
41550   rtl: ['rtla', 'rtlm']
41553 var DefaultShaper = (_temp = _class$4 = function () {
41554   function DefaultShaper() {
41555     _classCallCheck(this, DefaultShaper);
41556   }
41558   DefaultShaper.plan = function plan(_plan, glyphs, features) {
41559     // Plan the features we want to apply
41560     this.planPreprocessing(_plan);
41561     this.planFeatures(_plan);
41562     this.planPostprocessing(_plan, features);
41564     // Assign the global features to all the glyphs
41565     _plan.assignGlobalFeatures(glyphs);
41567     // Assign local features to glyphs
41568     this.assignFeatures(_plan, glyphs);
41569   };
41571   DefaultShaper.planPreprocessing = function planPreprocessing(plan) {
41572     plan.add({
41573       global: [].concat(VARIATION_FEATURES, DIRECTIONAL_FEATURES[plan.direction]),
41574       local: FRACTIONAL_FEATURES
41575     });
41576   };
41578   DefaultShaper.planFeatures = function planFeatures(plan) {
41579     // Do nothing by default. Let subclasses override this.
41580   };
41582   DefaultShaper.planPostprocessing = function planPostprocessing(plan, userFeatures) {
41583     plan.add([].concat(COMMON_FEATURES, HORIZONTAL_FEATURES));
41584     plan.setFeatureOverrides(userFeatures);
41585   };
41587   DefaultShaper.assignFeatures = function assignFeatures(plan, glyphs) {
41588     // Enable contextual fractions
41589     for (var i = 0; i < glyphs.length; i++) {
41590       var glyph = glyphs[i];
41591       if (glyph.codePoints[0] === 0x2044) {
41592         // fraction slash
41593         var start = i;
41594         var end = i + 1;
41596         // Apply numerator
41597         while (start > 0 && unicode.isDigit(glyphs[start - 1].codePoints[0])) {
41598           glyphs[start - 1].features.numr = true;
41599           glyphs[start - 1].features.frac = true;
41600           start--;
41601         }
41603         // Apply denominator
41604         while (end < glyphs.length && unicode.isDigit(glyphs[end].codePoints[0])) {
41605           glyphs[end].features.dnom = true;
41606           glyphs[end].features.frac = true;
41607           end++;
41608         }
41610         // Apply fraction slash
41611         glyph.features.frac = true;
41612         i = end - 1;
41613       }
41614     }
41615   };
41617   return DefaultShaper;
41618 }(), _class$4.zeroMarkWidths = 'AFTER_GPOS', _temp);
41620 var trie = new UnicodeTrie(Buffer("AAEQAAAAAAAAADGgAZUBav7t2CtPA0EUBeDZB00pin9AJZIEgyUEj0QhweDAgQOJxCBRBElQSBwSicLgkOAwnNKZ5GaY2c7uzj4o5yZfZrrbefbuIx2nSq3CGmzAWH/+K+UO7MIe7MMhHMMpnMMFXMIVXIt2t3CnP088iPqjqNN8e4Ij7Rle4LUH82rLm6i/92A+RERERERERERNmfz/89GDeRARERERzbN8ceps2Iwt9H0C9/AJ6yOlDkbTczcot5VSm8Pm1vcFWfb7+BKOLTuOd2UlTX4wGP85Eg953lWPFbnuN7PkjtLmalOWbNenkHOSa7T3KmR9MVTZ2zZkVj1kHa68MueVKH0R4zqQ44WEXLM8VjcWHP0PtKLfPzQnMtGn3W4QYf6qxFxceVI394r2xnV+1rih0fV1Vzf3fO1n3evL5J78ruvZ5ptX2Rwy92Tfb1wlEqut3U+sZ3HXOeJ7/zDrbyuP6+Zz0fqa6Nv3vhY7Yu1xWnGevmsvsUpTT/RYIe8waUH/rvHMWKFzLfN8L+rTfp645mfX7ftlnfDtYxN59w0=","base64"));
41621 var FEATURES = ['isol', 'fina', 'fin2', 'fin3', 'medi', 'med2', 'init'];
41623 var ShapingClasses = {
41624   Non_Joining: 0,
41625   Left_Joining: 1,
41626   Right_Joining: 2,
41627   Dual_Joining: 3,
41628   Join_Causing: 3,
41629   ALAPH: 4,
41630   'DALATH RISH': 5,
41631   Transparent: 6
41634 var ISOL = 'isol';
41635 var FINA = 'fina';
41636 var FIN2 = 'fin2';
41637 var FIN3 = 'fin3';
41638 var MEDI = 'medi';
41639 var MED2 = 'med2';
41640 var INIT = 'init';
41641 var NONE = null;
41643 // Each entry is [prevAction, curAction, nextState]
41644 var STATE_TABLE = [
41645 //   Non_Joining,        Left_Joining,       Right_Joining,     Dual_Joining,           ALAPH,            DALATH RISH
41646 // State 0: prev was U,  not willing to join.
41647 [[NONE, NONE, 0], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 6]],
41649 // State 1: prev was R or ISOL/ALAPH,  not willing to join.
41650 [[NONE, NONE, 0], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 2], [NONE, FIN2, 5], [NONE, ISOL, 6]],
41652 // State 2: prev was D/L in ISOL form,  willing to join.
41653 [[NONE, NONE, 0], [NONE, ISOL, 2], [INIT, FINA, 1], [INIT, FINA, 3], [INIT, FINA, 4], [INIT, FINA, 6]],
41655 // State 3: prev was D in FINA form,  willing to join.
41656 [[NONE, NONE, 0], [NONE, ISOL, 2], [MEDI, FINA, 1], [MEDI, FINA, 3], [MEDI, FINA, 4], [MEDI, FINA, 6]],
41658 // State 4: prev was FINA ALAPH,  not willing to join.
41659 [[NONE, NONE, 0], [NONE, ISOL, 2], [MED2, ISOL, 1], [MED2, ISOL, 2], [MED2, FIN2, 5], [MED2, ISOL, 6]],
41661 // State 5: prev was FIN2/FIN3 ALAPH,  not willing to join.
41662 [[NONE, NONE, 0], [NONE, ISOL, 2], [ISOL, ISOL, 1], [ISOL, ISOL, 2], [ISOL, FIN2, 5], [ISOL, ISOL, 6]],
41664 // State 6: prev was DALATH/RISH,  not willing to join.
41665 [[NONE, NONE, 0], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 2], [NONE, FIN3, 5], [NONE, ISOL, 6]]];
41668  * This is a shaper for Arabic, and other cursive scripts.
41669  * It uses data from ArabicShaping.txt in the Unicode database,
41670  * compiled to a UnicodeTrie by generate-data.coffee.
41672  * The shaping state machine was ported from Harfbuzz.
41673  * https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-complex-arabic.cc
41674  */
41676 var ArabicShaper = function (_DefaultShaper) {
41677   _inherits(ArabicShaper, _DefaultShaper);
41679   function ArabicShaper() {
41680     _classCallCheck(this, ArabicShaper);
41682     return _possibleConstructorReturn(this, _DefaultShaper.apply(this, arguments));
41683   }
41685   ArabicShaper.planFeatures = function planFeatures(plan) {
41686     plan.add(['ccmp', 'locl']);
41687     for (var i = 0; i < FEATURES.length; i++) {
41688       var feature = FEATURES[i];
41689       plan.addStage(feature, false);
41690     }
41692     plan.addStage('mset');
41693   };
41695   ArabicShaper.assignFeatures = function assignFeatures(plan, glyphs) {
41696     _DefaultShaper.assignFeatures.call(this, plan, glyphs);
41698     var prev = -1;
41699     var state = 0;
41700     var actions = [];
41702     // Apply the state machine to map glyphs to features
41703     for (var i = 0; i < glyphs.length; i++) {
41704       var curAction = void 0,
41705           prevAction = void 0;
41706       var glyph = glyphs[i];
41707       var type = getShapingClass(glyph.codePoints[0]);
41708       if (type === ShapingClasses.Transparent) {
41709         actions[i] = NONE;
41710         continue;
41711       }
41713       var _STATE_TABLE$state$ty = STATE_TABLE[state][type];
41714       prevAction = _STATE_TABLE$state$ty[0];
41715       curAction = _STATE_TABLE$state$ty[1];
41716       state = _STATE_TABLE$state$ty[2];
41719       if (prevAction !== NONE && prev !== -1) {
41720         actions[prev] = prevAction;
41721       }
41723       actions[i] = curAction;
41724       prev = i;
41725     }
41727     // Apply the chosen features to their respective glyphs
41728     for (var index = 0; index < glyphs.length; index++) {
41729       var feature = void 0;
41730       var glyph = glyphs[index];
41731       if (feature = actions[index]) {
41732         glyph.features[feature] = true;
41733       }
41734     }
41735   };
41737   return ArabicShaper;
41738 }(DefaultShaper);
41740 function getShapingClass(codePoint) {
41741   var res = trie.get(codePoint);
41742   if (res) {
41743     return res - 1;
41744   }
41746   var category = unicode.getCategory(codePoint);
41747   if (category === 'Mn' || category === 'Me' || category === 'Cf') {
41748     return ShapingClasses.Transparent;
41749   }
41751   return ShapingClasses.Non_Joining;
41754 var GlyphIterator = function () {
41755   function GlyphIterator(glyphs, options) {
41756     _classCallCheck(this, GlyphIterator);
41758     this.glyphs = glyphs;
41759     this.reset(options);
41760   }
41762   GlyphIterator.prototype.reset = function reset() {
41763     var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
41764     var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
41766     this.options = options;
41767     this.flags = options.flags || {};
41768     this.markAttachmentType = options.markAttachmentType || 0;
41769     this.index = index;
41770   };
41772   GlyphIterator.prototype.shouldIgnore = function shouldIgnore(glyph) {
41773     return this.flags.ignoreMarks && glyph.isMark || this.flags.ignoreBaseGlyphs && glyph.isBase || this.flags.ignoreLigatures && glyph.isLigature || this.markAttachmentType && glyph.isMark && glyph.markAttachmentType !== this.markAttachmentType;
41774   };
41776   GlyphIterator.prototype.move = function move(dir) {
41777     this.index += dir;
41778     while (0 <= this.index && this.index < this.glyphs.length && this.shouldIgnore(this.glyphs[this.index])) {
41779       this.index += dir;
41780     }
41782     if (0 > this.index || this.index >= this.glyphs.length) {
41783       return null;
41784     }
41786     return this.glyphs[this.index];
41787   };
41789   GlyphIterator.prototype.next = function next() {
41790     return this.move(+1);
41791   };
41793   GlyphIterator.prototype.prev = function prev() {
41794     return this.move(-1);
41795   };
41797   GlyphIterator.prototype.peek = function peek() {
41798     var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
41800     var idx = this.index;
41801     var res = this.increment(count);
41802     this.index = idx;
41803     return res;
41804   };
41806   GlyphIterator.prototype.peekIndex = function peekIndex() {
41807     var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
41809     var idx = this.index;
41810     this.increment(count);
41811     var res = this.index;
41812     this.index = idx;
41813     return res;
41814   };
41816   GlyphIterator.prototype.increment = function increment() {
41817     var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
41819     var dir = count < 0 ? -1 : 1;
41820     count = Math.abs(count);
41821     while (count--) {
41822       this.move(dir);
41823     }
41825     return this.glyphs[this.index];
41826   };
41828   _createClass(GlyphIterator, [{
41829     key: "cur",
41830     get: function get() {
41831       return this.glyphs[this.index] || null;
41832     }
41833   }]);
41835   return GlyphIterator;
41836 }();
41838 var DEFAULT_SCRIPTS = ['DFLT', 'dflt', 'latn'];
41840 var OTProcessor = function () {
41841   function OTProcessor(font, table) {
41842     _classCallCheck(this, OTProcessor);
41844     this.font = font;
41845     this.table = table;
41847     this.script = null;
41848     this.scriptTag = null;
41850     this.language = null;
41851     this.languageTag = null;
41853     this.features = {};
41854     this.lookups = {};
41856     // Setup variation substitutions
41857     this.variationsIndex = font._variationProcessor ? this.findVariationsIndex(font._variationProcessor.normalizedCoords) : -1;
41859     // initialize to default script + language
41860     this.selectScript();
41862     // current context (set by applyFeatures)
41863     this.glyphs = [];
41864     this.positions = []; // only used by GPOS
41865     this.ligatureID = 1;
41866     this.currentFeature = null;
41867   }
41869   OTProcessor.prototype.findScript = function findScript(script) {
41870     if (this.table.scriptList == null) {
41871       return null;
41872     }
41874     if (!Array.isArray(script)) {
41875       script = [script];
41876     }
41878     for (var _iterator = script, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
41879       var _ref;
41881       if (_isArray) {
41882         if (_i >= _iterator.length) break;
41883         _ref = _iterator[_i++];
41884       } else {
41885         _i = _iterator.next();
41886         if (_i.done) break;
41887         _ref = _i.value;
41888       }
41890       var s = _ref;
41892       for (var _iterator2 = this.table.scriptList, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
41893         var _ref2;
41895         if (_isArray2) {
41896           if (_i2 >= _iterator2.length) break;
41897           _ref2 = _iterator2[_i2++];
41898         } else {
41899           _i2 = _iterator2.next();
41900           if (_i2.done) break;
41901           _ref2 = _i2.value;
41902         }
41904         var entry = _ref2;
41906         if (entry.tag === s) {
41907           return entry;
41908         }
41909       }
41910     }
41912     return null;
41913   };
41915   OTProcessor.prototype.selectScript = function selectScript(script, language, direction$$) {
41916     var changed = false;
41917     var entry = void 0;
41918     if (!this.script || script !== this.scriptTag) {
41919       entry = this.findScript(script);
41920       if (!entry) {
41921         entry = this.findScript(DEFAULT_SCRIPTS);
41922       }
41924       if (!entry) {
41925         return this.scriptTag;
41926       }
41928       this.scriptTag = entry.tag;
41929       this.script = entry.script;
41930       this.language = null;
41931       this.languageTag = null;
41932       changed = true;
41933     }
41935     if (!direction$$ || direction$$ !== this.direction) {
41936       this.direction = direction$$ || direction(script);
41937     }
41939     if (language && language.length < 4) {
41940       language += ' '.repeat(4 - language.length);
41941     }
41943     if (!language || language !== this.languageTag) {
41944       this.language = null;
41946       for (var _iterator3 = this.script.langSysRecords, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
41947         var _ref3;
41949         if (_isArray3) {
41950           if (_i3 >= _iterator3.length) break;
41951           _ref3 = _iterator3[_i3++];
41952         } else {
41953           _i3 = _iterator3.next();
41954           if (_i3.done) break;
41955           _ref3 = _i3.value;
41956         }
41958         var lang = _ref3;
41960         if (lang.tag === language) {
41961           this.language = lang.langSys;
41962           this.languageTag = lang.tag;
41963           break;
41964         }
41965       }
41967       if (!this.language) {
41968         this.language = this.script.defaultLangSys;
41969         this.languageTag = null;
41970       }
41972       changed = true;
41973     }
41975     // Build a feature lookup table
41976     if (changed) {
41977       this.features = {};
41978       if (this.language) {
41979         for (var _iterator4 = this.language.featureIndexes, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _getIterator(_iterator4);;) {
41980           var _ref4;
41982           if (_isArray4) {
41983             if (_i4 >= _iterator4.length) break;
41984             _ref4 = _iterator4[_i4++];
41985           } else {
41986             _i4 = _iterator4.next();
41987             if (_i4.done) break;
41988             _ref4 = _i4.value;
41989           }
41991           var featureIndex = _ref4;
41993           var record = this.table.featureList[featureIndex];
41994           var substituteFeature = this.substituteFeatureForVariations(featureIndex);
41995           this.features[record.tag] = substituteFeature || record.feature;
41996         }
41997       }
41998     }
42000     return this.scriptTag;
42001   };
42003   OTProcessor.prototype.lookupsForFeatures = function lookupsForFeatures() {
42004     var userFeatures = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
42005     var exclude = arguments[1];
42007     var lookups = [];
42008     for (var _iterator5 = userFeatures, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _getIterator(_iterator5);;) {
42009       var _ref5;
42011       if (_isArray5) {
42012         if (_i5 >= _iterator5.length) break;
42013         _ref5 = _iterator5[_i5++];
42014       } else {
42015         _i5 = _iterator5.next();
42016         if (_i5.done) break;
42017         _ref5 = _i5.value;
42018       }
42020       var tag = _ref5;
42022       var feature = this.features[tag];
42023       if (!feature) {
42024         continue;
42025       }
42027       for (var _iterator6 = feature.lookupListIndexes, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _getIterator(_iterator6);;) {
42028         var _ref6;
42030         if (_isArray6) {
42031           if (_i6 >= _iterator6.length) break;
42032           _ref6 = _iterator6[_i6++];
42033         } else {
42034           _i6 = _iterator6.next();
42035           if (_i6.done) break;
42036           _ref6 = _i6.value;
42037         }
42039         var lookupIndex = _ref6;
42041         if (exclude && exclude.indexOf(lookupIndex) !== -1) {
42042           continue;
42043         }
42045         lookups.push({
42046           feature: tag,
42047           index: lookupIndex,
42048           lookup: this.table.lookupList.get(lookupIndex)
42049         });
42050       }
42051     }
42053     lookups.sort(function (a, b) {
42054       return a.index - b.index;
42055     });
42056     return lookups;
42057   };
42059   OTProcessor.prototype.substituteFeatureForVariations = function substituteFeatureForVariations(featureIndex) {
42060     if (this.variationsIndex === -1) {
42061       return null;
42062     }
42064     var record = this.table.featureVariations.featureVariationRecords[this.variationsIndex];
42065     var substitutions = record.featureTableSubstitution.substitutions;
42066     for (var _iterator7 = substitutions, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _getIterator(_iterator7);;) {
42067       var _ref7;
42069       if (_isArray7) {
42070         if (_i7 >= _iterator7.length) break;
42071         _ref7 = _iterator7[_i7++];
42072       } else {
42073         _i7 = _iterator7.next();
42074         if (_i7.done) break;
42075         _ref7 = _i7.value;
42076       }
42078       var substitution = _ref7;
42080       if (substitution.featureIndex === featureIndex) {
42081         return substitution.alternateFeatureTable;
42082       }
42083     }
42085     return null;
42086   };
42088   OTProcessor.prototype.findVariationsIndex = function findVariationsIndex(coords) {
42089     var variations = this.table.featureVariations;
42090     if (!variations) {
42091       return -1;
42092     }
42094     var records = variations.featureVariationRecords;
42095     for (var i = 0; i < records.length; i++) {
42096       var conditions = records[i].conditionSet.conditionTable;
42097       if (this.variationConditionsMatch(conditions, coords)) {
42098         return i;
42099       }
42100     }
42102     return -1;
42103   };
42105   OTProcessor.prototype.variationConditionsMatch = function variationConditionsMatch(conditions, coords) {
42106     return conditions.every(function (condition) {
42107       var coord = condition.axisIndex < coords.length ? coords[condition.axisIndex] : 0;
42108       return condition.filterRangeMinValue <= coord && coord <= condition.filterRangeMaxValue;
42109     });
42110   };
42112   OTProcessor.prototype.applyFeatures = function applyFeatures(userFeatures, glyphs, advances) {
42113     var lookups = this.lookupsForFeatures(userFeatures);
42114     this.applyLookups(lookups, glyphs, advances);
42115   };
42117   OTProcessor.prototype.applyLookups = function applyLookups(lookups, glyphs, positions) {
42118     this.glyphs = glyphs;
42119     this.positions = positions;
42120     this.glyphIterator = new GlyphIterator(glyphs);
42122     for (var _iterator8 = lookups, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _getIterator(_iterator8);;) {
42123       var _ref8;
42125       if (_isArray8) {
42126         if (_i8 >= _iterator8.length) break;
42127         _ref8 = _iterator8[_i8++];
42128       } else {
42129         _i8 = _iterator8.next();
42130         if (_i8.done) break;
42131         _ref8 = _i8.value;
42132       }
42134       var _ref9 = _ref8,
42135           feature = _ref9.feature,
42136           lookup = _ref9.lookup;
42138       this.currentFeature = feature;
42139       this.glyphIterator.reset(lookup.flags);
42141       while (this.glyphIterator.index < glyphs.length) {
42142         if (!(feature in this.glyphIterator.cur.features)) {
42143           this.glyphIterator.next();
42144           continue;
42145         }
42147         for (var _iterator9 = lookup.subTables, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _getIterator(_iterator9);;) {
42148           var _ref10;
42150           if (_isArray9) {
42151             if (_i9 >= _iterator9.length) break;
42152             _ref10 = _iterator9[_i9++];
42153           } else {
42154             _i9 = _iterator9.next();
42155             if (_i9.done) break;
42156             _ref10 = _i9.value;
42157           }
42159           var table = _ref10;
42161           var res = this.applyLookup(lookup.lookupType, table);
42162           if (res) {
42163             break;
42164           }
42165         }
42167         this.glyphIterator.next();
42168       }
42169     }
42170   };
42172   OTProcessor.prototype.applyLookup = function applyLookup(lookup, table) {
42173     throw new Error("applyLookup must be implemented by subclasses");
42174   };
42176   OTProcessor.prototype.applyLookupList = function applyLookupList(lookupRecords) {
42177     var options = this.glyphIterator.options;
42178     var glyphIndex = this.glyphIterator.index;
42180     for (var _iterator10 = lookupRecords, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _getIterator(_iterator10);;) {
42181       var _ref11;
42183       if (_isArray10) {
42184         if (_i10 >= _iterator10.length) break;
42185         _ref11 = _iterator10[_i10++];
42186       } else {
42187         _i10 = _iterator10.next();
42188         if (_i10.done) break;
42189         _ref11 = _i10.value;
42190       }
42192       var lookupRecord = _ref11;
42194       // Reset flags and find glyph index for this lookup record
42195       this.glyphIterator.reset(options, glyphIndex);
42196       this.glyphIterator.increment(lookupRecord.sequenceIndex);
42198       // Get the lookup and setup flags for subtables
42199       var lookup = this.table.lookupList.get(lookupRecord.lookupListIndex);
42200       this.glyphIterator.reset(lookup.flags, this.glyphIterator.index);
42202       // Apply lookup subtables until one matches
42203       for (var _iterator11 = lookup.subTables, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _getIterator(_iterator11);;) {
42204         var _ref12;
42206         if (_isArray11) {
42207           if (_i11 >= _iterator11.length) break;
42208           _ref12 = _iterator11[_i11++];
42209         } else {
42210           _i11 = _iterator11.next();
42211           if (_i11.done) break;
42212           _ref12 = _i11.value;
42213         }
42215         var table = _ref12;
42217         if (this.applyLookup(lookup.lookupType, table)) {
42218           break;
42219         }
42220       }
42221     }
42223     this.glyphIterator.reset(options, glyphIndex);
42224     return true;
42225   };
42227   OTProcessor.prototype.coverageIndex = function coverageIndex(coverage, glyph) {
42228     if (glyph == null) {
42229       glyph = this.glyphIterator.cur.id;
42230     }
42232     switch (coverage.version) {
42233       case 1:
42234         return coverage.glyphs.indexOf(glyph);
42236       case 2:
42237         for (var _iterator12 = coverage.rangeRecords, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _getIterator(_iterator12);;) {
42238           var _ref13;
42240           if (_isArray12) {
42241             if (_i12 >= _iterator12.length) break;
42242             _ref13 = _iterator12[_i12++];
42243           } else {
42244             _i12 = _iterator12.next();
42245             if (_i12.done) break;
42246             _ref13 = _i12.value;
42247           }
42249           var range = _ref13;
42251           if (range.start <= glyph && glyph <= range.end) {
42252             return range.startCoverageIndex + glyph - range.start;
42253           }
42254         }
42256         break;
42257     }
42259     return -1;
42260   };
42262   OTProcessor.prototype.match = function match(sequenceIndex, sequence, fn, matched) {
42263     var pos = this.glyphIterator.index;
42264     var glyph = this.glyphIterator.increment(sequenceIndex);
42265     var idx = 0;
42267     while (idx < sequence.length && glyph && fn(sequence[idx], glyph)) {
42268       if (matched) {
42269         matched.push(this.glyphIterator.index);
42270       }
42272       idx++;
42273       glyph = this.glyphIterator.next();
42274     }
42276     this.glyphIterator.index = pos;
42277     if (idx < sequence.length) {
42278       return false;
42279     }
42281     return matched || true;
42282   };
42284   OTProcessor.prototype.sequenceMatches = function sequenceMatches(sequenceIndex, sequence) {
42285     return this.match(sequenceIndex, sequence, function (component, glyph) {
42286       return component === glyph.id;
42287     });
42288   };
42290   OTProcessor.prototype.sequenceMatchIndices = function sequenceMatchIndices(sequenceIndex, sequence) {
42291     var _this = this;
42293     return this.match(sequenceIndex, sequence, function (component, glyph) {
42294       // If the current feature doesn't apply to this glyph,
42295       if (!(_this.currentFeature in glyph.features)) {
42296         return false;
42297       }
42299       return component === glyph.id;
42300     }, []);
42301   };
42303   OTProcessor.prototype.coverageSequenceMatches = function coverageSequenceMatches(sequenceIndex, sequence) {
42304     var _this2 = this;
42306     return this.match(sequenceIndex, sequence, function (coverage, glyph) {
42307       return _this2.coverageIndex(coverage, glyph.id) >= 0;
42308     });
42309   };
42311   OTProcessor.prototype.getClassID = function getClassID(glyph, classDef) {
42312     switch (classDef.version) {
42313       case 1:
42314         // Class array
42315         var i = glyph - classDef.startGlyph;
42316         if (i >= 0 && i < classDef.classValueArray.length) {
42317           return classDef.classValueArray[i];
42318         }
42320         break;
42322       case 2:
42323         for (var _iterator13 = classDef.classRangeRecord, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _getIterator(_iterator13);;) {
42324           var _ref14;
42326           if (_isArray13) {
42327             if (_i13 >= _iterator13.length) break;
42328             _ref14 = _iterator13[_i13++];
42329           } else {
42330             _i13 = _iterator13.next();
42331             if (_i13.done) break;
42332             _ref14 = _i13.value;
42333           }
42335           var range = _ref14;
42337           if (range.start <= glyph && glyph <= range.end) {
42338             return range.class;
42339           }
42340         }
42342         break;
42343     }
42345     return 0;
42346   };
42348   OTProcessor.prototype.classSequenceMatches = function classSequenceMatches(sequenceIndex, sequence, classDef) {
42349     var _this3 = this;
42351     return this.match(sequenceIndex, sequence, function (classID, glyph) {
42352       return classID === _this3.getClassID(glyph.id, classDef);
42353     });
42354   };
42356   OTProcessor.prototype.applyContext = function applyContext(table) {
42357     switch (table.version) {
42358       case 1:
42359         var index = this.coverageIndex(table.coverage);
42360         if (index === -1) {
42361           return false;
42362         }
42364         var set = table.ruleSets[index];
42365         for (var _iterator14 = set, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _getIterator(_iterator14);;) {
42366           var _ref15;
42368           if (_isArray14) {
42369             if (_i14 >= _iterator14.length) break;
42370             _ref15 = _iterator14[_i14++];
42371           } else {
42372             _i14 = _iterator14.next();
42373             if (_i14.done) break;
42374             _ref15 = _i14.value;
42375           }
42377           var rule = _ref15;
42379           if (this.sequenceMatches(1, rule.input)) {
42380             return this.applyLookupList(rule.lookupRecords);
42381           }
42382         }
42384         break;
42386       case 2:
42387         if (this.coverageIndex(table.coverage) === -1) {
42388           return false;
42389         }
42391         index = this.getClassID(this.glyphIterator.cur.id, table.classDef);
42392         if (index === -1) {
42393           return false;
42394         }
42396         set = table.classSet[index];
42397         for (var _iterator15 = set, _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _getIterator(_iterator15);;) {
42398           var _ref16;
42400           if (_isArray15) {
42401             if (_i15 >= _iterator15.length) break;
42402             _ref16 = _iterator15[_i15++];
42403           } else {
42404             _i15 = _iterator15.next();
42405             if (_i15.done) break;
42406             _ref16 = _i15.value;
42407           }
42409           var _rule = _ref16;
42411           if (this.classSequenceMatches(1, _rule.classes, table.classDef)) {
42412             return this.applyLookupList(_rule.lookupRecords);
42413           }
42414         }
42416         break;
42418       case 3:
42419         if (this.coverageSequenceMatches(0, table.coverages)) {
42420           return this.applyLookupList(table.lookupRecords);
42421         }
42423         break;
42424     }
42426     return false;
42427   };
42429   OTProcessor.prototype.applyChainingContext = function applyChainingContext(table) {
42430     switch (table.version) {
42431       case 1:
42432         var index = this.coverageIndex(table.coverage);
42433         if (index === -1) {
42434           return false;
42435         }
42437         var set = table.chainRuleSets[index];
42438         for (var _iterator16 = set, _isArray16 = Array.isArray(_iterator16), _i16 = 0, _iterator16 = _isArray16 ? _iterator16 : _getIterator(_iterator16);;) {
42439           var _ref17;
42441           if (_isArray16) {
42442             if (_i16 >= _iterator16.length) break;
42443             _ref17 = _iterator16[_i16++];
42444           } else {
42445             _i16 = _iterator16.next();
42446             if (_i16.done) break;
42447             _ref17 = _i16.value;
42448           }
42450           var rule = _ref17;
42452           if (this.sequenceMatches(-rule.backtrack.length, rule.backtrack) && this.sequenceMatches(1, rule.input) && this.sequenceMatches(1 + rule.input.length, rule.lookahead)) {
42453             return this.applyLookupList(rule.lookupRecords);
42454           }
42455         }
42457         break;
42459       case 2:
42460         if (this.coverageIndex(table.coverage) === -1) {
42461           return false;
42462         }
42464         index = this.getClassID(this.glyphIterator.cur.id, table.inputClassDef);
42465         var rules = table.chainClassSet[index];
42466         if (!rules) {
42467           return false;
42468         }
42470         for (var _iterator17 = rules, _isArray17 = Array.isArray(_iterator17), _i17 = 0, _iterator17 = _isArray17 ? _iterator17 : _getIterator(_iterator17);;) {
42471           var _ref18;
42473           if (_isArray17) {
42474             if (_i17 >= _iterator17.length) break;
42475             _ref18 = _iterator17[_i17++];
42476           } else {
42477             _i17 = _iterator17.next();
42478             if (_i17.done) break;
42479             _ref18 = _i17.value;
42480           }
42482           var _rule2 = _ref18;
42484           if (this.classSequenceMatches(-_rule2.backtrack.length, _rule2.backtrack, table.backtrackClassDef) && this.classSequenceMatches(1, _rule2.input, table.inputClassDef) && this.classSequenceMatches(1 + _rule2.input.length, _rule2.lookahead, table.lookaheadClassDef)) {
42485             return this.applyLookupList(_rule2.lookupRecords);
42486           }
42487         }
42489         break;
42491       case 3:
42492         if (this.coverageSequenceMatches(-table.backtrackGlyphCount, table.backtrackCoverage) && this.coverageSequenceMatches(0, table.inputCoverage) && this.coverageSequenceMatches(table.inputGlyphCount, table.lookaheadCoverage)) {
42493           return this.applyLookupList(table.lookupRecords);
42494         }
42496         break;
42497     }
42499     return false;
42500   };
42502   return OTProcessor;
42503 }();
42505 var GlyphInfo = function () {
42506   function GlyphInfo(font, id) {
42507     var codePoints = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
42508     var features = arguments[3];
42510     _classCallCheck(this, GlyphInfo);
42512     this._font = font;
42513     this.codePoints = codePoints;
42514     this.id = id;
42516     this.features = {};
42517     if (Array.isArray(features)) {
42518       for (var i = 0; i < features.length; i++) {
42519         var feature = features[i];
42520         this.features[feature] = true;
42521       }
42522     } else if ((typeof features === 'undefined' ? 'undefined' : _typeof(features)) === 'object') {
42523       _Object$assign(this.features, features);
42524     }
42526     this.ligatureID = null;
42527     this.ligatureComponent = null;
42528     this.isLigated = false;
42529     this.cursiveAttachment = null;
42530     this.markAttachment = null;
42531     this.shaperInfo = null;
42532     this.substituted = false;
42533     this.isMultiplied = false;
42534   }
42536   GlyphInfo.prototype.copy = function copy() {
42537     return new GlyphInfo(this._font, this.id, this.codePoints, this.features);
42538   };
42540   _createClass(GlyphInfo, [{
42541     key: 'id',
42542     get: function get() {
42543       return this._id;
42544     },
42545     set: function set(id) {
42546       this._id = id;
42547       this.substituted = true;
42549       var GDEF = this._font.GDEF;
42550       if (GDEF && GDEF.glyphClassDef) {
42551         // TODO: clean this up
42552         var classID = OTProcessor.prototype.getClassID(id, GDEF.glyphClassDef);
42553         this.isBase = classID === 1;
42554         this.isLigature = classID === 2;
42555         this.isMark = classID === 3;
42556         this.markAttachmentType = GDEF.markAttachClassDef ? OTProcessor.prototype.getClassID(id, GDEF.markAttachClassDef) : 0;
42557       } else {
42558         this.isMark = this.codePoints.every(unicode.isMark);
42559         this.isBase = !this.isMark;
42560         this.isLigature = this.codePoints.length > 1;
42561         this.markAttachmentType = 0;
42562       }
42563     }
42564   }]);
42566   return GlyphInfo;
42567 }();
42569 var _class$5;
42570 var _temp$1;
42572  * This is a shaper for the Hangul script, used by the Korean language.
42573  * It does the following:
42574  *   - decompose if unsupported by the font:
42575  *     <LV>   -> <L,V>
42576  *     <LVT>  -> <L,V,T>
42577  *     <LV,T> -> <L,V,T>
42579  *   - compose if supported by the font:
42580  *     <L,V>   -> <LV>
42581  *     <L,V,T> -> <LVT>
42582  *     <LV,T>  -> <LVT>
42584  *   - reorder tone marks (S is any valid syllable):
42585  *     <S, M> -> <M, S>
42587  *   - apply ljmo, vjmo, and tjmo OpenType features to decomposed Jamo sequences.
42589  * This logic is based on the following documents:
42590  *   - http://www.microsoft.com/typography/OpenTypeDev/hangul/intro.htm
42591  *   - http://ktug.org/~nomos/harfbuzz-hangul/hangulshaper.pdf
42592  */
42593 var HangulShaper = (_temp$1 = _class$5 = function (_DefaultShaper) {
42594   _inherits(HangulShaper, _DefaultShaper);
42596   function HangulShaper() {
42597     _classCallCheck(this, HangulShaper);
42599     return _possibleConstructorReturn(this, _DefaultShaper.apply(this, arguments));
42600   }
42602   HangulShaper.planFeatures = function planFeatures(plan) {
42603     plan.add(['ljmo', 'vjmo', 'tjmo'], false);
42604   };
42606   HangulShaper.assignFeatures = function assignFeatures(plan, glyphs) {
42607     var state = 0;
42608     var i = 0;
42609     while (i < glyphs.length) {
42610       var action = void 0;
42611       var glyph = glyphs[i];
42612       var code = glyph.codePoints[0];
42613       var type = getType(code);
42615       var _STATE_TABLE$state$ty = STATE_TABLE$1[state][type];
42616       action = _STATE_TABLE$state$ty[0];
42617       state = _STATE_TABLE$state$ty[1];
42620       switch (action) {
42621         case DECOMPOSE:
42622           // Decompose the composed syllable if it is not supported by the font.
42623           if (!plan.font.hasGlyphForCodePoint(code)) {
42624             i = decompose(glyphs, i, plan.font);
42625           }
42626           break;
42628         case COMPOSE:
42629           // Found a decomposed syllable. Try to compose if supported by the font.
42630           i = compose(glyphs, i, plan.font);
42631           break;
42633         case TONE_MARK:
42634           // Got a valid syllable, followed by a tone mark. Move the tone mark to the beginning of the syllable.
42635           reorderToneMark(glyphs, i, plan.font);
42636           break;
42638         case INVALID:
42639           // Tone mark has no valid syllable to attach to, so insert a dotted circle
42640           i = insertDottedCircle(glyphs, i, plan.font);
42641           break;
42642       }
42644       i++;
42645     }
42646   };
42648   return HangulShaper;
42649 }(DefaultShaper), _class$5.zeroMarkWidths = 'NONE', _temp$1);
42650 var HANGUL_BASE = 0xac00;
42651 var HANGUL_END = 0xd7a4;
42652 var HANGUL_COUNT = HANGUL_END - HANGUL_BASE + 1;
42653 var L_BASE = 0x1100; // lead
42654 var V_BASE = 0x1161; // vowel
42655 var T_BASE = 0x11a7; // trail
42656 var L_COUNT = 19;
42657 var V_COUNT = 21;
42658 var T_COUNT = 28;
42659 var L_END = L_BASE + L_COUNT - 1;
42660 var V_END = V_BASE + V_COUNT - 1;
42661 var T_END = T_BASE + T_COUNT - 1;
42662 var DOTTED_CIRCLE = 0x25cc;
42664 var isL = function isL(code) {
42665   return 0x1100 <= code && code <= 0x115f || 0xa960 <= code && code <= 0xa97c;
42667 var isV = function isV(code) {
42668   return 0x1160 <= code && code <= 0x11a7 || 0xd7b0 <= code && code <= 0xd7c6;
42670 var isT = function isT(code) {
42671   return 0x11a8 <= code && code <= 0x11ff || 0xd7cb <= code && code <= 0xd7fb;
42673 var isTone = function isTone(code) {
42674   return 0x302e <= code && code <= 0x302f;
42676 var isLVT = function isLVT(code) {
42677   return HANGUL_BASE <= code && code <= HANGUL_END;
42679 var isLV = function isLV(code) {
42680   return code - HANGUL_BASE < HANGUL_COUNT && (code - HANGUL_BASE) % T_COUNT === 0;
42682 var isCombiningL = function isCombiningL(code) {
42683   return L_BASE <= code && code <= L_END;
42685 var isCombiningV = function isCombiningV(code) {
42686   return V_BASE <= code && code <= V_END;
42688 var isCombiningT = function isCombiningT(code) {
42689   return T_BASE + 1 && 1 <= code && code <= T_END;
42692 // Character categories
42693 var X = 0; // Other character
42694 var L = 1; // Leading consonant
42695 var V = 2; // Medial vowel
42696 var T = 3; // Trailing consonant
42697 var LV = 4; // Composed <LV> syllable
42698 var LVT = 5; // Composed <LVT> syllable
42699 var M = 6; // Tone mark
42701 // This function classifies a character using the above categories.
42702 function getType(code) {
42703   if (isL(code)) {
42704     return L;
42705   }
42706   if (isV(code)) {
42707     return V;
42708   }
42709   if (isT(code)) {
42710     return T;
42711   }
42712   if (isLV(code)) {
42713     return LV;
42714   }
42715   if (isLVT(code)) {
42716     return LVT;
42717   }
42718   if (isTone(code)) {
42719     return M;
42720   }
42721   return X;
42724 // State machine actions
42725 var NO_ACTION = 0;
42726 var DECOMPOSE = 1;
42727 var COMPOSE = 2;
42728 var TONE_MARK = 4;
42729 var INVALID = 5;
42731 // Build a state machine that accepts valid syllables, and applies actions along the way.
42732 // The logic this is implementing is documented at the top of the file.
42733 var STATE_TABLE$1 = [
42734 //       X                 L                 V                T                  LV                LVT               M
42735 // State 0: start state
42736 [[NO_ACTION, 0], [NO_ACTION, 1], [NO_ACTION, 0], [NO_ACTION, 0], [DECOMPOSE, 2], [DECOMPOSE, 3], [INVALID, 0]],
42738 // State 1: <L>
42739 [[NO_ACTION, 0], [NO_ACTION, 1], [COMPOSE, 2], [NO_ACTION, 0], [DECOMPOSE, 2], [DECOMPOSE, 3], [INVALID, 0]],
42741 // State 2: <L,V> or <LV>
42742 [[NO_ACTION, 0], [NO_ACTION, 1], [NO_ACTION, 0], [COMPOSE, 3], [DECOMPOSE, 2], [DECOMPOSE, 3], [TONE_MARK, 0]],
42744 // State 3: <L,V,T> or <LVT>
42745 [[NO_ACTION, 0], [NO_ACTION, 1], [NO_ACTION, 0], [NO_ACTION, 0], [DECOMPOSE, 2], [DECOMPOSE, 3], [TONE_MARK, 0]]];
42747 function getGlyph(font, code, features) {
42748   return new GlyphInfo(font, font.glyphForCodePoint(code).id, [code], features);
42751 function decompose(glyphs, i, font) {
42752   var glyph = glyphs[i];
42753   var code = glyph.codePoints[0];
42755   var s = code - HANGUL_BASE;
42756   var t = T_BASE + s % T_COUNT;
42757   s = s / T_COUNT | 0;
42758   var l = L_BASE + s / V_COUNT | 0;
42759   var v = V_BASE + s % V_COUNT;
42761   // Don't decompose if all of the components are not available
42762   if (!font.hasGlyphForCodePoint(l) || !font.hasGlyphForCodePoint(v) || t !== T_BASE && !font.hasGlyphForCodePoint(t)) {
42763     return i;
42764   }
42766   // Replace the current glyph with decomposed L, V, and T glyphs,
42767   // and apply the proper OpenType features to each component.
42768   var ljmo = getGlyph(font, l, glyph.features);
42769   ljmo.features.ljmo = true;
42771   var vjmo = getGlyph(font, v, glyph.features);
42772   vjmo.features.vjmo = true;
42774   var insert = [ljmo, vjmo];
42776   if (t > T_BASE) {
42777     var tjmo = getGlyph(font, t, glyph.features);
42778     tjmo.features.tjmo = true;
42779     insert.push(tjmo);
42780   }
42782   glyphs.splice.apply(glyphs, [i, 1].concat(insert));
42783   return i + insert.length - 1;
42786 function compose(glyphs, i, font) {
42787   var glyph = glyphs[i];
42788   var code = glyphs[i].codePoints[0];
42789   var type = getType(code);
42791   var prev = glyphs[i - 1].codePoints[0];
42792   var prevType = getType(prev);
42794   // Figure out what type of syllable we're dealing with
42795   var lv = void 0,
42796       ljmo = void 0,
42797       vjmo = void 0,
42798       tjmo = void 0;
42799   if (prevType === LV && type === T) {
42800     // <LV,T>
42801     lv = prev;
42802     tjmo = glyph;
42803   } else {
42804     if (type === V) {
42805       // <L,V>
42806       ljmo = glyphs[i - 1];
42807       vjmo = glyph;
42808     } else {
42809       // <L,V,T>
42810       ljmo = glyphs[i - 2];
42811       vjmo = glyphs[i - 1];
42812       tjmo = glyph;
42813     }
42815     var l = ljmo.codePoints[0];
42816     var v = vjmo.codePoints[0];
42818     // Make sure L and V are combining characters
42819     if (isCombiningL(l) && isCombiningV(v)) {
42820       lv = HANGUL_BASE + ((l - L_BASE) * V_COUNT + (v - V_BASE)) * T_COUNT;
42821     }
42822   }
42824   var t = tjmo && tjmo.codePoints[0] || T_BASE;
42825   if (lv != null && (t === T_BASE || isCombiningT(t))) {
42826     var s = lv + (t - T_BASE);
42828     // Replace with a composed glyph if supported by the font,
42829     // otherwise apply the proper OpenType features to each component.
42830     if (font.hasGlyphForCodePoint(s)) {
42831       var del = prevType === V ? 3 : 2;
42832       glyphs.splice(i - del + 1, del, getGlyph(font, s, glyph.features));
42833       return i - del + 1;
42834     }
42835   }
42837   // Didn't compose (either a non-combining component or unsupported by font).
42838   if (ljmo) {
42839     ljmo.features.ljmo = true;
42840   }
42841   if (vjmo) {
42842     vjmo.features.vjmo = true;
42843   }
42844   if (tjmo) {
42845     tjmo.features.tjmo = true;
42846   }
42848   if (prevType === LV) {
42849     // Sequence was originally <L,V>, which got combined earlier.
42850     // Either the T was non-combining, or the LVT glyph wasn't supported.
42851     // Decompose the glyph again and apply OT features.
42852     decompose(glyphs, i - 1, font);
42853     return i + 1;
42854   }
42856   return i;
42859 function getLength(code) {
42860   switch (getType(code)) {
42861     case LV:
42862     case LVT:
42863       return 1;
42864     case V:
42865       return 2;
42866     case T:
42867       return 3;
42868   }
42871 function reorderToneMark(glyphs, i, font) {
42872   var glyph = glyphs[i];
42873   var code = glyphs[i].codePoints[0];
42875   // Move tone mark to the beginning of the previous syllable, unless it is zero width
42876   if (font.glyphForCodePoint(code).advanceWidth === 0) {
42877     return;
42878   }
42880   var prev = glyphs[i - 1].codePoints[0];
42881   var len = getLength(prev);
42883   glyphs.splice(i, 1);
42884   return glyphs.splice(i - len, 0, glyph);
42887 function insertDottedCircle(glyphs, i, font) {
42888   var glyph = glyphs[i];
42889   var code = glyphs[i].codePoints[0];
42891   if (font.hasGlyphForCodePoint(DOTTED_CIRCLE)) {
42892     var dottedCircle = getGlyph(font, DOTTED_CIRCLE, glyph.features);
42894     // If the tone mark is zero width, insert the dotted circle before, otherwise after
42895     var idx = font.glyphForCodePoint(code).advanceWidth === 0 ? i : i + 1;
42896     glyphs.splice(idx, 0, dottedCircle);
42897     i++;
42898   }
42900   return i;
42903 var stateTable = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 11, 12, 13, 14, 15, 16, 17], [0, 0, 0, 18, 19, 20, 21, 22, 23, 0, 24, 0, 0, 25, 26, 0, 0, 27, 0], [0, 0, 0, 28, 29, 30, 31, 32, 33, 0, 34, 0, 0, 35, 36, 0, 0, 37, 0], [0, 0, 0, 38, 5, 7, 7, 8, 9, 0, 10, 0, 0, 0, 13, 0, 0, 16, 0], [0, 39, 0, 0, 0, 40, 41, 0, 9, 0, 10, 0, 0, 0, 42, 0, 39, 0, 0], [0, 0, 0, 0, 43, 44, 44, 8, 9, 0, 0, 0, 0, 12, 43, 0, 0, 0, 0], [0, 0, 0, 0, 43, 44, 44, 8, 9, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0], [0, 0, 0, 45, 46, 47, 48, 49, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 50, 0, 0, 51, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 53, 54, 55, 56, 57, 58, 0, 59, 0, 0, 60, 61, 0, 0, 62, 0], [0, 0, 0, 4, 5, 7, 7, 8, 9, 0, 10, 0, 0, 0, 13, 0, 0, 16, 0], [0, 63, 64, 0, 0, 40, 41, 0, 9, 0, 10, 0, 0, 0, 42, 0, 63, 0, 0], [0, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 11, 12, 13, 0, 2, 16, 0], [0, 0, 0, 18, 65, 20, 21, 22, 23, 0, 24, 0, 0, 25, 26, 0, 0, 27, 0], [0, 0, 0, 0, 66, 67, 67, 8, 9, 0, 10, 0, 0, 0, 68, 0, 0, 0, 0], [0, 0, 0, 69, 0, 70, 70, 0, 71, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 73, 19, 74, 74, 22, 23, 0, 24, 0, 0, 0, 26, 0, 0, 27, 0], [0, 75, 0, 0, 0, 76, 77, 0, 23, 0, 24, 0, 0, 0, 78, 0, 75, 0, 0], [0, 0, 0, 0, 79, 80, 80, 22, 23, 0, 0, 0, 0, 25, 79, 0, 0, 0, 0], [0, 0, 0, 18, 19, 20, 74, 22, 23, 0, 24, 0, 0, 25, 26, 0, 0, 27, 0], [0, 0, 0, 81, 82, 83, 84, 85, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 86, 0, 0, 87, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 18, 19, 74, 74, 22, 23, 0, 24, 0, 0, 0, 26, 0, 0, 27, 0], [0, 89, 90, 0, 0, 76, 77, 0, 23, 0, 24, 0, 0, 0, 78, 0, 89, 0, 0], [0, 0, 0, 0, 91, 92, 92, 22, 23, 0, 24, 0, 0, 0, 93, 0, 0, 0, 0], [0, 0, 0, 94, 29, 95, 31, 32, 33, 0, 34, 0, 0, 0, 36, 0, 0, 37, 0], [0, 96, 0, 0, 0, 97, 98, 0, 33, 0, 34, 0, 0, 0, 99, 0, 96, 0, 0], [0, 0, 0, 0, 100, 101, 101, 32, 33, 0, 0, 0, 0, 35, 100, 0, 0, 0, 0], [0, 0, 0, 0, 100, 101, 101, 32, 33, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0], [0, 0, 0, 102, 103, 104, 105, 106, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 107, 0, 0, 108, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 28, 29, 95, 31, 32, 33, 0, 34, 0, 0, 0, 36, 0, 0, 37, 0], [0, 110, 111, 0, 0, 97, 98, 0, 33, 0, 34, 0, 0, 0, 99, 0, 110, 0, 0], [0, 0, 0, 0, 112, 113, 113, 32, 33, 0, 34, 0, 0, 0, 114, 0, 0, 0, 0], [0, 0, 0, 0, 5, 7, 7, 8, 9, 0, 10, 0, 0, 0, 13, 0, 0, 16, 0], [0, 0, 0, 115, 116, 117, 118, 8, 9, 0, 10, 0, 0, 119, 120, 0, 0, 16, 0], [0, 0, 0, 0, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 39, 0, 122, 0, 123, 123, 8, 9, 0, 10, 0, 0, 0, 42, 0, 39, 0, 0], [0, 124, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0], [0, 39, 0, 0, 0, 121, 125, 0, 9, 0, 10, 0, 0, 0, 42, 0, 39, 0, 0], [0, 0, 0, 0, 0, 126, 126, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 46, 47, 48, 49, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 47, 47, 49, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 127, 127, 49, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 128, 127, 127, 49, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 129, 130, 131, 132, 133, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 135, 54, 56, 56, 57, 58, 0, 59, 0, 0, 0, 61, 0, 0, 62, 0], [0, 136, 0, 0, 0, 137, 138, 0, 58, 0, 59, 0, 0, 0, 139, 0, 136, 0, 0], [0, 0, 0, 0, 140, 141, 141, 57, 58, 0, 0, 0, 0, 60, 140, 0, 0, 0, 0], [0, 0, 0, 0, 140, 141, 141, 57, 58, 0, 0, 0, 0, 0, 140, 0, 0, 0, 0], [0, 0, 0, 142, 143, 144, 145, 146, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 147, 0, 0, 148, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 53, 54, 56, 56, 57, 58, 0, 59, 0, 0, 0, 61, 0, 0, 62, 0], [0, 150, 151, 0, 0, 137, 138, 0, 58, 0, 59, 0, 0, 0, 139, 0, 150, 0, 0], [0, 0, 0, 0, 152, 153, 153, 57, 58, 0, 59, 0, 0, 0, 154, 0, 0, 0, 0], [0, 0, 0, 155, 116, 156, 157, 8, 9, 0, 10, 0, 0, 158, 120, 0, 0, 16, 0], [0, 0, 0, 0, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0], [0, 75, 3, 4, 5, 159, 160, 8, 161, 0, 162, 0, 11, 12, 163, 0, 75, 16, 0], [0, 0, 0, 0, 0, 40, 164, 0, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 165, 44, 44, 8, 9, 0, 0, 0, 0, 0, 165, 0, 0, 0, 0], [0, 124, 64, 0, 0, 40, 164, 0, 9, 0, 10, 0, 0, 0, 42, 0, 124, 0, 0], [0, 0, 0, 0, 0, 70, 70, 0, 71, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 166, 0, 0, 167, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 19, 74, 74, 22, 23, 0, 24, 0, 0, 0, 26, 0, 0, 27, 0], [0, 0, 0, 0, 79, 80, 80, 22, 23, 0, 0, 0, 0, 0, 79, 0, 0, 0, 0], [0, 0, 0, 169, 170, 171, 172, 22, 23, 0, 24, 0, 0, 173, 174, 0, 0, 27, 0], [0, 0, 0, 0, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 75, 0, 176, 0, 177, 177, 22, 23, 0, 24, 0, 0, 0, 78, 0, 75, 0, 0], [0, 178, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, 0], [0, 75, 0, 0, 0, 175, 179, 0, 23, 0, 24, 0, 0, 0, 78, 0, 75, 0, 0], [0, 0, 0, 0, 0, 180, 180, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 82, 83, 84, 85, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 83, 83, 85, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 181, 181, 85, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 182, 181, 181, 85, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 183, 184, 185, 186, 187, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 189, 170, 190, 191, 22, 23, 0, 24, 0, 0, 192, 174, 0, 0, 27, 0], [0, 0, 0, 0, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 76, 193, 0, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 194, 80, 80, 22, 23, 0, 0, 0, 0, 0, 194, 0, 0, 0, 0], [0, 178, 90, 0, 0, 76, 193, 0, 23, 0, 24, 0, 0, 0, 78, 0, 178, 0, 0], [0, 0, 0, 0, 29, 95, 31, 32, 33, 0, 34, 0, 0, 0, 36, 0, 0, 37, 0], [0, 0, 0, 0, 100, 101, 101, 32, 33, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0], [0, 0, 0, 195, 196, 197, 198, 32, 33, 0, 34, 0, 0, 199, 200, 0, 0, 37, 0], [0, 0, 0, 0, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 96, 0, 202, 0, 203, 203, 32, 33, 0, 34, 0, 0, 0, 99, 0, 96, 0, 0], [0, 204, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0], [0, 96, 0, 0, 0, 201, 205, 0, 33, 0, 34, 0, 0, 0, 99, 0, 96, 0, 0], [0, 0, 0, 0, 0, 206, 206, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 103, 104, 105, 106, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 104, 104, 106, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 207, 207, 106, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 208, 207, 207, 106, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 209, 210, 211, 212, 213, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 214, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 215, 196, 216, 217, 32, 33, 0, 34, 0, 0, 218, 200, 0, 0, 37, 0], [0, 0, 0, 0, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 97, 219, 0, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 220, 101, 101, 32, 33, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0], [0, 204, 111, 0, 0, 97, 219, 0, 33, 0, 34, 0, 0, 0, 99, 0, 204, 0, 0], [0, 0, 0, 221, 116, 222, 222, 8, 9, 0, 10, 0, 0, 0, 120, 0, 0, 16, 0], [0, 223, 0, 0, 0, 40, 224, 0, 9, 0, 10, 0, 0, 0, 42, 0, 223, 0, 0], [0, 0, 0, 0, 225, 44, 44, 8, 9, 0, 0, 0, 0, 119, 225, 0, 0, 0, 0], [0, 0, 0, 115, 116, 117, 222, 8, 9, 0, 10, 0, 0, 119, 120, 0, 0, 16, 0], [0, 0, 0, 115, 116, 222, 222, 8, 9, 0, 10, 0, 0, 0, 120, 0, 0, 16, 0], [0, 226, 64, 0, 0, 40, 224, 0, 9, 0, 10, 0, 0, 0, 42, 0, 226, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 39, 0, 0, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 39, 0, 0], [0, 0, 0, 0, 0, 44, 44, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 227, 0, 228, 229, 0, 9, 0, 10, 0, 0, 230, 0, 0, 0, 0, 0], [0, 39, 0, 122, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 39, 0, 0], [0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 231, 231, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 130, 131, 132, 133, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 131, 131, 133, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 233, 233, 133, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 234, 233, 233, 133, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 235, 236, 237, 238, 239, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 54, 56, 56, 57, 58, 0, 59, 0, 0, 0, 61, 0, 0, 62, 0], [0, 0, 0, 240, 241, 242, 243, 57, 58, 0, 59, 0, 0, 244, 245, 0, 0, 62, 0], [0, 0, 0, 0, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 136, 0, 247, 0, 248, 248, 57, 58, 0, 59, 0, 0, 0, 139, 0, 136, 0, 0], [0, 249, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0], [0, 136, 0, 0, 0, 246, 250, 0, 58, 0, 59, 0, 0, 0, 139, 0, 136, 0, 0], [0, 0, 0, 0, 0, 251, 251, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 143, 144, 145, 146, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 144, 144, 146, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 252, 252, 146, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 253, 252, 252, 146, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 254, 255, 256, 257, 258, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 260, 241, 261, 262, 57, 58, 0, 59, 0, 0, 263, 245, 0, 0, 62, 0], [0, 0, 0, 0, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 137, 264, 0, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 265, 141, 141, 57, 58, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0], [0, 249, 151, 0, 0, 137, 264, 0, 58, 0, 59, 0, 0, 0, 139, 0, 249, 0, 0], [0, 0, 0, 221, 116, 222, 222, 8, 9, 0, 10, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 225, 44, 44, 8, 9, 0, 0, 0, 0, 158, 225, 0, 0, 0, 0], [0, 0, 0, 155, 116, 156, 222, 8, 9, 0, 10, 0, 0, 158, 120, 0, 0, 16, 0], [0, 0, 0, 155, 116, 222, 222, 8, 9, 0, 10, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 43, 266, 266, 8, 161, 0, 24, 0, 0, 12, 267, 0, 0, 0, 0], [0, 75, 0, 176, 43, 268, 268, 269, 161, 0, 24, 0, 0, 0, 267, 0, 75, 0, 0], [0, 0, 0, 0, 0, 270, 0, 0, 271, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0], [0, 273, 274, 0, 0, 40, 41, 0, 9, 0, 10, 0, 0, 0, 42, 0, 273, 0, 0], [0, 0, 0, 40, 0, 123, 123, 8, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 121, 275, 0, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 277, 170, 278, 278, 22, 23, 0, 24, 0, 0, 0, 174, 0, 0, 27, 0], [0, 279, 0, 0, 0, 76, 280, 0, 23, 0, 24, 0, 0, 0, 78, 0, 279, 0, 0], [0, 0, 0, 0, 281, 80, 80, 22, 23, 0, 0, 0, 0, 173, 281, 0, 0, 0, 0], [0, 0, 0, 169, 170, 171, 278, 22, 23, 0, 24, 0, 0, 173, 174, 0, 0, 27, 0], [0, 0, 0, 169, 170, 278, 278, 22, 23, 0, 24, 0, 0, 0, 174, 0, 0, 27, 0], [0, 282, 90, 0, 0, 76, 280, 0, 23, 0, 24, 0, 0, 0, 78, 0, 282, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 75, 0, 0, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 75, 0, 0], [0, 0, 0, 0, 0, 80, 80, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 283, 0, 284, 285, 0, 23, 0, 24, 0, 0, 286, 0, 0, 0, 0, 0], [0, 75, 0, 176, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 75, 0, 0], [0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 287, 287, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 184, 185, 186, 187, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 185, 185, 187, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 289, 289, 187, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 290, 289, 289, 187, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 291, 292, 293, 294, 295, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 277, 170, 278, 278, 22, 23, 0, 24, 0, 0, 0, 174, 0, 0, 27, 0], [0, 0, 0, 0, 281, 80, 80, 22, 23, 0, 0, 0, 0, 192, 281, 0, 0, 0, 0], [0, 0, 0, 189, 170, 190, 278, 22, 23, 0, 24, 0, 0, 192, 174, 0, 0, 27, 0], [0, 0, 0, 189, 170, 278, 278, 22, 23, 0, 24, 0, 0, 0, 174, 0, 0, 27, 0], [0, 0, 0, 76, 0, 177, 177, 22, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 175, 296, 0, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 297, 196, 298, 298, 32, 33, 0, 34, 0, 0, 0, 200, 0, 0, 37, 0], [0, 299, 0, 0, 0, 97, 300, 0, 33, 0, 34, 0, 0, 0, 99, 0, 299, 0, 0], [0, 0, 0, 0, 301, 101, 101, 32, 33, 0, 0, 0, 0, 199, 301, 0, 0, 0, 0], [0, 0, 0, 195, 196, 197, 298, 32, 33, 0, 34, 0, 0, 199, 200, 0, 0, 37, 0], [0, 0, 0, 195, 196, 298, 298, 32, 33, 0, 34, 0, 0, 0, 200, 0, 0, 37, 0], [0, 302, 111, 0, 0, 97, 300, 0, 33, 0, 34, 0, 0, 0, 99, 0, 302, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 96, 0, 0, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 96, 0, 0], [0, 0, 0, 0, 0, 101, 101, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 303, 0, 304, 305, 0, 33, 0, 34, 0, 0, 306, 0, 0, 0, 0, 0], [0, 96, 0, 202, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 96, 0, 0], [0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 307, 307, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 210, 211, 212, 213, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 211, 211, 213, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 309, 309, 213, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 310, 309, 309, 213, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 311, 312, 313, 314, 315, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 297, 196, 298, 298, 32, 33, 0, 34, 0, 0, 0, 200, 0, 0, 37, 0], [0, 0, 0, 0, 301, 101, 101, 32, 33, 0, 0, 0, 0, 218, 301, 0, 0, 0, 0], [0, 0, 0, 215, 196, 216, 298, 32, 33, 0, 34, 0, 0, 218, 200, 0, 0, 37, 0], [0, 0, 0, 215, 196, 298, 298, 32, 33, 0, 34, 0, 0, 0, 200, 0, 0, 37, 0], [0, 0, 0, 97, 0, 203, 203, 32, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 201, 316, 0, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 116, 222, 222, 8, 9, 0, 10, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 225, 44, 44, 8, 9, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0], [0, 0, 0, 317, 318, 319, 320, 8, 9, 0, 10, 0, 0, 321, 322, 0, 0, 16, 0], [0, 223, 0, 323, 0, 123, 123, 8, 9, 0, 10, 0, 0, 0, 42, 0, 223, 0, 0], [0, 223, 0, 0, 0, 121, 324, 0, 9, 0, 10, 0, 0, 0, 42, 0, 223, 0, 0], [0, 0, 0, 325, 318, 326, 327, 8, 9, 0, 10, 0, 0, 328, 322, 0, 0, 16, 0], [0, 0, 0, 64, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0], [0, 0, 0, 227, 0, 228, 121, 0, 9, 0, 10, 0, 0, 230, 0, 0, 0, 0, 0], [0, 0, 0, 227, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0], [0, 0, 0, 0, 0, 329, 329, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 236, 237, 238, 239, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 237, 237, 239, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 331, 331, 239, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 332, 331, 331, 239, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 333, 40, 121, 334, 0, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 335, 241, 336, 336, 57, 58, 0, 59, 0, 0, 0, 245, 0, 0, 62, 0], [0, 337, 0, 0, 0, 137, 338, 0, 58, 0, 59, 0, 0, 0, 139, 0, 337, 0, 0], [0, 0, 0, 0, 339, 141, 141, 57, 58, 0, 0, 0, 0, 244, 339, 0, 0, 0, 0], [0, 0, 0, 240, 241, 242, 336, 57, 58, 0, 59, 0, 0, 244, 245, 0, 0, 62, 0], [0, 0, 0, 240, 241, 336, 336, 57, 58, 0, 59, 0, 0, 0, 245, 0, 0, 62, 0], [0, 340, 151, 0, 0, 137, 338, 0, 58, 0, 59, 0, 0, 0, 139, 0, 340, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 136, 0, 0, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 136, 0, 0], [0, 0, 0, 0, 0, 141, 141, 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 341, 0, 342, 343, 0, 58, 0, 59, 0, 0, 344, 0, 0, 0, 0, 0], [0, 136, 0, 247, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 136, 0, 0], [0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 345, 345, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 255, 256, 257, 258, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 256, 256, 258, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 347, 347, 258, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 348, 347, 347, 258, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 349, 350, 351, 352, 353, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 335, 241, 336, 336, 57, 58, 0, 59, 0, 0, 0, 245, 0, 0, 62, 0], [0, 0, 0, 0, 339, 141, 141, 57, 58, 0, 0, 0, 0, 263, 339, 0, 0, 0, 0], [0, 0, 0, 260, 241, 261, 336, 57, 58, 0, 59, 0, 0, 263, 245, 0, 0, 62, 0], [0, 0, 0, 260, 241, 336, 336, 57, 58, 0, 59, 0, 0, 0, 245, 0, 0, 62, 0], [0, 0, 0, 137, 0, 248, 248, 57, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 246, 354, 0, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 126, 126, 8, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 355, 90, 0, 0, 121, 125, 0, 9, 0, 10, 0, 0, 0, 42, 0, 355, 0, 0], [0, 0, 0, 0, 0, 356, 356, 269, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 357, 358, 359, 360, 361, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 270, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 363, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 364, 116, 365, 366, 8, 161, 0, 162, 0, 0, 367, 120, 0, 0, 16, 0], [0, 0, 0, 0, 0, 368, 368, 0, 161, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 40, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 170, 278, 278, 22, 23, 0, 24, 0, 0, 0, 174, 0, 0, 27, 0], [0, 0, 0, 0, 281, 80, 80, 22, 23, 0, 0, 0, 0, 0, 281, 0, 0, 0, 0], [0, 0, 0, 369, 370, 371, 372, 22, 23, 0, 24, 0, 0, 373, 374, 0, 0, 27, 0], [0, 279, 0, 375, 0, 177, 177, 22, 23, 0, 24, 0, 0, 0, 78, 0, 279, 0, 0], [0, 279, 0, 0, 0, 175, 376, 0, 23, 0, 24, 0, 0, 0, 78, 0, 279, 0, 0], [0, 0, 0, 377, 370, 378, 379, 22, 23, 0, 24, 0, 0, 380, 374, 0, 0, 27, 0], [0, 0, 0, 90, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 286, 0, 0, 0, 0, 0], [0, 0, 0, 283, 0, 284, 175, 0, 23, 0, 24, 0, 0, 286, 0, 0, 0, 0, 0], [0, 0, 0, 283, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0], [0, 0, 0, 0, 0, 381, 381, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 292, 293, 294, 295, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 293, 293, 295, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 383, 383, 295, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 384, 383, 383, 295, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 385, 76, 175, 386, 0, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 76, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 196, 298, 298, 32, 33, 0, 34, 0, 0, 0, 200, 0, 0, 37, 0], [0, 0, 0, 0, 301, 101, 101, 32, 33, 0, 0, 0, 0, 0, 301, 0, 0, 0, 0], [0, 0, 0, 387, 388, 389, 390, 32, 33, 0, 34, 0, 0, 391, 392, 0, 0, 37, 0], [0, 299, 0, 393, 0, 203, 203, 32, 33, 0, 34, 0, 0, 0, 99, 0, 299, 0, 0], [0, 299, 0, 0, 0, 201, 394, 0, 33, 0, 34, 0, 0, 0, 99, 0, 299, 0, 0], [0, 0, 0, 395, 388, 396, 397, 32, 33, 0, 34, 0, 0, 398, 392, 0, 0, 37, 0], [0, 0, 0, 111, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0], [0, 0, 0, 303, 0, 304, 201, 0, 33, 0, 34, 0, 0, 306, 0, 0, 0, 0, 0], [0, 0, 0, 303, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 0, 0], [0, 0, 0, 0, 0, 399, 399, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 312, 313, 314, 315, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 313, 313, 315, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 401, 401, 315, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 402, 401, 401, 315, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 403, 97, 201, 404, 0, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 97, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 405, 318, 406, 406, 8, 9, 0, 10, 0, 0, 0, 322, 0, 0, 16, 0], [0, 407, 0, 0, 0, 40, 408, 0, 9, 0, 10, 0, 0, 0, 42, 0, 407, 0, 0], [0, 0, 0, 0, 409, 44, 44, 8, 9, 0, 0, 0, 0, 321, 409, 0, 0, 0, 0], [0, 0, 0, 317, 318, 319, 406, 8, 9, 0, 10, 0, 0, 321, 322, 0, 0, 16, 0], [0, 0, 0, 317, 318, 406, 406, 8, 9, 0, 10, 0, 0, 0, 322, 0, 0, 16, 0], [0, 410, 64, 0, 0, 40, 408, 0, 9, 0, 10, 0, 0, 0, 42, 0, 410, 0, 0], [0, 223, 0, 0, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 223, 0, 0], [0, 223, 0, 323, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 223, 0, 0], [0, 0, 0, 405, 318, 406, 406, 8, 9, 0, 10, 0, 0, 0, 322, 0, 0, 16, 0], [0, 0, 0, 0, 409, 44, 44, 8, 9, 0, 0, 0, 0, 328, 409, 0, 0, 0, 0], [0, 0, 0, 325, 318, 326, 406, 8, 9, 0, 10, 0, 0, 328, 322, 0, 0, 16, 0], [0, 0, 0, 325, 318, 406, 406, 8, 9, 0, 10, 0, 0, 0, 322, 0, 0, 16, 0], [0, 0, 0, 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, 0], [0, 0, 0, 0, 0, 411, 411, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 40, 121, 334, 0, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 413, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 241, 336, 336, 57, 58, 0, 59, 0, 0, 0, 245, 0, 0, 62, 0], [0, 0, 0, 0, 339, 141, 141, 57, 58, 0, 0, 0, 0, 0, 339, 0, 0, 0, 0], [0, 0, 0, 414, 415, 416, 417, 57, 58, 0, 59, 0, 0, 418, 419, 0, 0, 62, 0], [0, 337, 0, 420, 0, 248, 248, 57, 58, 0, 59, 0, 0, 0, 139, 0, 337, 0, 0], [0, 337, 0, 0, 0, 246, 421, 0, 58, 0, 59, 0, 0, 0, 139, 0, 337, 0, 0], [0, 0, 0, 422, 415, 423, 424, 57, 58, 0, 59, 0, 0, 425, 419, 0, 0, 62, 0], [0, 0, 0, 151, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0], [0, 0, 0, 341, 0, 342, 246, 0, 58, 0, 59, 0, 0, 344, 0, 0, 0, 0, 0], [0, 0, 0, 341, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0], [0, 0, 0, 0, 0, 426, 426, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 350, 351, 352, 353, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 351, 351, 353, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 428, 428, 353, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 429, 428, 428, 353, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 430, 137, 246, 431, 0, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 137, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 432, 116, 433, 434, 8, 161, 0, 162, 0, 0, 435, 120, 0, 0, 16, 0], [0, 0, 0, 0, 0, 180, 180, 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 358, 359, 360, 361, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 359, 359, 361, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 436, 436, 361, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 437, 436, 436, 361, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 438, 439, 440, 441, 442, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 443, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 443, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 444, 116, 445, 445, 8, 161, 0, 162, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 225, 44, 44, 8, 161, 0, 0, 0, 0, 367, 225, 0, 0, 0, 0], [0, 0, 0, 364, 116, 365, 445, 8, 161, 0, 162, 0, 0, 367, 120, 0, 0, 16, 0], [0, 0, 0, 364, 116, 445, 445, 8, 161, 0, 162, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 0, 0, 0, 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 446, 370, 447, 447, 22, 23, 0, 24, 0, 0, 0, 374, 0, 0, 27, 0], [0, 448, 0, 0, 0, 76, 449, 0, 23, 0, 24, 0, 0, 0, 78, 0, 448, 0, 0], [0, 0, 0, 0, 450, 80, 80, 22, 23, 0, 0, 0, 0, 373, 450, 0, 0, 0, 0], [0, 0, 0, 369, 370, 371, 447, 22, 23, 0, 24, 0, 0, 373, 374, 0, 0, 27, 0], [0, 0, 0, 369, 370, 447, 447, 22, 23, 0, 24, 0, 0, 0, 374, 0, 0, 27, 0], [0, 451, 90, 0, 0, 76, 449, 0, 23, 0, 24, 0, 0, 0, 78, 0, 451, 0, 0], [0, 279, 0, 0, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 279, 0, 0], [0, 279, 0, 375, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 279, 0, 0], [0, 0, 0, 446, 370, 447, 447, 22, 23, 0, 24, 0, 0, 0, 374, 0, 0, 27, 0], [0, 0, 0, 0, 450, 80, 80, 22, 23, 0, 0, 0, 0, 380, 450, 0, 0, 0, 0], [0, 0, 0, 377, 370, 378, 447, 22, 23, 0, 24, 0, 0, 380, 374, 0, 0, 27, 0], [0, 0, 0, 377, 370, 447, 447, 22, 23, 0, 24, 0, 0, 0, 374, 0, 0, 27, 0], [0, 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, 0], [0, 0, 0, 0, 0, 452, 452, 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 76, 175, 386, 0, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 454, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 455, 388, 456, 456, 32, 33, 0, 34, 0, 0, 0, 392, 0, 0, 37, 0], [0, 457, 0, 0, 0, 97, 458, 0, 33, 0, 34, 0, 0, 0, 99, 0, 457, 0, 0], [0, 0, 0, 0, 459, 101, 101, 32, 33, 0, 0, 0, 0, 391, 459, 0, 0, 0, 0], [0, 0, 0, 387, 388, 389, 456, 32, 33, 0, 34, 0, 0, 391, 392, 0, 0, 37, 0], [0, 0, 0, 387, 388, 456, 456, 32, 33, 0, 34, 0, 0, 0, 392, 0, 0, 37, 0], [0, 460, 111, 0, 0, 97, 458, 0, 33, 0, 34, 0, 0, 0, 99, 0, 460, 0, 0], [0, 299, 0, 0, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 299, 0, 0], [0, 299, 0, 393, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 299, 0, 0], [0, 0, 0, 455, 388, 456, 456, 32, 33, 0, 34, 0, 0, 0, 392, 0, 0, 37, 0], [0, 0, 0, 0, 459, 101, 101, 32, 33, 0, 0, 0, 0, 398, 459, 0, 0, 0, 0], [0, 0, 0, 395, 388, 396, 456, 32, 33, 0, 34, 0, 0, 398, 392, 0, 0, 37, 0], [0, 0, 0, 395, 388, 456, 456, 32, 33, 0, 34, 0, 0, 0, 392, 0, 0, 37, 0], [0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 0, 0], [0, 0, 0, 0, 0, 461, 461, 315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 97, 201, 404, 0, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 463, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 318, 406, 406, 8, 9, 0, 10, 0, 0, 0, 322, 0, 0, 16, 0], [0, 0, 0, 0, 409, 44, 44, 8, 9, 0, 0, 0, 0, 0, 409, 0, 0, 0, 0], [0, 0, 0, 464, 465, 466, 467, 8, 9, 0, 10, 0, 0, 468, 469, 0, 0, 16, 0], [0, 407, 0, 470, 0, 123, 123, 8, 9, 0, 10, 0, 0, 0, 42, 0, 407, 0, 0], [0, 407, 0, 0, 0, 121, 471, 0, 9, 0, 10, 0, 0, 0, 42, 0, 407, 0, 0], [0, 0, 0, 472, 465, 473, 474, 8, 9, 0, 10, 0, 0, 475, 469, 0, 0, 16, 0], [0, 0, 0, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0], [0, 0, 0, 0, 0, 0, 476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 477, 415, 478, 478, 57, 58, 0, 59, 0, 0, 0, 419, 0, 0, 62, 0], [0, 479, 0, 0, 0, 137, 480, 0, 58, 0, 59, 0, 0, 0, 139, 0, 479, 0, 0], [0, 0, 0, 0, 481, 141, 141, 57, 58, 0, 0, 0, 0, 418, 481, 0, 0, 0, 0], [0, 0, 0, 414, 415, 416, 478, 57, 58, 0, 59, 0, 0, 418, 419, 0, 0, 62, 0], [0, 0, 0, 414, 415, 478, 478, 57, 58, 0, 59, 0, 0, 0, 419, 0, 0, 62, 0], [0, 482, 151, 0, 0, 137, 480, 0, 58, 0, 59, 0, 0, 0, 139, 0, 482, 0, 0], [0, 337, 0, 0, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 337, 0, 0], [0, 337, 0, 420, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 337, 0, 0], [0, 0, 0, 477, 415, 478, 478, 57, 58, 0, 59, 0, 0, 0, 419, 0, 0, 62, 0], [0, 0, 0, 0, 481, 141, 141, 57, 58, 0, 0, 0, 0, 425, 481, 0, 0, 0, 0], [0, 0, 0, 422, 415, 423, 478, 57, 58, 0, 59, 0, 0, 425, 419, 0, 0, 62, 0], [0, 0, 0, 422, 415, 478, 478, 57, 58, 0, 59, 0, 0, 0, 419, 0, 0, 62, 0], [0, 0, 0, 0, 0, 0, 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0], [0, 0, 0, 0, 0, 483, 483, 353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 137, 246, 431, 0, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 485, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 444, 116, 445, 445, 8, 161, 0, 162, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 225, 44, 44, 8, 161, 0, 0, 0, 0, 435, 225, 0, 0, 0, 0], [0, 0, 0, 432, 116, 433, 445, 8, 161, 0, 162, 0, 0, 435, 120, 0, 0, 16, 0], [0, 0, 0, 432, 116, 445, 445, 8, 161, 0, 162, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 0, 486, 486, 361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 439, 440, 441, 442, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 440, 440, 442, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 488, 488, 442, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 489, 488, 488, 442, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 490, 491, 492, 493, 494, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 495, 0, 496, 497, 0, 161, 0, 162, 0, 0, 498, 0, 0, 0, 0, 0], [0, 0, 0, 0, 116, 445, 445, 8, 161, 0, 162, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 225, 44, 44, 8, 161, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0], [0, 0, 0, 0, 370, 447, 447, 22, 23, 0, 24, 0, 0, 0, 374, 0, 0, 27, 0], [0, 0, 0, 0, 450, 80, 80, 22, 23, 0, 0, 0, 0, 0, 450, 0, 0, 0, 0], [0, 0, 0, 499, 500, 501, 502, 22, 23, 0, 24, 0, 0, 503, 504, 0, 0, 27, 0], [0, 448, 0, 505, 0, 177, 177, 22, 23, 0, 24, 0, 0, 0, 78, 0, 448, 0, 0], [0, 448, 0, 0, 0, 175, 506, 0, 23, 0, 24, 0, 0, 0, 78, 0, 448, 0, 0], [0, 0, 0, 507, 500, 508, 509, 22, 23, 0, 24, 0, 0, 510, 504, 0, 0, 27, 0], [0, 0, 0, 0, 0, 0, 0, 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 292, 0, 0], [0, 0, 0, 0, 0, 0, 511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 388, 456, 456, 32, 33, 0, 34, 0, 0, 0, 392, 0, 0, 37, 0], [0, 0, 0, 0, 459, 101, 101, 32, 33, 0, 0, 0, 0, 0, 459, 0, 0, 0, 0], [0, 0, 0, 512, 513, 514, 515, 32, 33, 0, 34, 0, 0, 516, 517, 0, 0, 37, 0], [0, 457, 0, 518, 0, 203, 203, 32, 33, 0, 34, 0, 0, 0, 99, 0, 457, 0, 0], [0, 457, 0, 0, 0, 201, 519, 0, 33, 0, 34, 0, 0, 0, 99, 0, 457, 0, 0], [0, 0, 0, 520, 513, 521, 522, 32, 33, 0, 34, 0, 0, 523, 517, 0, 0, 37, 0], [0, 0, 0, 0, 0, 0, 0, 315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 0, 0], [0, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 525, 465, 526, 526, 8, 9, 0, 10, 0, 0, 0, 469, 0, 0, 16, 0], [0, 527, 0, 0, 0, 40, 528, 0, 9, 0, 10, 0, 0, 0, 42, 0, 527, 0, 0], [0, 0, 0, 0, 529, 44, 44, 8, 9, 0, 0, 0, 0, 468, 529, 0, 0, 0, 0], [0, 0, 0, 464, 465, 466, 526, 8, 9, 0, 10, 0, 0, 468, 469, 0, 0, 16, 0], [0, 0, 0, 464, 465, 526, 526, 8, 9, 0, 10, 0, 0, 0, 469, 0, 0, 16, 0], [0, 530, 64, 0, 0, 40, 528, 0, 9, 0, 10, 0, 0, 0, 42, 0, 530, 0, 0], [0, 407, 0, 0, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 407, 0, 0], [0, 407, 0, 470, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 407, 0, 0], [0, 0, 0, 525, 465, 526, 526, 8, 9, 0, 10, 0, 0, 0, 469, 0, 0, 16, 0], [0, 0, 0, 0, 529, 44, 44, 8, 9, 0, 0, 0, 0, 475, 529, 0, 0, 0, 0], [0, 0, 0, 472, 465, 473, 526, 8, 9, 0, 10, 0, 0, 475, 469, 0, 0, 16, 0], [0, 0, 0, 472, 465, 526, 526, 8, 9, 0, 10, 0, 0, 0, 469, 0, 0, 16, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0], [0, 0, 0, 0, 415, 478, 478, 57, 58, 0, 59, 0, 0, 0, 419, 0, 0, 62, 0], [0, 0, 0, 0, 481, 141, 141, 57, 58, 0, 0, 0, 0, 0, 481, 0, 0, 0, 0], [0, 0, 0, 531, 532, 533, 534, 57, 58, 0, 59, 0, 0, 535, 536, 0, 0, 62, 0], [0, 479, 0, 537, 0, 248, 248, 57, 58, 0, 59, 0, 0, 0, 139, 0, 479, 0, 0], [0, 479, 0, 0, 0, 246, 538, 0, 58, 0, 59, 0, 0, 0, 139, 0, 479, 0, 0], [0, 0, 0, 539, 532, 540, 541, 57, 58, 0, 59, 0, 0, 542, 536, 0, 0, 62, 0], [0, 0, 0, 0, 0, 0, 0, 353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350, 0, 0], [0, 0, 0, 0, 0, 0, 543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0], [0, 0, 0, 0, 0, 544, 544, 442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 491, 492, 493, 494, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 492, 492, 494, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 546, 546, 494, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 547, 546, 546, 494, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 548, 549, 368, 550, 0, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 274, 0, 368, 368, 0, 161, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 161, 0, 0, 0, 0, 498, 0, 0, 0, 0, 0], [0, 0, 0, 495, 0, 496, 368, 0, 161, 0, 162, 0, 0, 498, 0, 0, 0, 0, 0], [0, 0, 0, 495, 0, 368, 368, 0, 161, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 551, 500, 552, 552, 22, 23, 0, 24, 0, 0, 0, 504, 0, 0, 27, 0], [0, 553, 0, 0, 0, 76, 554, 0, 23, 0, 24, 0, 0, 0, 78, 0, 553, 0, 0], [0, 0, 0, 0, 555, 80, 80, 22, 23, 0, 0, 0, 0, 503, 555, 0, 0, 0, 0], [0, 0, 0, 499, 500, 501, 552, 22, 23, 0, 24, 0, 0, 503, 504, 0, 0, 27, 0], [0, 0, 0, 499, 500, 552, 552, 22, 23, 0, 24, 0, 0, 0, 504, 0, 0, 27, 0], [0, 556, 90, 0, 0, 76, 554, 0, 23, 0, 24, 0, 0, 0, 78, 0, 556, 0, 0], [0, 448, 0, 0, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 448, 0, 0], [0, 448, 0, 505, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 448, 0, 0], [0, 0, 0, 551, 500, 552, 552, 22, 23, 0, 24, 0, 0, 0, 504, 0, 0, 27, 0], [0, 0, 0, 0, 555, 80, 80, 22, 23, 0, 0, 0, 0, 510, 555, 0, 0, 0, 0], [0, 0, 0, 507, 500, 508, 552, 22, 23, 0, 24, 0, 0, 510, 504, 0, 0, 27, 0], [0, 0, 0, 507, 500, 552, 552, 22, 23, 0, 24, 0, 0, 0, 504, 0, 0, 27, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0], [0, 0, 0, 557, 513, 558, 558, 32, 33, 0, 34, 0, 0, 0, 517, 0, 0, 37, 0], [0, 559, 0, 0, 0, 97, 560, 0, 33, 0, 34, 0, 0, 0, 99, 0, 559, 0, 0], [0, 0, 0, 0, 561, 101, 101, 32, 33, 0, 0, 0, 0, 516, 561, 0, 0, 0, 0], [0, 0, 0, 512, 513, 514, 558, 32, 33, 0, 34, 0, 0, 516, 517, 0, 0, 37, 0], [0, 0, 0, 512, 513, 558, 558, 32, 33, 0, 34, 0, 0, 0, 517, 0, 0, 37, 0], [0, 562, 111, 0, 0, 97, 560, 0, 33, 0, 34, 0, 0, 0, 99, 0, 562, 0, 0], [0, 457, 0, 0, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 457, 0, 0], [0, 457, 0, 518, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 457, 0, 0], [0, 0, 0, 557, 513, 558, 558, 32, 33, 0, 34, 0, 0, 0, 517, 0, 0, 37, 0], [0, 0, 0, 0, 561, 101, 101, 32, 33, 0, 0, 0, 0, 523, 561, 0, 0, 0, 0], [0, 0, 0, 520, 513, 521, 558, 32, 33, 0, 34, 0, 0, 523, 517, 0, 0, 37, 0], [0, 0, 0, 520, 513, 558, 558, 32, 33, 0, 34, 0, 0, 0, 517, 0, 0, 37, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0], [0, 0, 0, 0, 465, 526, 526, 8, 9, 0, 10, 0, 0, 0, 469, 0, 0, 16, 0], [0, 0, 0, 0, 529, 44, 44, 8, 9, 0, 0, 0, 0, 0, 529, 0, 0, 0, 0], [0, 0, 0, 563, 66, 564, 565, 8, 9, 0, 10, 0, 0, 566, 68, 0, 0, 16, 0], [0, 527, 0, 567, 0, 123, 123, 8, 9, 0, 10, 0, 0, 0, 42, 0, 527, 0, 0], [0, 527, 0, 0, 0, 121, 568, 0, 9, 0, 10, 0, 0, 0, 42, 0, 527, 0, 0], [0, 0, 0, 569, 66, 570, 571, 8, 9, 0, 10, 0, 0, 572, 68, 0, 0, 16, 0], [0, 0, 0, 573, 532, 574, 574, 57, 58, 0, 59, 0, 0, 0, 536, 0, 0, 62, 0], [0, 575, 0, 0, 0, 137, 576, 0, 58, 0, 59, 0, 0, 0, 139, 0, 575, 0, 0], [0, 0, 0, 0, 577, 141, 141, 57, 58, 0, 0, 0, 0, 535, 577, 0, 0, 0, 0], [0, 0, 0, 531, 532, 533, 574, 57, 58, 0, 59, 0, 0, 535, 536, 0, 0, 62, 0], [0, 0, 0, 531, 532, 574, 574, 57, 58, 0, 59, 0, 0, 0, 536, 0, 0, 62, 0], [0, 578, 151, 0, 0, 137, 576, 0, 58, 0, 59, 0, 0, 0, 139, 0, 578, 0, 0], [0, 479, 0, 0, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 479, 0, 0], [0, 479, 0, 537, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 479, 0, 0], [0, 0, 0, 573, 532, 574, 574, 57, 58, 0, 59, 0, 0, 0, 536, 0, 0, 62, 0], [0, 0, 0, 0, 577, 141, 141, 57, 58, 0, 0, 0, 0, 542, 577, 0, 0, 0, 0], [0, 0, 0, 539, 532, 540, 574, 57, 58, 0, 59, 0, 0, 542, 536, 0, 0, 62, 0], [0, 0, 0, 539, 532, 574, 574, 57, 58, 0, 59, 0, 0, 0, 536, 0, 0, 62, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 0, 0], [0, 0, 0, 0, 0, 0, 0, 442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 439, 0, 0], [0, 0, 0, 0, 0, 579, 579, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 549, 368, 550, 0, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 368, 368, 0, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 581, 0, 0, 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 500, 552, 552, 22, 23, 0, 24, 0, 0, 0, 504, 0, 0, 27, 0], [0, 0, 0, 0, 555, 80, 80, 22, 23, 0, 0, 0, 0, 0, 555, 0, 0, 0, 0], [0, 0, 0, 582, 91, 583, 584, 22, 23, 0, 24, 0, 0, 585, 93, 0, 0, 27, 0], [0, 553, 0, 586, 0, 177, 177, 22, 23, 0, 24, 0, 0, 0, 78, 0, 553, 0, 0], [0, 553, 0, 0, 0, 175, 587, 0, 23, 0, 24, 0, 0, 0, 78, 0, 553, 0, 0], [0, 0, 0, 588, 91, 589, 590, 22, 23, 0, 24, 0, 0, 591, 93, 0, 0, 27, 0], [0, 0, 0, 0, 513, 558, 558, 32, 33, 0, 34, 0, 0, 0, 517, 0, 0, 37, 0], [0, 0, 0, 0, 561, 101, 101, 32, 33, 0, 0, 0, 0, 0, 561, 0, 0, 0, 0], [0, 0, 0, 592, 112, 593, 594, 32, 33, 0, 34, 0, 0, 595, 114, 0, 0, 37, 0], [0, 559, 0, 596, 0, 203, 203, 32, 33, 0, 34, 0, 0, 0, 99, 0, 559, 0, 0], [0, 559, 0, 0, 0, 201, 597, 0, 33, 0, 34, 0, 0, 0, 99, 0, 559, 0, 0], [0, 0, 0, 598, 112, 599, 600, 32, 33, 0, 34, 0, 0, 601, 114, 0, 0, 37, 0], [0, 0, 0, 602, 66, 67, 67, 8, 9, 0, 10, 0, 0, 0, 68, 0, 0, 16, 0], [0, 0, 0, 0, 165, 44, 44, 8, 9, 0, 0, 0, 0, 566, 165, 0, 0, 0, 0], [0, 0, 0, 563, 66, 564, 67, 8, 9, 0, 10, 0, 0, 566, 68, 0, 0, 16, 0], [0, 0, 0, 563, 66, 67, 67, 8, 9, 0, 10, 0, 0, 0, 68, 0, 0, 16, 0], [0, 527, 0, 0, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 527, 0, 0], [0, 527, 0, 567, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 527, 0, 0], [0, 0, 0, 602, 66, 67, 67, 8, 9, 0, 10, 0, 0, 0, 68, 0, 0, 16, 0], [0, 0, 0, 0, 165, 44, 44, 8, 9, 0, 0, 0, 0, 572, 165, 0, 0, 0, 0], [0, 0, 0, 569, 66, 570, 67, 8, 9, 0, 10, 0, 0, 572, 68, 0, 0, 16, 0], [0, 0, 0, 569, 66, 67, 67, 8, 9, 0, 10, 0, 0, 0, 68, 0, 0, 16, 0], [0, 0, 0, 0, 532, 574, 574, 57, 58, 0, 59, 0, 0, 0, 536, 0, 0, 62, 0], [0, 0, 0, 0, 577, 141, 141, 57, 58, 0, 0, 0, 0, 0, 577, 0, 0, 0, 0], [0, 0, 0, 603, 152, 604, 605, 57, 58, 0, 59, 0, 0, 606, 154, 0, 0, 62, 0], [0, 575, 0, 607, 0, 248, 248, 57, 58, 0, 59, 0, 0, 0, 139, 0, 575, 0, 0], [0, 575, 0, 0, 0, 246, 608, 0, 58, 0, 59, 0, 0, 0, 139, 0, 575, 0, 0], [0, 0, 0, 609, 152, 610, 611, 57, 58, 0, 59, 0, 0, 612, 154, 0, 0, 62, 0], [0, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, 0, 0], [0, 0, 0, 0, 0, 0, 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 614, 91, 92, 92, 22, 23, 0, 24, 0, 0, 0, 93, 0, 0, 27, 0], [0, 0, 0, 0, 194, 80, 80, 22, 23, 0, 0, 0, 0, 585, 194, 0, 0, 0, 0], [0, 0, 0, 582, 91, 583, 92, 22, 23, 0, 24, 0, 0, 585, 93, 0, 0, 27, 0], [0, 0, 0, 582, 91, 92, 92, 22, 23, 0, 24, 0, 0, 0, 93, 0, 0, 27, 0], [0, 553, 0, 0, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 553, 0, 0], [0, 553, 0, 586, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 553, 0, 0], [0, 0, 0, 614, 91, 92, 92, 22, 23, 0, 24, 0, 0, 0, 93, 0, 0, 27, 0], [0, 0, 0, 0, 194, 80, 80, 22, 23, 0, 0, 0, 0, 591, 194, 0, 0, 0, 0], [0, 0, 0, 588, 91, 589, 92, 22, 23, 0, 24, 0, 0, 591, 93, 0, 0, 27, 0], [0, 0, 0, 588, 91, 92, 92, 22, 23, 0, 24, 0, 0, 0, 93, 0, 0, 27, 0], [0, 0, 0, 615, 112, 113, 113, 32, 33, 0, 34, 0, 0, 0, 114, 0, 0, 37, 0], [0, 0, 0, 0, 220, 101, 101, 32, 33, 0, 0, 0, 0, 595, 220, 0, 0, 0, 0], [0, 0, 0, 592, 112, 593, 113, 32, 33, 0, 34, 0, 0, 595, 114, 0, 0, 37, 0], [0, 0, 0, 592, 112, 113, 113, 32, 33, 0, 34, 0, 0, 0, 114, 0, 0, 37, 0], [0, 559, 0, 0, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 559, 0, 0], [0, 559, 0, 596, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 559, 0, 0], [0, 0, 0, 615, 112, 113, 113, 32, 33, 0, 34, 0, 0, 0, 114, 0, 0, 37, 0], [0, 0, 0, 0, 220, 101, 101, 32, 33, 0, 0, 0, 0, 601, 220, 0, 0, 0, 0], [0, 0, 0, 598, 112, 599, 113, 32, 33, 0, 34, 0, 0, 601, 114, 0, 0, 37, 0], [0, 0, 0, 598, 112, 113, 113, 32, 33, 0, 34, 0, 0, 0, 114, 0, 0, 37, 0], [0, 0, 0, 0, 66, 67, 67, 8, 9, 0, 10, 0, 0, 0, 68, 0, 0, 16, 0], [0, 0, 0, 616, 152, 153, 153, 57, 58, 0, 59, 0, 0, 0, 154, 0, 0, 62, 0], [0, 0, 0, 0, 265, 141, 141, 57, 58, 0, 0, 0, 0, 606, 265, 0, 0, 0, 0], [0, 0, 0, 603, 152, 604, 153, 57, 58, 0, 59, 0, 0, 606, 154, 0, 0, 62, 0], [0, 0, 0, 603, 152, 153, 153, 57, 58, 0, 59, 0, 0, 0, 154, 0, 0, 62, 0], [0, 575, 0, 0, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 575, 0, 0], [0, 575, 0, 607, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 575, 0, 0], [0, 0, 0, 616, 152, 153, 153, 57, 58, 0, 59, 0, 0, 0, 154, 0, 0, 62, 0], [0, 0, 0, 0, 265, 141, 141, 57, 58, 0, 0, 0, 0, 612, 265, 0, 0, 0, 0], [0, 0, 0, 609, 152, 610, 153, 57, 58, 0, 59, 0, 0, 612, 154, 0, 0, 62, 0], [0, 0, 0, 609, 152, 153, 153, 57, 58, 0, 59, 0, 0, 0, 154, 0, 0, 62, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 549, 0, 0], [0, 0, 0, 0, 91, 92, 92, 22, 23, 0, 24, 0, 0, 0, 93, 0, 0, 27, 0], [0, 0, 0, 0, 112, 113, 113, 32, 33, 0, 34, 0, 0, 0, 114, 0, 0, 37, 0], [0, 0, 0, 0, 152, 153, 153, 57, 58, 0, 59, 0, 0, 0, 154, 0, 0, 62, 0]];
42904 var accepting = [false, true, true, true, true, true, false, false, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, false, true, false, true, true, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, true, true, true, true, false, true, true, false, true, true, true, false, true, true, true, false, true, false, true, true, false, false, true, true, true, true, true, true, true, false, true, true, false, true, true, true, false, true, false, true, true, false, false, true, true, true, true, true, true, true, false, true, true, true, false, true, true, true, false, true, false, true, true, false, false, false, true, true, false, false, true, true, true, true, true, true, false, true, false, true, true, false, false, true, true, true, true, true, true, true, false, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, false, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, true, true, false, true, true, true, false, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, true, false, true, true, true, true, true, false, true, true, false, false, false, false, true, true, false, false, true, true, true, false, true, true, true, false, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, false, true, true, false, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, true, false, true, true, false, false, false, false, true, true, false, false, true, true, true, true, false, true, true, true, true, true, true, false, true, true, false, false, false, false, true, false, true, false, true, true, true, true, true, false, true, true, false, false, false, false, true, true, false, false, true, true, true, false, true, true, false, false, true, false, true, true, false, true, true, false, true, true, false, true, true, true, true, true, true, false, true, true, false, false, false, false, true, false, true, true, false, true, true, true, true, true, true, false, true, true, false, false, false, false, true, false, true, false, true, true, true, true, false, false, false, true, true, false, true, true, true, true, true, true, false, true, true, false, false, false, false, true, false, true, false, true, true, false, false, true, true, false, false, true, true, true, false, true, false, true, true, true, true, false, false, false, true, false, true, true, true, true, false, false, false, true, true, false, true, true, true, true, true, true, false, true, true, false, true, false, true, true, true, true, false, false, false, false, false, false, false, true, true, false, false, true, true, false, true, true, true, true, false, true, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, true, true, true, false, true, true, false, true, false, true, true, true, true, true, true, false, true, true, true, true, true, true, false, true, true, false, false, false, false, false, true, true, false, true, false, true, true, true, true, true, false, true, true, true, true, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, true, true, false, true, true, true, true, false, true, true, true, true, true, false, true, true, false, true, true, true];
42905 var tags = [[], ["broken_cluster"], ["consonant_syllable"], ["vowel_syllable"], ["broken_cluster"], ["broken_cluster"], [], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["standalone_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["consonant_syllable"], ["broken_cluster"], ["symbol_cluster"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], [], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["broken_cluster"], ["broken_cluster"], ["consonant_syllable", "broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["symbol_cluster"], [], ["symbol_cluster"], ["symbol_cluster"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], [], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], [], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], [], [], [], ["broken_cluster"], ["broken_cluster"], [], [], ["broken_cluster"], ["broken_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], [], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["symbol_cluster"], ["symbol_cluster"], ["symbol_cluster"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], [], [], [], ["consonant_syllable"], ["consonant_syllable"], [], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], [], [], [], ["vowel_syllable"], ["vowel_syllable"], [], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], [], [], [], [], ["broken_cluster"], ["broken_cluster"], [], [], ["broken_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], [], [], [], ["standalone_cluster"], ["standalone_cluster"], [], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["broken_cluster"], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["broken_cluster"], ["symbol_cluster"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], [], [], [], [], ["consonant_syllable"], ["consonant_syllable"], [], [], ["consonant_syllable"], ["consonant_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], [], [], [], [], ["vowel_syllable"], ["vowel_syllable"], [], [], ["vowel_syllable"], ["vowel_syllable"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], [], [], [], [], ["broken_cluster"], [], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], [], [], [], [], ["standalone_cluster"], ["standalone_cluster"], [], [], ["standalone_cluster"], ["standalone_cluster"], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], [], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], [], [], [], [], ["consonant_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], [], [], [], [], ["vowel_syllable"], [], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], [], [], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], [], [], [], [], ["standalone_cluster"], [], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], [], [], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], [], [], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], [], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], [], [], [], [], [], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], [], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], [], [], [], [], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], [], [], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["broken_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], [], ["consonant_syllable"], ["vowel_syllable"], ["standalone_cluster"]];
42906 var indicMachine = {
42907         stateTable: stateTable,
42908         accepting: accepting,
42909         tags: tags
42912 var categories = ["O", "IND", "S", "GB", "B", "FM", "CGJ", "VMAbv", "VMPst", "VAbv", "VPst", "CMBlw", "VPre", "VBlw", "H", "VMBlw", "CMAbv", "MBlw", "CS", "R", "SUB", "MPst", "MPre", "FAbv", "FPst", "FBlw", "SMAbv", "SMBlw", "VMPre", "ZWNJ", "ZWJ", "WJ", "VS", "N", "HN", "MAbv"];
42913 var decompositions$1 = { "2507": [2503, 2494], "2508": [2503, 2519], "2888": [2887, 2902], "2891": [2887, 2878], "2892": [2887, 2903], "3018": [3014, 3006], "3019": [3015, 3006], "3020": [3014, 3031], "3144": [3142, 3158], "3264": [3263, 3285], "3271": [3270, 3285], "3272": [3270, 3286], "3274": [3270, 3266], "3275": [3270, 3266, 3285], "3402": [3398, 3390], "3403": [3399, 3390], "3404": [3398, 3415], "3546": [3545, 3530], "3548": [3545, 3535], "3549": [3545, 3535, 3530], "3550": [3545, 3551], "3635": [3661, 3634], "3763": [3789, 3762], "3955": [3953, 3954], "3957": [3953, 3956], "3958": [4018, 3968], "3959": [4018, 3953, 3968], "3960": [4019, 3968], "3961": [4019, 3953, 3968], "3969": [3953, 3968], "6971": [6970, 6965], "6973": [6972, 6965], "6976": [6974, 6965], "6977": [6975, 6965], "6979": [6978, 6965], "69934": [69937, 69927], "69935": [69938, 69927], "70475": [70471, 70462], "70476": [70471, 70487], "70843": [70841, 70842], "70844": [70841, 70832], "70846": [70841, 70845], "71098": [71096, 71087], "71099": [71097, 71087] };
42914 var stateTable$1 = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2, 2, 3, 4, 4, 5, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 17, 18, 11, 19, 20, 21, 22, 0, 0, 23, 0, 0, 2, 0, 24, 0, 25], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 0, 0, 0, 0, 27, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 41, 35, 42, 43, 44, 45, 0, 0, 46, 0, 0, 0, 39, 0, 0, 47], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 0, 0, 12, 0, 14, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 0, 9, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 16, 0, 0, 18, 11, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 25], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 0, 11, 12, 0, 14, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 0, 9, 0, 0, 12, 0, 14, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 0, 7, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 18, 11, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 25], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 0, 11, 12, 0, 14, 0, 0, 0, 0, 0, 11, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 4, 4, 5, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 18, 11, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 25], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 48, 11, 12, 13, 14, 48, 16, 0, 0, 18, 11, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 49, 0, 0, 25], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 0, 11, 12, 0, 14, 0, 16, 0, 0, 0, 11, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 25], [0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 0, 11, 12, 0, 14, 0, 16, 0, 0, 0, 11, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 0, 0, 36, 0, 38, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 0, 33, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 34, 35, 36, 37, 38, 0, 40, 0, 0, 41, 35, 42, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 47], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 0, 35, 36, 0, 38, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 0, 33, 0, 0, 36, 0, 38, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 0, 31, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 41, 35, 42, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 47], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 0, 35, 36, 0, 38, 0, 0, 0, 0, 0, 35, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 52, 35, 36, 37, 38, 52, 40, 0, 0, 41, 35, 42, 43, 44, 45, 0, 0, 46, 0, 0, 0, 53, 0, 0, 47], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 0, 35, 36, 0, 38, 0, 40, 0, 0, 0, 35, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 47], [0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 0, 35, 36, 0, 38, 0, 40, 0, 0, 0, 35, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 48, 11, 12, 13, 14, 0, 16, 0, 0, 18, 11, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 25], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 48, 11, 12, 13, 14, 48, 16, 0, 0, 18, 11, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 25], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 52, 35, 36, 37, 38, 0, 40, 0, 0, 41, 35, 42, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 47], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 52, 35, 36, 37, 38, 52, 40, 0, 0, 41, 35, 42, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 47], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, 0]];
42915 var accepting$1 = [false, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true];
42916 var tags$1 = [[], ["broken_cluster"], ["independent_cluster"], ["symbol_cluster"], ["standard_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["numeral_cluster"], ["broken_cluster"], ["independent_cluster"], ["symbol_cluster"], ["symbol_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["virama_terminated_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["broken_cluster"], ["broken_cluster"], ["numeral_cluster"], ["number_joiner_terminated_cluster"], ["standard_cluster"], ["standard_cluster"], ["numeral_cluster"]];
42917 var useData = {
42918         categories: categories,
42919         decompositions: decompositions$1,
42920         stateTable: stateTable$1,
42921         accepting: accepting$1,
42922         tags: tags$1
42925 // Cateories used in the OpenType spec:
42926 // https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx
42927 var CATEGORIES = {
42928   X: 1 << 0,
42929   C: 1 << 1,
42930   V: 1 << 2,
42931   N: 1 << 3,
42932   H: 1 << 4,
42933   ZWNJ: 1 << 5,
42934   ZWJ: 1 << 6,
42935   M: 1 << 7,
42936   SM: 1 << 8,
42937   VD: 1 << 9,
42938   A: 1 << 10,
42939   Placeholder: 1 << 11,
42940   Dotted_Circle: 1 << 12,
42941   RS: 1 << 13, // Register Shifter, used in Khmer OT spec.
42942   Coeng: 1 << 14, // Khmer-style Virama.
42943   Repha: 1 << 15, // Atomically-encoded logical or visual repha.
42944   Ra: 1 << 16,
42945   CM: 1 << 17, // Consonant-Medial.
42946   Symbol: 1 << 18 // Avagraha, etc that take marks (SM,A,VD).
42949 // Visual positions in a syllable from left to right.
42950 var POSITIONS = {
42951   Start: 1 << 0,
42953   Ra_To_Become_Reph: 1 << 1,
42954   Pre_M: 1 << 2,
42955   Pre_C: 1 << 3,
42957   Base_C: 1 << 4,
42958   After_Main: 1 << 5,
42960   Above_C: 1 << 6,
42962   Before_Sub: 1 << 7,
42963   Below_C: 1 << 8,
42964   After_Sub: 1 << 9,
42966   Before_Post: 1 << 10,
42967   Post_C: 1 << 11,
42968   After_Post: 1 << 12,
42970   Final_C: 1 << 13,
42971   SMVD: 1 << 14,
42973   End: 1 << 15
42976 var CONSONANT_FLAGS = CATEGORIES.C | CATEGORIES.Ra | CATEGORIES.CM | CATEGORIES.V | CATEGORIES.Placeholder | CATEGORIES.Dotted_Circle;
42977 var JOINER_FLAGS = CATEGORIES.ZWJ | CATEGORIES.ZWNJ;
42978 var HALANT_OR_COENG_FLAGS = CATEGORIES.H | CATEGORIES.Coeng;
42980 var INDIC_CONFIGS = {
42981   Default: {
42982     hasOldSpec: false,
42983     virama: 0,
42984     basePos: 'Last',
42985     rephPos: POSITIONS.Before_Post,
42986     rephMode: 'Implicit',
42987     blwfMode: 'Pre_And_Post'
42988   },
42990   Devanagari: {
42991     hasOldSpec: true,
42992     virama: 0x094D,
42993     basePos: 'Last',
42994     rephPos: POSITIONS.Before_Post,
42995     rephMode: 'Implicit',
42996     blwfMode: 'Pre_And_Post'
42997   },
42999   Bengali: {
43000     hasOldSpec: true,
43001     virama: 0x09CD,
43002     basePos: 'Last',
43003     rephPos: POSITIONS.After_Sub,
43004     rephMode: 'Implicit',
43005     blwfMode: 'Pre_And_Post'
43006   },
43008   Gurmukhi: {
43009     hasOldSpec: true,
43010     virama: 0x0A4D,
43011     basePos: 'Last',
43012     rephPos: POSITIONS.Before_Sub,
43013     rephMode: 'Implicit',
43014     blwfMode: 'Pre_And_Post'
43015   },
43017   Gujarati: {
43018     hasOldSpec: true,
43019     virama: 0x0ACD,
43020     basePos: 'Last',
43021     rephPos: POSITIONS.Before_Post,
43022     rephMode: 'Implicit',
43023     blwfMode: 'Pre_And_Post'
43024   },
43026   Oriya: {
43027     hasOldSpec: true,
43028     virama: 0x0B4D,
43029     basePos: 'Last',
43030     rephPos: POSITIONS.After_Main,
43031     rephMode: 'Implicit',
43032     blwfMode: 'Pre_And_Post'
43033   },
43035   Tamil: {
43036     hasOldSpec: true,
43037     virama: 0x0BCD,
43038     basePos: 'Last',
43039     rephPos: POSITIONS.After_Post,
43040     rephMode: 'Implicit',
43041     blwfMode: 'Pre_And_Post'
43042   },
43044   Telugu: {
43045     hasOldSpec: true,
43046     virama: 0x0C4D,
43047     basePos: 'Last',
43048     rephPos: POSITIONS.After_Post,
43049     rephMode: 'Explicit',
43050     blwfMode: 'Post_Only'
43051   },
43053   Kannada: {
43054     hasOldSpec: true,
43055     virama: 0x0CCD,
43056     basePos: 'Last',
43057     rephPos: POSITIONS.After_Post,
43058     rephMode: 'Implicit',
43059     blwfMode: 'Post_Only'
43060   },
43062   Malayalam: {
43063     hasOldSpec: true,
43064     virama: 0x0D4D,
43065     basePos: 'Last',
43066     rephPos: POSITIONS.After_Main,
43067     rephMode: 'Log_Repha',
43068     blwfMode: 'Pre_And_Post'
43069   },
43071   // Handled by UniversalShaper
43072   // Sinhala: {
43073   //   hasOldSpec: false,
43074   //   virama: 0x0DCA,
43075   //   basePos: 'Last_Sinhala',
43076   //   rephPos: POSITIONS.After_Main,
43077   //   rephMode: 'Explicit',
43078   //   blwfMode: 'Pre_And_Post'
43079   // },
43081   Khmer: {
43082     hasOldSpec: false,
43083     virama: 0x17D2,
43084     basePos: 'First',
43085     rephPos: POSITIONS.Ra_To_Become_Reph,
43086     rephMode: 'Vis_Repha',
43087     blwfMode: 'Pre_And_Post'
43088   }
43091 // Additional decompositions that aren't in Unicode
43092 var INDIC_DECOMPOSITIONS = {
43093   // Khmer
43094   0x17BE: [0x17C1, 0x17BE],
43095   0x17BF: [0x17C1, 0x17BF],
43096   0x17C0: [0x17C1, 0x17C0],
43097   0x17C4: [0x17C1, 0x17C4],
43098   0x17C5: [0x17C1, 0x17C5]
43101 var _class$6;
43102 var _temp$2;
43103 var decompositions = useData.decompositions;
43105 var trie$1 = new UnicodeTrie(Buffer("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","base64"));
43106 var stateMachine = new StateMachine(indicMachine);
43109  * The IndicShaper supports indic scripts e.g. Devanagari, Kannada, etc.
43110  * Based on code from Harfbuzz: https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-complex-indic.cc
43111  */
43112 var IndicShaper = (_temp$2 = _class$6 = function (_DefaultShaper) {
43113   _inherits(IndicShaper, _DefaultShaper);
43115   function IndicShaper() {
43116     _classCallCheck(this, IndicShaper);
43118     return _possibleConstructorReturn(this, _DefaultShaper.apply(this, arguments));
43119   }
43121   IndicShaper.planFeatures = function planFeatures(plan) {
43122     plan.addStage(setupSyllables);
43124     plan.addStage(['locl', 'ccmp']);
43126     plan.addStage(initialReordering);
43128     plan.addStage('nukt');
43129     plan.addStage('akhn');
43130     plan.addStage('rphf', false);
43131     plan.addStage('rkrf');
43132     plan.addStage('pref', false);
43133     plan.addStage('blwf', false);
43134     plan.addStage('abvf', false);
43135     plan.addStage('half', false);
43136     plan.addStage('pstf', false);
43137     plan.addStage('vatu');
43138     plan.addStage('cjct');
43139     plan.addStage('cfar', false);
43141     plan.addStage(finalReordering);
43143     plan.addStage({
43144       local: ['init'],
43145       global: ['pres', 'abvs', 'blws', 'psts', 'haln', 'dist', 'abvm', 'blwm', 'calt', 'clig']
43146     });
43148     // Setup the indic config for the selected script
43149     plan.unicodeScript = fromOpenType(plan.script);
43150     plan.indicConfig = INDIC_CONFIGS[plan.unicodeScript] || INDIC_CONFIGS.Default;
43151     plan.isOldSpec = plan.indicConfig.hasOldSpec && plan.script[plan.script.length - 1] !== '2';
43153     // TODO: turn off kern (Khmer) and liga features.
43154   };
43156   IndicShaper.assignFeatures = function assignFeatures(plan, glyphs) {
43157     var _loop = function _loop(i) {
43158       var codepoint = glyphs[i].codePoints[0];
43159       var d = INDIC_DECOMPOSITIONS[codepoint] || decompositions[codepoint];
43160       if (d) {
43161         var decomposed = d.map(function (c) {
43162           var g = plan.font.glyphForCodePoint(c);
43163           return new GlyphInfo(plan.font, g.id, [c], glyphs[i].features);
43164         });
43166         glyphs.splice.apply(glyphs, [i, 1].concat(decomposed));
43167       }
43168     };
43170     // Decompose split matras
43171     // TODO: do this in a more general unicode normalizer
43172     for (var i = glyphs.length - 1; i >= 0; i--) {
43173       _loop(i);
43174     }
43175   };
43177   return IndicShaper;
43178 }(DefaultShaper), _class$6.zeroMarkWidths = 'NONE', _temp$2);
43179 function indicCategory(glyph) {
43180   return trie$1.get(glyph.codePoints[0]) >> 8;
43183 function indicPosition(glyph) {
43184   return 1 << (trie$1.get(glyph.codePoints[0]) & 0xff);
43187 var IndicInfo = function IndicInfo(category, position, syllableType, syllable) {
43188   _classCallCheck(this, IndicInfo);
43190   this.category = category;
43191   this.position = position;
43192   this.syllableType = syllableType;
43193   this.syllable = syllable;
43196 function setupSyllables(font, glyphs) {
43197   var syllable = 0;
43198   var last = 0;
43199   for (var _iterator = stateMachine.match(glyphs.map(indicCategory)), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
43200     var _ref;
43202     if (_isArray) {
43203       if (_i >= _iterator.length) break;
43204       _ref = _iterator[_i++];
43205     } else {
43206       _i = _iterator.next();
43207       if (_i.done) break;
43208       _ref = _i.value;
43209     }
43211     var _ref2 = _ref,
43212         start = _ref2[0],
43213         end = _ref2[1],
43214         tags = _ref2[2];
43216     if (start > last) {
43217       ++syllable;
43218       for (var _i2 = last; _i2 < start; _i2++) {
43219         glyphs[_i2].shaperInfo = new IndicInfo(CATEGORIES.X, POSITIONS.End, 'non_indic_cluster', syllable);
43220       }
43221     }
43223     ++syllable;
43225     // Create shaper info
43226     for (var _i3 = start; _i3 <= end; _i3++) {
43227       glyphs[_i3].shaperInfo = new IndicInfo(1 << indicCategory(glyphs[_i3]), indicPosition(glyphs[_i3]), tags[0], syllable);
43228     }
43230     last = end + 1;
43231   }
43233   if (last < glyphs.length) {
43234     ++syllable;
43235     for (var i = last; i < glyphs.length; i++) {
43236       glyphs[i].shaperInfo = new IndicInfo(CATEGORIES.X, POSITIONS.End, 'non_indic_cluster', syllable);
43237     }
43238   }
43241 function isConsonant(glyph) {
43242   return glyph.shaperInfo.category & CONSONANT_FLAGS;
43245 function isJoiner(glyph) {
43246   return glyph.shaperInfo.category & JOINER_FLAGS;
43249 function isHalantOrCoeng(glyph) {
43250   return glyph.shaperInfo.category & HALANT_OR_COENG_FLAGS;
43253 function wouldSubstitute(glyphs, feature) {
43254   for (var _iterator2 = glyphs, _isArray2 = Array.isArray(_iterator2), _i4 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
43255     var _glyph$features;
43257     var _ref3;
43259     if (_isArray2) {
43260       if (_i4 >= _iterator2.length) break;
43261       _ref3 = _iterator2[_i4++];
43262     } else {
43263       _i4 = _iterator2.next();
43264       if (_i4.done) break;
43265       _ref3 = _i4.value;
43266     }
43268     var glyph = _ref3;
43270     glyph.features = (_glyph$features = {}, _glyph$features[feature] = true, _glyph$features);
43271   }
43273   var GSUB = glyphs[0]._font._layoutEngine.engine.GSUBProcessor;
43274   GSUB.applyFeatures([feature], glyphs);
43276   return glyphs.length === 1;
43279 function consonantPosition(font, consonant, virama) {
43280   var glyphs = [virama, consonant, virama];
43281   if (wouldSubstitute(glyphs.slice(0, 2), 'blwf') || wouldSubstitute(glyphs.slice(1, 3), 'blwf')) {
43282     return POSITIONS.Below_C;
43283   } else if (wouldSubstitute(glyphs.slice(0, 2), 'pstf') || wouldSubstitute(glyphs.slice(1, 3), 'pstf')) {
43284     return POSITIONS.Post_C;
43285   } else if (wouldSubstitute(glyphs.slice(0, 2), 'pref') || wouldSubstitute(glyphs.slice(1, 3), 'pref')) {
43286     return POSITIONS.Post_C;
43287   }
43289   return POSITIONS.Base_C;
43292 function initialReordering(font, glyphs, plan) {
43293   var indicConfig = plan.indicConfig;
43294   var features = font._layoutEngine.engine.GSUBProcessor.features;
43296   var dottedCircle = font.glyphForCodePoint(0x25cc).id;
43297   var virama = font.glyphForCodePoint(indicConfig.virama).id;
43298   if (virama) {
43299     var info = new GlyphInfo(font, virama, [indicConfig.virama]);
43300     for (var i = 0; i < glyphs.length; i++) {
43301       if (glyphs[i].shaperInfo.position === POSITIONS.Base_C) {
43302         glyphs[i].shaperInfo.position = consonantPosition(font, glyphs[i].copy(), info);
43303       }
43304     }
43305   }
43307   for (var start = 0, end = nextSyllable(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable(glyphs, start)) {
43308     var _glyphs$start$shaperI = glyphs[start].shaperInfo,
43309         category = _glyphs$start$shaperI.category,
43310         syllableType = _glyphs$start$shaperI.syllableType;
43313     if (syllableType === 'symbol_cluster' || syllableType === 'non_indic_cluster') {
43314       continue;
43315     }
43317     if (syllableType === 'broken_cluster' && dottedCircle) {
43318       var g = new GlyphInfo(font, dottedCircle, [0x25cc]);
43319       g.shaperInfo = new IndicInfo(1 << indicCategory(g), indicPosition(g), glyphs[start].shaperInfo.syllableType, glyphs[start].shaperInfo.syllable);
43321       // Insert after possible Repha.
43322       var _i5 = start;
43323       while (_i5 < end && glyphs[_i5].shaperInfo.category === CATEGORIES.Repha) {
43324         _i5++;
43325       }
43327       glyphs.splice(_i5++, 0, g);
43328       end++;
43329     }
43331     // 1. Find base consonant:
43332     //
43333     // The shaping engine finds the base consonant of the syllable, using the
43334     // following algorithm: starting from the end of the syllable, move backwards
43335     // until a consonant is found that does not have a below-base or post-base
43336     // form (post-base forms have to follow below-base forms), or that is not a
43337     // pre-base reordering Ra, or arrive at the first consonant. The consonant
43338     // stopped at will be the base.
43340     var base = end;
43341     var limit = start;
43342     var hasReph = false;
43344     // If the syllable starts with Ra + Halant (in a script that has Reph)
43345     // and has more than one consonant, Ra is excluded from candidates for
43346     // base consonants.
43347     if (indicConfig.rephPos !== POSITIONS.Ra_To_Become_Reph && features.rphf && start + 3 <= end && (indicConfig.rephMode === 'Implicit' && !isJoiner(glyphs[start + 2]) || indicConfig.rephMode === 'Explicit' && glyphs[start + 2].shaperInfo.category === CATEGORIES.ZWJ)) {
43348       // See if it matches the 'rphf' feature.
43349       var _g = [glyphs[start].copy(), glyphs[start + 1].copy(), glyphs[start + 2].copy()];
43350       if (wouldSubstitute(_g.slice(0, 2), 'rphf') || indicConfig.rephMode === 'Explicit' && wouldSubstitute(_g, 'rphf')) {
43351         limit += 2;
43352         while (limit < end && isJoiner(glyphs[limit])) {
43353           limit++;
43354         }
43355         base = start;
43356         hasReph = true;
43357       }
43358     } else if (indicConfig.rephMode === 'Log_Repha' && glyphs[start].shaperInfo.category === CATEGORIES.Repha) {
43359       limit++;
43360       while (limit < end && isJoiner(glyphs[limit])) {
43361         limit++;
43362       }
43363       base = start;
43364       hasReph = true;
43365     }
43367     switch (indicConfig.basePos) {
43368       case 'Last':
43369         {
43370           // starting from the end of the syllable, move backwards
43371           var _i6 = end;
43372           var seenBelow = false;
43374           do {
43375             var _info = glyphs[--_i6].shaperInfo;
43377             // until a consonant is found
43378             if (isConsonant(glyphs[_i6])) {
43379               // that does not have a below-base or post-base form
43380               // (post-base forms have to follow below-base forms),
43381               if (_info.position !== POSITIONS.Below_C && (_info.position !== POSITIONS.Post_C || seenBelow)) {
43382                 base = _i6;
43383                 break;
43384               }
43386               // or that is not a pre-base reordering Ra,
43387               //
43388               // IMPLEMENTATION NOTES:
43389               //
43390               // Our pre-base reordering Ra's are marked POS_POST_C, so will be skipped
43391               // by the logic above already.
43392               //
43394               // or arrive at the first consonant. The consonant stopped at will
43395               // be the base.
43396               if (_info.position === POSITIONS.Below_C) {
43397                 seenBelow = true;
43398               }
43400               base = _i6;
43401             } else if (start < _i6 && _info.category === CATEGORIES.ZWJ && glyphs[_i6 - 1].shaperInfo.category === CATEGORIES.H) {
43402               // A ZWJ after a Halant stops the base search, and requests an explicit
43403               // half form.
43404               // A ZWJ before a Halant, requests a subjoined form instead, and hence
43405               // search continues.  This is particularly important for Bengali
43406               // sequence Ra,H,Ya that should form Ya-Phalaa by subjoining Ya.
43407               break;
43408             }
43409           } while (_i6 > limit);
43410           break;
43411         }
43413       case 'First':
43414         {
43415           // The first consonant is always the base.
43416           base = start;
43418           // Mark all subsequent consonants as below.
43419           for (var _i7 = base + 1; _i7 < end; _i7++) {
43420             if (isConsonant(glyphs[_i7])) {
43421               glyphs[_i7].shaperInfo.position = POSITIONS.Below_C;
43422             }
43423           }
43424         }
43425     }
43427     // If the syllable starts with Ra + Halant (in a script that has Reph)
43428     // and has more than one consonant, Ra is excluded from candidates for
43429     // base consonants.
43430     //
43431     //  Only do this for unforced Reph. (ie. not for Ra,H,ZWJ)
43432     if (hasReph && base === start && limit - base <= 2) {
43433       hasReph = false;
43434     }
43436     // 2. Decompose and reorder Matras:
43437     //
43438     // Each matra and any syllable modifier sign in the cluster are moved to the
43439     // appropriate position relative to the consonant(s) in the cluster. The
43440     // shaping engine decomposes two- or three-part matras into their constituent
43441     // parts before any repositioning. Matra characters are classified by which
43442     // consonant in a conjunct they have affinity for and are reordered to the
43443     // following positions:
43444     //
43445     //   o Before first half form in the syllable
43446     //   o After subjoined consonants
43447     //   o After post-form consonant
43448     //   o After main consonant (for above marks)
43449     //
43450     // IMPLEMENTATION NOTES:
43451     //
43452     // The normalize() routine has already decomposed matras for us, so we don't
43453     // need to worry about that.
43455     // 3.  Reorder marks to canonical order:
43456     //
43457     // Adjacent nukta and halant or nukta and vedic sign are always repositioned
43458     // if necessary, so that the nukta is first.
43459     //
43460     // IMPLEMENTATION NOTES:
43461     //
43462     // We don't need to do this: the normalize() routine already did this for us.
43464     // Reorder characters
43466     for (var _i8 = start; _i8 < base; _i8++) {
43467       var _info2 = glyphs[_i8].shaperInfo;
43468       _info2.position = Math.min(POSITIONS.Pre_C, _info2.position);
43469     }
43471     if (base < end) {
43472       glyphs[base].shaperInfo.position = POSITIONS.Base_C;
43473     }
43475     // Mark final consonants.  A final consonant is one appearing after a matra,
43476     // like in Khmer.
43477     for (var _i9 = base + 1; _i9 < end; _i9++) {
43478       if (glyphs[_i9].shaperInfo.category === CATEGORIES.M) {
43479         for (var j = _i9 + 1; j < end; j++) {
43480           if (isConsonant(glyphs[j])) {
43481             glyphs[j].shaperInfo.position = POSITIONS.Final_C;
43482             break;
43483           }
43484         }
43485         break;
43486       }
43487     }
43489     // Handle beginning Ra
43490     if (hasReph) {
43491       glyphs[start].shaperInfo.position = POSITIONS.Ra_To_Become_Reph;
43492     }
43494     // For old-style Indic script tags, move the first post-base Halant after
43495     // last consonant.
43496     //
43497     // Reports suggest that in some scripts Uniscribe does this only if there
43498     // is *not* a Halant after last consonant already (eg. Kannada), while it
43499     // does it unconditionally in other scripts (eg. Malayalam).  We don't
43500     // currently know about other scripts, so we single out Malayalam for now.
43501     //
43502     // Kannada test case:
43503     // U+0C9A,U+0CCD,U+0C9A,U+0CCD
43504     // With some versions of Lohit Kannada.
43505     // https://bugs.freedesktop.org/show_bug.cgi?id=59118
43506     //
43507     // Malayalam test case:
43508     // U+0D38,U+0D4D,U+0D31,U+0D4D,U+0D31,U+0D4D
43509     // With lohit-ttf-20121122/Lohit-Malayalam.ttf
43510     if (plan.isOldSpec) {
43511       var disallowDoubleHalants = plan.unicodeScript !== 'Malayalam';
43512       for (var _i10 = base + 1; _i10 < end; _i10++) {
43513         if (glyphs[_i10].shaperInfo.category === CATEGORIES.H) {
43514           var _j = void 0;
43515           for (_j = end - 1; _j > _i10; _j--) {
43516             if (isConsonant(glyphs[_j]) || disallowDoubleHalants && glyphs[_j].shaperInfo.category === CATEGORIES.H) {
43517               break;
43518             }
43519           }
43521           if (glyphs[_j].shaperInfo.category !== CATEGORIES.H && _j > _i10) {
43522             // Move Halant to after last consonant.
43523             var t = glyphs[_i10];
43524             glyphs.splice.apply(glyphs, [_i10, 0].concat(glyphs.splice(_i10 + 1, _j - _i10)));
43525             glyphs[_j] = t;
43526           }
43528           break;
43529         }
43530       }
43531     }
43533     // Attach misc marks to previous char to move with them.
43534     var lastPos = POSITIONS.Start;
43535     for (var _i11 = start; _i11 < end; _i11++) {
43536       var _info3 = glyphs[_i11].shaperInfo;
43537       if (_info3.category & (JOINER_FLAGS | CATEGORIES.N | CATEGORIES.RS | CATEGORIES.CM | HALANT_OR_COENG_FLAGS & _info3.category)) {
43538         _info3.position = lastPos;
43539         if (_info3.category === CATEGORIES.H && _info3.position === POSITIONS.Pre_M) {
43540           // Uniscribe doesn't move the Halant with Left Matra.
43541           // TEST: U+092B,U+093F,U+094DE
43542           // We follow.  This is important for the Sinhala
43543           // U+0DDA split matra since it decomposes to U+0DD9,U+0DCA
43544           // where U+0DD9 is a left matra and U+0DCA is the virama.
43545           // We don't want to move the virama with the left matra.
43546           // TEST: U+0D9A,U+0DDA
43547           for (var _j2 = _i11; _j2 > start; _j2--) {
43548             if (glyphs[_j2 - 1].shaperInfo.position !== POSITIONS.Pre_M) {
43549               _info3.position = glyphs[_j2 - 1].shaperInfo.position;
43550               break;
43551             }
43552           }
43553         }
43554       } else if (_info3.position !== POSITIONS.SMVD) {
43555         lastPos = _info3.position;
43556       }
43557     }
43559     // For post-base consonants let them own anything before them
43560     // since the last consonant or matra.
43561     var last = base;
43562     for (var _i12 = base + 1; _i12 < end; _i12++) {
43563       if (isConsonant(glyphs[_i12])) {
43564         for (var _j3 = last + 1; _j3 < _i12; _j3++) {
43565           if (glyphs[_j3].shaperInfo.position < POSITIONS.SMVD) {
43566             glyphs[_j3].shaperInfo.position = glyphs[_i12].shaperInfo.position;
43567           }
43568         }
43569         last = _i12;
43570       } else if (glyphs[_i12].shaperInfo.category === CATEGORIES.M) {
43571         last = _i12;
43572       }
43573     }
43575     var arr = glyphs.slice(start, end);
43576     arr.sort(function (a, b) {
43577       return a.shaperInfo.position - b.shaperInfo.position;
43578     });
43579     glyphs.splice.apply(glyphs, [start, arr.length].concat(arr));
43581     // Find base again
43582     for (var _i13 = start; _i13 < end; _i13++) {
43583       if (glyphs[_i13].shaperInfo.position === POSITIONS.Base_C) {
43584         base = _i13;
43585         break;
43586       }
43587     }
43589     // Setup features now
43591     // Reph
43592     for (var _i14 = start; _i14 < end && glyphs[_i14].shaperInfo.position === POSITIONS.Ra_To_Become_Reph; _i14++) {
43593       glyphs[_i14].features.rphf = true;
43594     }
43596     // Pre-base
43597     var blwf = !plan.isOldSpec && indicConfig.blwfMode === 'Pre_And_Post';
43598     for (var _i15 = start; _i15 < base; _i15++) {
43599       glyphs[_i15].features.half = true;
43600       if (blwf) {
43601         glyphs[_i15].features.blwf = true;
43602       }
43603     }
43605     // Post-base
43606     for (var _i16 = base + 1; _i16 < end; _i16++) {
43607       glyphs[_i16].features.abvf = true;
43608       glyphs[_i16].features.pstf = true;
43609       glyphs[_i16].features.blwf = true;
43610     }
43612     if (plan.isOldSpec && plan.unicodeScript === 'Devanagari') {
43613       // Old-spec eye-lash Ra needs special handling.  From the
43614       // spec:
43615       //
43616       // "The feature 'below-base form' is applied to consonants
43617       // having below-base forms and following the base consonant.
43618       // The exception is vattu, which may appear below half forms
43619       // as well as below the base glyph. The feature 'below-base
43620       // form' will be applied to all such occurrences of Ra as well."
43621       //
43622       // Test case: U+0924,U+094D,U+0930,U+094d,U+0915
43623       // with Sanskrit 2003 font.
43624       //
43625       // However, note that Ra,Halant,ZWJ is the correct way to
43626       // request eyelash form of Ra, so we wouldbn't inhibit it
43627       // in that sequence.
43628       //
43629       // Test case: U+0924,U+094D,U+0930,U+094d,U+200D,U+0915
43630       for (var _i17 = start; _i17 + 1 < base; _i17++) {
43631         if (glyphs[_i17].shaperInfo.category === CATEGORIES.Ra && glyphs[_i17 + 1].shaperInfo.category === CATEGORIES.H && (_i17 + 1 === base || glyphs[_i17 + 2].shaperInfo.category === CATEGORIES.ZWJ)) {
43632           glyphs[_i17].features.blwf = true;
43633           glyphs[_i17 + 1].features.blwf = true;
43634         }
43635       }
43636     }
43638     var prefLen = 2;
43639     if (features.pref && base + prefLen < end) {
43640       // Find a Halant,Ra sequence and mark it for pre-base reordering processing.
43641       for (var _i18 = base + 1; _i18 + prefLen - 1 < end; _i18++) {
43642         var _g2 = [glyphs[_i18].copy(), glyphs[_i18 + 1].copy()];
43643         if (wouldSubstitute(_g2, 'pref')) {
43644           for (var _j4 = 0; _j4 < prefLen; _j4++) {
43645             glyphs[_i18++].features.pref = true;
43646           }
43648           // Mark the subsequent stuff with 'cfar'.  Used in Khmer.
43649           // Read the feature spec.
43650           // This allows distinguishing the following cases with MS Khmer fonts:
43651           // U+1784,U+17D2,U+179A,U+17D2,U+1782
43652           // U+1784,U+17D2,U+1782,U+17D2,U+179A
43653           if (features.cfar) {
43654             for (; _i18 < end; _i18++) {
43655               glyphs[_i18].features.cfar = true;
43656             }
43657           }
43659           break;
43660         }
43661       }
43662     }
43664     // Apply ZWJ/ZWNJ effects
43665     for (var _i19 = start + 1; _i19 < end; _i19++) {
43666       if (isJoiner(glyphs[_i19])) {
43667         var nonJoiner = glyphs[_i19].shaperInfo.category === CATEGORIES.ZWNJ;
43668         var _j5 = _i19;
43670         do {
43671           _j5--;
43673           // ZWJ/ZWNJ should disable CJCT.  They do that by simply
43674           // being there, since we don't skip them for the CJCT
43675           // feature (ie. F_MANUAL_ZWJ)
43677           // A ZWNJ disables HALF.
43678           if (nonJoiner) {
43679             delete glyphs[_j5].features.half;
43680           }
43681         } while (_j5 > start && !isConsonant(glyphs[_j5]));
43682       }
43683     }
43684   }
43687 function finalReordering(font, glyphs, plan) {
43688   var indicConfig = plan.indicConfig;
43689   var features = font._layoutEngine.engine.GSUBProcessor.features;
43691   for (var start = 0, end = nextSyllable(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable(glyphs, start)) {
43692     // 4. Final reordering:
43693     //
43694     // After the localized forms and basic shaping forms GSUB features have been
43695     // applied (see below), the shaping engine performs some final glyph
43696     // reordering before applying all the remaining font features to the entire
43697     // cluster.
43699     var tryPref = !!features.pref;
43701     // Find base again
43702     var base = start;
43703     for (; base < end; base++) {
43704       if (glyphs[base].shaperInfo.position >= POSITIONS.Base_C) {
43705         if (tryPref && base + 1 < end) {
43706           for (var i = base + 1; i < end; i++) {
43707             if (glyphs[i].features.pref) {
43708               if (!(glyphs[i].substituted && glyphs[i].isLigated && !glyphs[i].isMultiplied)) {
43709                 // Ok, this was a 'pref' candidate but didn't form any.
43710                 // Base is around here...
43711                 base = i;
43712                 while (base < end && isHalantOrCoeng(glyphs[base])) {
43713                   base++;
43714                 }
43715                 glyphs[base].shaperInfo.position = POSITIONS.BASE_C;
43716                 tryPref = false;
43717               }
43718               break;
43719             }
43720           }
43721         }
43723         // For Malayalam, skip over unformed below- (but NOT post-) forms.
43724         if (plan.unicodeScript === 'Malayalam') {
43725           for (var _i20 = base + 1; _i20 < end; _i20++) {
43726             while (_i20 < end && isJoiner(glyphs[_i20])) {
43727               _i20++;
43728             }
43730             if (_i20 === end || !isHalantOrCoeng(glyphs[_i20])) {
43731               break;
43732             }
43734             _i20++; // Skip halant.
43735             while (_i20 < end && isJoiner(glyphs[_i20])) {
43736               _i20++;
43737             }
43739             if (_i20 < end && isConsonant(glyphs[_i20]) && glyphs[_i20].shaperInfo.position === POSITIONS.Below_C) {
43740               base = _i20;
43741               glyphs[base].shaperInfo.position = POSITIONS.Base_C;
43742             }
43743           }
43744         }
43746         if (start < base && glyphs[base].shaperInfo.position > POSITIONS.Base_C) {
43747           base--;
43748         }
43749         break;
43750       }
43751     }
43753     if (base === end && start < base && glyphs[base - 1].shaperInfo.category === CATEGORIES.ZWJ) {
43754       base--;
43755     }
43757     if (base < end) {
43758       while (start < base && glyphs[base].shaperInfo.category & (CATEGORIES.N | HALANT_OR_COENG_FLAGS)) {
43759         base--;
43760       }
43761     }
43763     // o Reorder matras:
43764     //
43765     // If a pre-base matra character had been reordered before applying basic
43766     // features, the glyph can be moved closer to the main consonant based on
43767     // whether half-forms had been formed. Actual position for the matra is
43768     // defined as “after last standalone halant glyph, after initial matra
43769     // position and before the main consonant”. If ZWJ or ZWNJ follow this
43770     // halant, position is moved after it.
43771     //
43773     if (start + 1 < end && start < base) {
43774       // Otherwise there can't be any pre-base matra characters.
43775       // If we lost track of base, alas, position before last thingy.
43776       var newPos = base === end ? base - 2 : base - 1;
43778       // Malayalam / Tamil do not have "half" forms or explicit virama forms.
43779       // The glyphs formed by 'half' are Chillus or ligated explicit viramas.
43780       // We want to position matra after them.
43781       if (plan.unicodeScript !== 'Malayalam' && plan.unicodeScript !== 'Tamil') {
43782         while (newPos > start && !(glyphs[newPos].shaperInfo.category & (CATEGORIES.M | HALANT_OR_COENG_FLAGS))) {
43783           newPos--;
43784         }
43786         // If we found no Halant we are done.
43787         // Otherwise only proceed if the Halant does
43788         // not belong to the Matra itself!
43789         if (isHalantOrCoeng(glyphs[newPos]) && glyphs[newPos].shaperInfo.position !== POSITIONS.Pre_M) {
43790           // If ZWJ or ZWNJ follow this halant, position is moved after it.
43791           if (newPos + 1 < end && isJoiner(glyphs[newPos + 1])) {
43792             newPos++;
43793           }
43794         } else {
43795           newPos = start; // No move.
43796         }
43797       }
43799       if (start < newPos && glyphs[newPos].shaperInfo.position !== POSITIONS.Pre_M) {
43800         // Now go see if there's actually any matras...
43801         for (var _i21 = newPos; _i21 > start; _i21--) {
43802           if (glyphs[_i21 - 1].shaperInfo.position === POSITIONS.Pre_M) {
43803             var oldPos = _i21 - 1;
43804             if (oldPos < base && base <= newPos) {
43805               // Shouldn't actually happen.
43806               base--;
43807             }
43809             var tmp = glyphs[oldPos];
43810             glyphs.splice.apply(glyphs, [oldPos, 0].concat(glyphs.splice(oldPos + 1, newPos - oldPos)));
43811             glyphs[newPos] = tmp;
43813             newPos--;
43814           }
43815         }
43816       }
43817     }
43819     // o Reorder reph:
43820     //
43821     // Reph’s original position is always at the beginning of the syllable,
43822     // (i.e. it is not reordered at the character reordering stage). However,
43823     // it will be reordered according to the basic-forms shaping results.
43824     // Possible positions for reph, depending on the script, are; after main,
43825     // before post-base consonant forms, and after post-base consonant forms.
43827     // Two cases:
43828     //
43829     // - If repha is encoded as a sequence of characters (Ra,H or Ra,H,ZWJ), then
43830     //   we should only move it if the sequence ligated to the repha form.
43831     //
43832     // - If repha is encoded separately and in the logical position, we should only
43833     //   move it if it did NOT ligate.  If it ligated, it's probably the font trying
43834     //   to make it work without the reordering.
43835     if (start + 1 < end && glyphs[start].shaperInfo.position === POSITIONS.Ra_To_Become_Reph && glyphs[start].shaperInfo.category === CATEGORIES.Repha !== (glyphs[start].isLigated && !glyphs[start].isMultiplied)) {
43836       var newRephPos = void 0;
43837       var rephPos = indicConfig.rephPos;
43838       var found = false;
43840       // 1. If reph should be positioned after post-base consonant forms,
43841       //    proceed to step 5.
43842       if (rephPos !== POSITIONS.After_Post) {
43843         //  2. If the reph repositioning class is not after post-base: target
43844         //     position is after the first explicit halant glyph between the
43845         //     first post-reph consonant and last main consonant. If ZWJ or ZWNJ
43846         //     are following this halant, position is moved after it. If such
43847         //     position is found, this is the target position. Otherwise,
43848         //     proceed to the next step.
43849         //
43850         //     Note: in old-implementation fonts, where classifications were
43851         //     fixed in shaping engine, there was no case where reph position
43852         //     will be found on this step.
43853         newRephPos = start + 1;
43854         while (newRephPos < base && !isHalantOrCoeng(glyphs[newRephPos])) {
43855           newRephPos++;
43856         }
43858         if (newRephPos < base && isHalantOrCoeng(glyphs[newRephPos])) {
43859           // ->If ZWJ or ZWNJ are following this halant, position is moved after it.
43860           if (newRephPos + 1 < base && isJoiner(glyphs[newRephPos + 1])) {
43861             newRephPos++;
43862           }
43864           found = true;
43865         }
43867         // 3. If reph should be repositioned after the main consonant: find the
43868         //    first consonant not ligated with main, or find the first
43869         //    consonant that is not a potential pre-base reordering Ra.
43870         if (!found && rephPos === POSITIONS.After_Main) {
43871           newRephPos = base;
43872           while (newRephPos + 1 < end && glyphs[newRephPos + 1].shaperInfo.position <= POSITIONS.After_Main) {
43873             newRephPos++;
43874           }
43876           found = newRephPos < end;
43877         }
43879         // 4. If reph should be positioned before post-base consonant, find
43880         //    first post-base classified consonant not ligated with main. If no
43881         //    consonant is found, the target position should be before the
43882         //    first matra, syllable modifier sign or vedic sign.
43883         //
43884         // This is our take on what step 4 is trying to say (and failing, BADLY).
43885         if (!found && rephPos === POSITIONS.After_Sub) {
43886           newRephPos = base;
43887           while (newRephPos + 1 < end && !(glyphs[newRephPos + 1].shaperInfo.position & (POSITIONS.Post_C | POSITIONS.After_Post | POSITIONS.SMVD))) {
43888             newRephPos++;
43889           }
43891           found = newRephPos < end;
43892         }
43893       }
43895       //  5. If no consonant is found in steps 3 or 4, move reph to a position
43896       //     immediately before the first post-base matra, syllable modifier
43897       //     sign or vedic sign that has a reordering class after the intended
43898       //     reph position. For example, if the reordering position for reph
43899       //     is post-main, it will skip above-base matras that also have a
43900       //     post-main position.
43901       if (!found) {
43902         // Copied from step 2.
43903         newRephPos = start + 1;
43904         while (newRephPos < base && !isHalantOrCoeng(glyphs[newRephPos])) {
43905           newRephPos++;
43906         }
43908         if (newRephPos < base && isHalantOrCoeng(glyphs[newRephPos])) {
43909           // ->If ZWJ or ZWNJ are following this halant, position is moved after it.
43910           if (newRephPos + 1 < base && isJoiner(glyphs[newRephPos + 1])) {
43911             newRephPos++;
43912           }
43914           found = true;
43915         }
43916       }
43918       // 6. Otherwise, reorder reph to the end of the syllable.
43919       if (!found) {
43920         newRephPos = end - 1;
43921         while (newRephPos > start && glyphs[newRephPos].shaperInfo.position === POSITIONS.SMVD) {
43922           newRephPos--;
43923         }
43925         // If the Reph is to be ending up after a Matra,Halant sequence,
43926         // position it before that Halant so it can interact with the Matra.
43927         // However, if it's a plain Consonant,Halant we shouldn't do that.
43928         // Uniscribe doesn't do this.
43929         // TEST: U+0930,U+094D,U+0915,U+094B,U+094D
43930         if (isHalantOrCoeng(glyphs[newRephPos])) {
43931           for (var _i22 = base + 1; _i22 < newRephPos; _i22++) {
43932             if (glyphs[_i22].shaperInfo.category === CATEGORIES.M) {
43933               newRephPos--;
43934             }
43935           }
43936         }
43937       }
43939       var reph = glyphs[start];
43940       glyphs.splice.apply(glyphs, [start, 0].concat(glyphs.splice(start + 1, newRephPos - start)));
43941       glyphs[newRephPos] = reph;
43943       if (start < base && base <= newRephPos) {
43944         base--;
43945       }
43946     }
43948     // o Reorder pre-base reordering consonants:
43949     //
43950     // If a pre-base reordering consonant is found, reorder it according to
43951     // the following rules:
43952     if (tryPref && base + 1 < end) {
43953       for (var _i23 = base + 1; _i23 < end; _i23++) {
43954         if (glyphs[_i23].features.pref) {
43955           // 1. Only reorder a glyph produced by substitution during application
43956           //    of the <pref> feature. (Note that a font may shape a Ra consonant with
43957           //    the feature generally but block it in certain contexts.)
43959           // Note: We just check that something got substituted.  We don't check that
43960           // the <pref> feature actually did it...
43961           //
43962           // Reorder pref only if it ligated.
43963           if (glyphs[_i23].isLigated && !glyphs[_i23].isMultiplied) {
43964             // 2. Try to find a target position the same way as for pre-base matra.
43965             //    If it is found, reorder pre-base consonant glyph.
43966             //
43967             // 3. If position is not found, reorder immediately before main
43968             //    consonant.
43969             var _newPos = base;
43971             // Malayalam / Tamil do not have "half" forms or explicit virama forms.
43972             // The glyphs formed by 'half' are Chillus or ligated explicit viramas.
43973             // We want to position matra after them.
43974             if (plan.unicodeScript !== 'Malayalam' && plan.unicodeScript !== 'Tamil') {
43975               while (_newPos > start && !(glyphs[_newPos - 1].shaperInfo.category & (CATEGORIES.M | HALANT_OR_COENG_FLAGS))) {
43976                 _newPos--;
43977               }
43979               // In Khmer coeng model, a H,Ra can go *after* matras.  If it goes after a
43980               // split matra, it should be reordered to *before* the left part of such matra.
43981               if (_newPos > start && glyphs[_newPos - 1].shaperInfo.category === CATEGORIES.M) {
43982                 var _oldPos2 = _i23;
43983                 for (var j = base + 1; j < _oldPos2; j++) {
43984                   if (glyphs[j].shaperInfo.category === CATEGORIES.M) {
43985                     _newPos--;
43986                     break;
43987                   }
43988                 }
43989               }
43990             }
43992             if (_newPos > start && isHalantOrCoeng(glyphs[_newPos - 1])) {
43993               // -> If ZWJ or ZWNJ follow this halant, position is moved after it.
43994               if (_newPos < end && isJoiner(glyphs[_newPos])) {
43995                 _newPos++;
43996               }
43997             }
43999             var _oldPos = _i23;
44000             var _tmp = glyphs[_oldPos];
44001             glyphs.splice.apply(glyphs, [_newPos + 1, 0].concat(glyphs.splice(_newPos, _oldPos - _newPos)));
44002             glyphs[_newPos] = _tmp;
44004             if (_newPos <= base && base < _oldPos) {
44005               base++;
44006             }
44007           }
44009           break;
44010         }
44011       }
44012     }
44014     // Apply 'init' to the Left Matra if it's a word start.
44015     if (glyphs[start].shaperInfo.position === POSITIONS.Pre_M && (!start || !/Cf|Mn/.test(unicode.getCategory(glyphs[start - 1].codePoints[0])))) {
44016       glyphs[start].features.init = true;
44017     }
44018   }
44021 function nextSyllable(glyphs, start) {
44022   if (start >= glyphs.length) return start;
44023   var syllable = glyphs[start].shaperInfo.syllable;
44024   while (++start < glyphs.length && glyphs[start].shaperInfo.syllable === syllable) {}
44025   return start;
44028 var _class$7;
44029 var _temp$3;
44030 var categories$1 = useData.categories;
44031 var decompositions$2 = useData.decompositions;
44032 var trie$2 = new UnicodeTrie(Buffer("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","base64"));
44033 var stateMachine$1 = new StateMachine(useData);
44036  * This shaper is an implementation of the Universal Shaping Engine, which
44037  * uses Unicode data to shape a number of scripts without a dedicated shaping engine.
44038  * See https://www.microsoft.com/typography/OpenTypeDev/USE/intro.htm.
44039  */
44040 var UniversalShaper = (_temp$3 = _class$7 = function (_DefaultShaper) {
44041   _inherits(UniversalShaper, _DefaultShaper);
44043   function UniversalShaper() {
44044     _classCallCheck(this, UniversalShaper);
44046     return _possibleConstructorReturn(this, _DefaultShaper.apply(this, arguments));
44047   }
44049   UniversalShaper.planFeatures = function planFeatures(plan) {
44050     plan.addStage(setupSyllables$1);
44052     // Default glyph pre-processing group
44053     plan.addStage(['locl', 'ccmp', 'nukt', 'akhn']);
44055     // Reordering group
44056     plan.addStage(clearSubstitutionFlags);
44057     plan.addStage(['rphf'], false);
44058     plan.addStage(recordRphf);
44059     plan.addStage(clearSubstitutionFlags);
44060     plan.addStage(['pref']);
44061     plan.addStage(recordPref);
44063     // Orthographic unit shaping group
44064     plan.addStage(['rkrf', 'abvf', 'blwf', 'half', 'pstf', 'vatu', 'cjct']);
44065     plan.addStage(reorder);
44067     // Topographical features
44068     // Scripts that need this are handled by the Arabic shaper, not implemented here for now.
44069     // plan.addStage(['isol', 'init', 'medi', 'fina', 'med2', 'fin2', 'fin3'], false);
44071     // Standard topographic presentation and positional feature application
44072     plan.addStage(['abvs', 'blws', 'pres', 'psts', 'dist', 'abvm', 'blwm']);
44073   };
44075   UniversalShaper.assignFeatures = function assignFeatures(plan, glyphs) {
44076     var _loop = function _loop(i) {
44077       var codepoint = glyphs[i].codePoints[0];
44078       if (decompositions$2[codepoint]) {
44079         var decomposed = decompositions$2[codepoint].map(function (c) {
44080           var g = plan.font.glyphForCodePoint(c);
44081           return new GlyphInfo(plan.font, g.id, [c], glyphs[i].features);
44082         });
44084         glyphs.splice.apply(glyphs, [i, 1].concat(decomposed));
44085       }
44086     };
44088     // Decompose split vowels
44089     // TODO: do this in a more general unicode normalizer
44090     for (var i = glyphs.length - 1; i >= 0; i--) {
44091       _loop(i);
44092     }
44093   };
44095   return UniversalShaper;
44096 }(DefaultShaper), _class$7.zeroMarkWidths = 'BEFORE_GPOS', _temp$3);
44097 function useCategory(glyph) {
44098   return trie$2.get(glyph.codePoints[0]);
44101 var USEInfo = function USEInfo(category, syllableType, syllable) {
44102   _classCallCheck(this, USEInfo);
44104   this.category = category;
44105   this.syllableType = syllableType;
44106   this.syllable = syllable;
44109 function setupSyllables$1(font, glyphs) {
44110   var syllable = 0;
44111   for (var _iterator = stateMachine$1.match(glyphs.map(useCategory)), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
44112     var _ref;
44114     if (_isArray) {
44115       if (_i >= _iterator.length) break;
44116       _ref = _iterator[_i++];
44117     } else {
44118       _i = _iterator.next();
44119       if (_i.done) break;
44120       _ref = _i.value;
44121     }
44123     var _ref2 = _ref,
44124         start = _ref2[0],
44125         end = _ref2[1],
44126         tags = _ref2[2];
44128     ++syllable;
44130     // Create shaper info
44131     for (var i = start; i <= end; i++) {
44132       glyphs[i].shaperInfo = new USEInfo(categories$1[useCategory(glyphs[i])], tags[0], syllable);
44133     }
44135     // Assign rphf feature
44136     var limit = glyphs[start].shaperInfo.category === 'R' ? 1 : Math.min(3, end - start);
44137     for (var _i2 = start; _i2 < start + limit; _i2++) {
44138       glyphs[_i2].features.rphf = true;
44139     }
44140   }
44143 function clearSubstitutionFlags(font, glyphs) {
44144   for (var _iterator2 = glyphs, _isArray2 = Array.isArray(_iterator2), _i3 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
44145     var _ref3;
44147     if (_isArray2) {
44148       if (_i3 >= _iterator2.length) break;
44149       _ref3 = _iterator2[_i3++];
44150     } else {
44151       _i3 = _iterator2.next();
44152       if (_i3.done) break;
44153       _ref3 = _i3.value;
44154     }
44156     var glyph = _ref3;
44158     glyph.substituted = false;
44159   }
44162 function recordRphf(font, glyphs) {
44163   for (var _iterator3 = glyphs, _isArray3 = Array.isArray(_iterator3), _i4 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
44164     var _ref4;
44166     if (_isArray3) {
44167       if (_i4 >= _iterator3.length) break;
44168       _ref4 = _iterator3[_i4++];
44169     } else {
44170       _i4 = _iterator3.next();
44171       if (_i4.done) break;
44172       _ref4 = _i4.value;
44173     }
44175     var glyph = _ref4;
44177     if (glyph.substituted && glyph.features.rphf) {
44178       // Mark a substituted repha.
44179       glyph.shaperInfo.category = 'R';
44180     }
44181   }
44184 function recordPref(font, glyphs) {
44185   for (var _iterator4 = glyphs, _isArray4 = Array.isArray(_iterator4), _i5 = 0, _iterator4 = _isArray4 ? _iterator4 : _getIterator(_iterator4);;) {
44186     var _ref5;
44188     if (_isArray4) {
44189       if (_i5 >= _iterator4.length) break;
44190       _ref5 = _iterator4[_i5++];
44191     } else {
44192       _i5 = _iterator4.next();
44193       if (_i5.done) break;
44194       _ref5 = _i5.value;
44195     }
44197     var glyph = _ref5;
44199     if (glyph.substituted) {
44200       // Mark a substituted pref as VPre, as they behave the same way.
44201       glyph.shaperInfo.category = 'VPre';
44202     }
44203   }
44206 function reorder(font, glyphs) {
44207   var dottedCircle = font.glyphForCodePoint(0x25cc).id;
44209   for (var start = 0, end = nextSyllable$1(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable$1(glyphs, start)) {
44210     var i = void 0,
44211         j = void 0;
44212     var info = glyphs[start].shaperInfo;
44213     var type = info.syllableType;
44215     // Only a few syllable types need reordering.
44216     if (type !== 'virama_terminated_cluster' && type !== 'standard_cluster' && type !== 'broken_cluster') {
44217       continue;
44218     }
44220     // Insert a dotted circle glyph in broken clusters.
44221     if (type === 'broken_cluster' && dottedCircle) {
44222       var g = new GlyphInfo(font, dottedCircle, [0x25cc]);
44223       g.shaperInfo = info;
44225       // Insert after possible Repha.
44226       for (i = start; i < end && glyphs[i].shaperInfo.category === 'R'; i++) {}
44227       glyphs.splice(++i, 0, g);
44228       end++;
44229     }
44231     // Move things forward.
44232     if (info.category === 'R' && end - start > 1) {
44233       // Got a repha. Reorder it to after first base, before first halant.
44234       for (i = start + 1; i < end; i++) {
44235         info = glyphs[i].shaperInfo;
44236         if (isBase(info) || isHalant(glyphs[i])) {
44237           // If we hit a halant, move before it; otherwise it's a base: move to it's
44238           // place, and shift things in between backward.
44239           if (isHalant(glyphs[i])) {
44240             i--;
44241           }
44243           glyphs.splice.apply(glyphs, [start, 0].concat(glyphs.splice(start + 1, i - start), [glyphs[i]]));
44244           break;
44245         }
44246       }
44247     }
44249     // Move things back.
44250     for (i = start, j = end; i < end; i++) {
44251       info = glyphs[i].shaperInfo;
44252       if (isBase(info) || isHalant(glyphs[i])) {
44253         // If we hit a halant, move after it; otherwise it's a base: move to it's
44254         // place, and shift things in between backward.
44255         j = isHalant(glyphs[i]) ? i + 1 : i;
44256       } else if ((info.category === 'VPre' || info.category === 'VMPre') && j < i) {
44257         glyphs.splice.apply(glyphs, [j, 1, glyphs[i]].concat(glyphs.splice(j, i - j)));
44258       }
44259     }
44260   }
44263 function nextSyllable$1(glyphs, start) {
44264   if (start >= glyphs.length) return start;
44265   var syllable = glyphs[start].shaperInfo.syllable;
44266   while (++start < glyphs.length && glyphs[start].shaperInfo.syllable === syllable) {}
44267   return start;
44270 function isHalant(glyph) {
44271   return glyph.shaperInfo.category === 'H' && !glyph.isLigated;
44274 function isBase(info) {
44275   return info.category === 'B' || info.category === 'GB';
44278 var SHAPERS = {
44279   arab: ArabicShaper, // Arabic
44280   mong: ArabicShaper, // Mongolian
44281   syrc: ArabicShaper, // Syriac
44282   'nko ': ArabicShaper, // N'Ko
44283   phag: ArabicShaper, // Phags Pa
44284   mand: ArabicShaper, // Mandaic
44285   mani: ArabicShaper, // Manichaean
44286   phlp: ArabicShaper, // Psalter Pahlavi
44288   hang: HangulShaper, // Hangul
44290   bng2: IndicShaper, // Bengali
44291   beng: IndicShaper, // Bengali
44292   dev2: IndicShaper, // Devanagari
44293   deva: IndicShaper, // Devanagari
44294   gjr2: IndicShaper, // Gujarati
44295   gujr: IndicShaper, // Gujarati
44296   guru: IndicShaper, // Gurmukhi
44297   gur2: IndicShaper, // Gurmukhi
44298   knda: IndicShaper, // Kannada
44299   knd2: IndicShaper, // Kannada
44300   mlm2: IndicShaper, // Malayalam
44301   mlym: IndicShaper, // Malayalam
44302   ory2: IndicShaper, // Oriya
44303   orya: IndicShaper, // Oriya
44304   taml: IndicShaper, // Tamil
44305   tml2: IndicShaper, // Tamil
44306   telu: IndicShaper, // Telugu
44307   tel2: IndicShaper, // Telugu
44308   khmr: IndicShaper, // Khmer
44310   bali: UniversalShaper, // Balinese
44311   batk: UniversalShaper, // Batak
44312   brah: UniversalShaper, // Brahmi
44313   bugi: UniversalShaper, // Buginese
44314   buhd: UniversalShaper, // Buhid
44315   cakm: UniversalShaper, // Chakma
44316   cham: UniversalShaper, // Cham
44317   dupl: UniversalShaper, // Duployan
44318   egyp: UniversalShaper, // Egyptian Hieroglyphs
44319   gran: UniversalShaper, // Grantha
44320   hano: UniversalShaper, // Hanunoo
44321   java: UniversalShaper, // Javanese
44322   kthi: UniversalShaper, // Kaithi
44323   kali: UniversalShaper, // Kayah Li
44324   khar: UniversalShaper, // Kharoshthi
44325   khoj: UniversalShaper, // Khojki
44326   sind: UniversalShaper, // Khudawadi
44327   lepc: UniversalShaper, // Lepcha
44328   limb: UniversalShaper, // Limbu
44329   mahj: UniversalShaper, // Mahajani
44330   // mand: UniversalShaper, // Mandaic
44331   // mani: UniversalShaper, // Manichaean
44332   mtei: UniversalShaper, // Meitei Mayek
44333   modi: UniversalShaper, // Modi
44334   // mong: UniversalShaper, // Mongolian
44335   // 'nko ': UniversalShaper, // N’Ko
44336   hmng: UniversalShaper, // Pahawh Hmong
44337   // phag: UniversalShaper, // Phags-pa
44338   // phlp: UniversalShaper, // Psalter Pahlavi
44339   rjng: UniversalShaper, // Rejang
44340   saur: UniversalShaper, // Saurashtra
44341   shrd: UniversalShaper, // Sharada
44342   sidd: UniversalShaper, // Siddham
44343   sinh: UniversalShaper, // Sinhala
44344   sund: UniversalShaper, // Sundanese
44345   sylo: UniversalShaper, // Syloti Nagri
44346   tglg: UniversalShaper, // Tagalog
44347   tagb: UniversalShaper, // Tagbanwa
44348   tale: UniversalShaper, // Tai Le
44349   lana: UniversalShaper, // Tai Tham
44350   tavt: UniversalShaper, // Tai Viet
44351   takr: UniversalShaper, // Takri
44352   tibt: UniversalShaper, // Tibetan
44353   tfng: UniversalShaper, // Tifinagh
44354   tirh: UniversalShaper, // Tirhuta
44356   latn: DefaultShaper, // Latin
44357   DFLT: DefaultShaper // Default
44360 function choose(script) {
44361   if (!Array.isArray(script)) {
44362     script = [script];
44363   }
44365   for (var _iterator = script, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
44366     var _ref;
44368     if (_isArray) {
44369       if (_i >= _iterator.length) break;
44370       _ref = _iterator[_i++];
44371     } else {
44372       _i = _iterator.next();
44373       if (_i.done) break;
44374       _ref = _i.value;
44375     }
44377     var s = _ref;
44379     var shaper = SHAPERS[s];
44380     if (shaper) {
44381       return shaper;
44382     }
44383   }
44385   return DefaultShaper;
44388 var GSUBProcessor = function (_OTProcessor) {
44389   _inherits(GSUBProcessor, _OTProcessor);
44391   function GSUBProcessor() {
44392     _classCallCheck(this, GSUBProcessor);
44394     return _possibleConstructorReturn(this, _OTProcessor.apply(this, arguments));
44395   }
44397   GSUBProcessor.prototype.applyLookup = function applyLookup(lookupType, table) {
44398     var _this2 = this;
44400     switch (lookupType) {
44401       case 1:
44402         {
44403           // Single Substitution
44404           var index = this.coverageIndex(table.coverage);
44405           if (index === -1) {
44406             return false;
44407           }
44409           var glyph = this.glyphIterator.cur;
44410           switch (table.version) {
44411             case 1:
44412               glyph.id = glyph.id + table.deltaGlyphID & 0xffff;
44413               break;
44415             case 2:
44416               glyph.id = table.substitute.get(index);
44417               break;
44418           }
44420           return true;
44421         }
44423       case 2:
44424         {
44425           // Multiple Substitution
44426           var _index = this.coverageIndex(table.coverage);
44427           if (_index !== -1) {
44428             var _glyphs;
44430             var sequence = table.sequences.get(_index);
44431             this.glyphIterator.cur.id = sequence[0];
44432             this.glyphIterator.cur.ligatureComponent = 0;
44434             var features = this.glyphIterator.cur.features;
44435             var curGlyph = this.glyphIterator.cur;
44436             var replacement = sequence.slice(1).map(function (gid, i) {
44437               var glyph = new GlyphInfo(_this2.font, gid, undefined, features);
44438               glyph.shaperInfo = curGlyph.shaperInfo;
44439               glyph.isLigated = curGlyph.isLigated;
44440               glyph.ligatureComponent = i + 1;
44441               glyph.substituted = true;
44442               glyph.isMultiplied = true;
44443               return glyph;
44444             });
44446             (_glyphs = this.glyphs).splice.apply(_glyphs, [this.glyphIterator.index + 1, 0].concat(replacement));
44447             return true;
44448           }
44450           return false;
44451         }
44453       case 3:
44454         {
44455           // Alternate Substitution
44456           var _index2 = this.coverageIndex(table.coverage);
44457           if (_index2 !== -1) {
44458             var USER_INDEX = 0; // TODO
44459             this.glyphIterator.cur.id = table.alternateSet.get(_index2)[USER_INDEX];
44460             return true;
44461           }
44463           return false;
44464         }
44466       case 4:
44467         {
44468           // Ligature Substitution
44469           var _index3 = this.coverageIndex(table.coverage);
44470           if (_index3 === -1) {
44471             return false;
44472           }
44474           for (var _iterator = table.ligatureSets.get(_index3), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
44475             var _ref;
44477             if (_isArray) {
44478               if (_i >= _iterator.length) break;
44479               _ref = _iterator[_i++];
44480             } else {
44481               _i = _iterator.next();
44482               if (_i.done) break;
44483               _ref = _i.value;
44484             }
44486             var ligature = _ref;
44488             var matched = this.sequenceMatchIndices(1, ligature.components);
44489             if (!matched) {
44490               continue;
44491             }
44493             var _curGlyph = this.glyphIterator.cur;
44495             // Concatenate all of the characters the new ligature will represent
44496             var characters = _curGlyph.codePoints.slice();
44497             for (var _iterator2 = matched, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
44498               var _ref2;
44500               if (_isArray2) {
44501                 if (_i2 >= _iterator2.length) break;
44502                 _ref2 = _iterator2[_i2++];
44503               } else {
44504                 _i2 = _iterator2.next();
44505                 if (_i2.done) break;
44506                 _ref2 = _i2.value;
44507               }
44509               var _index4 = _ref2;
44511               characters.push.apply(characters, this.glyphs[_index4].codePoints);
44512             }
44514             // Create the replacement ligature glyph
44515             var ligatureGlyph = new GlyphInfo(this.font, ligature.glyph, characters, _curGlyph.features);
44516             ligatureGlyph.shaperInfo = _curGlyph.shaperInfo;
44517             ligatureGlyph.isLigated = true;
44518             ligatureGlyph.substituted = true;
44520             // From Harfbuzz:
44521             // - If it *is* a mark ligature, we don't allocate a new ligature id, and leave
44522             //   the ligature to keep its old ligature id.  This will allow it to attach to
44523             //   a base ligature in GPOS.  Eg. if the sequence is: LAM,LAM,SHADDA,FATHA,HEH,
44524             //   and LAM,LAM,HEH for a ligature, they will leave SHADDA and FATHA with a
44525             //   ligature id and component value of 2.  Then if SHADDA,FATHA form a ligature
44526             //   later, we don't want them to lose their ligature id/component, otherwise
44527             //   GPOS will fail to correctly position the mark ligature on top of the
44528             //   LAM,LAM,HEH ligature. See https://bugzilla.gnome.org/show_bug.cgi?id=676343
44529             //
44530             // - If a ligature is formed of components that some of which are also ligatures
44531             //   themselves, and those ligature components had marks attached to *their*
44532             //   components, we have to attach the marks to the new ligature component
44533             //   positions!  Now *that*'s tricky!  And these marks may be following the
44534             //   last component of the whole sequence, so we should loop forward looking
44535             //   for them and update them.
44536             //
44537             //   Eg. the sequence is LAM,LAM,SHADDA,FATHA,HEH, and the font first forms a
44538             //   'calt' ligature of LAM,HEH, leaving the SHADDA and FATHA with a ligature
44539             //   id and component == 1.  Now, during 'liga', the LAM and the LAM-HEH ligature
44540             //   form a LAM-LAM-HEH ligature.  We need to reassign the SHADDA and FATHA to
44541             //   the new ligature with a component value of 2.
44542             //
44543             //   This in fact happened to a font...  See https://bugzilla.gnome.org/show_bug.cgi?id=437633
44544             var isMarkLigature = _curGlyph.isMark;
44545             for (var i = 0; i < matched.length && isMarkLigature; i++) {
44546               isMarkLigature = this.glyphs[matched[i]].isMark;
44547             }
44549             ligatureGlyph.ligatureID = isMarkLigature ? null : this.ligatureID++;
44551             var lastLigID = _curGlyph.ligatureID;
44552             var lastNumComps = _curGlyph.codePoints.length;
44553             var curComps = lastNumComps;
44554             var idx = this.glyphIterator.index + 1;
44556             // Set ligatureID and ligatureComponent on glyphs that were skipped in the matched sequence.
44557             // This allows GPOS to attach marks to the correct ligature components.
44558             for (var _iterator3 = matched, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
44559               var _ref3;
44561               if (_isArray3) {
44562                 if (_i3 >= _iterator3.length) break;
44563                 _ref3 = _iterator3[_i3++];
44564               } else {
44565                 _i3 = _iterator3.next();
44566                 if (_i3.done) break;
44567                 _ref3 = _i3.value;
44568               }
44570               var matchIndex = _ref3;
44572               // Don't assign new ligature components for mark ligatures (see above)
44573               if (isMarkLigature) {
44574                 idx = matchIndex;
44575               } else {
44576                 while (idx < matchIndex) {
44577                   var ligatureComponent = curComps - lastNumComps + Math.min(this.glyphs[idx].ligatureComponent || 1, lastNumComps);
44578                   this.glyphs[idx].ligatureID = ligatureGlyph.ligatureID;
44579                   this.glyphs[idx].ligatureComponent = ligatureComponent;
44580                   idx++;
44581                 }
44582               }
44584               lastLigID = this.glyphs[idx].ligatureID;
44585               lastNumComps = this.glyphs[idx].codePoints.length;
44586               curComps += lastNumComps;
44587               idx++; // skip base glyph
44588             }
44590             // Adjust ligature components for any marks following
44591             if (lastLigID && !isMarkLigature) {
44592               for (var _i4 = idx; _i4 < this.glyphs.length; _i4++) {
44593                 if (this.glyphs[_i4].ligatureID === lastLigID) {
44594                   var ligatureComponent = curComps - lastNumComps + Math.min(this.glyphs[_i4].ligatureComponent || 1, lastNumComps);
44595                   this.glyphs[_i4].ligatureComponent = ligatureComponent;
44596                 } else {
44597                   break;
44598                 }
44599               }
44600             }
44602             // Delete the matched glyphs, and replace the current glyph with the ligature glyph
44603             for (var _i5 = matched.length - 1; _i5 >= 0; _i5--) {
44604               this.glyphs.splice(matched[_i5], 1);
44605             }
44607             this.glyphs[this.glyphIterator.index] = ligatureGlyph;
44608             return true;
44609           }
44611           return false;
44612         }
44614       case 5:
44615         // Contextual Substitution
44616         return this.applyContext(table);
44618       case 6:
44619         // Chaining Contextual Substitution
44620         return this.applyChainingContext(table);
44622       case 7:
44623         // Extension Substitution
44624         return this.applyLookup(table.lookupType, table.extension);
44626       default:
44627         throw new Error('GSUB lookupType ' + lookupType + ' is not supported');
44628     }
44629   };
44631   return GSUBProcessor;
44632 }(OTProcessor);
44634 var GPOSProcessor = function (_OTProcessor) {
44635   _inherits(GPOSProcessor, _OTProcessor);
44637   function GPOSProcessor() {
44638     _classCallCheck(this, GPOSProcessor);
44640     return _possibleConstructorReturn(this, _OTProcessor.apply(this, arguments));
44641   }
44643   GPOSProcessor.prototype.applyPositionValue = function applyPositionValue(sequenceIndex, value) {
44644     var position = this.positions[this.glyphIterator.peekIndex(sequenceIndex)];
44645     if (value.xAdvance != null) {
44646       position.xAdvance += value.xAdvance;
44647     }
44649     if (value.yAdvance != null) {
44650       position.yAdvance += value.yAdvance;
44651     }
44653     if (value.xPlacement != null) {
44654       position.xOffset += value.xPlacement;
44655     }
44657     if (value.yPlacement != null) {
44658       position.yOffset += value.yPlacement;
44659     }
44661     // Adjustments for font variations
44662     var variationProcessor = this.font._variationProcessor;
44663     var variationStore = this.font.GDEF && this.font.GDEF.itemVariationStore;
44664     if (variationProcessor && variationStore) {
44665       if (value.xPlaDevice) {
44666         position.xOffset += variationProcessor.getDelta(variationStore, value.xPlaDevice.a, value.xPlaDevice.b);
44667       }
44669       if (value.yPlaDevice) {
44670         position.yOffset += variationProcessor.getDelta(variationStore, value.yPlaDevice.a, value.yPlaDevice.b);
44671       }
44673       if (value.xAdvDevice) {
44674         position.xAdvance += variationProcessor.getDelta(variationStore, value.xAdvDevice.a, value.xAdvDevice.b);
44675       }
44677       if (value.yAdvDevice) {
44678         position.yAdvance += variationProcessor.getDelta(variationStore, value.yAdvDevice.a, value.yAdvDevice.b);
44679       }
44680     }
44682     // TODO: device tables
44683   };
44685   GPOSProcessor.prototype.applyLookup = function applyLookup(lookupType, table) {
44686     switch (lookupType) {
44687       case 1:
44688         {
44689           // Single positioning value
44690           var index = this.coverageIndex(table.coverage);
44691           if (index === -1) {
44692             return false;
44693           }
44695           switch (table.version) {
44696             case 1:
44697               this.applyPositionValue(0, table.value);
44698               break;
44700             case 2:
44701               this.applyPositionValue(0, table.values.get(index));
44702               break;
44703           }
44705           return true;
44706         }
44708       case 2:
44709         {
44710           // Pair Adjustment Positioning
44711           var nextGlyph = this.glyphIterator.peek();
44712           if (!nextGlyph) {
44713             return false;
44714           }
44716           var _index = this.coverageIndex(table.coverage);
44717           if (_index === -1) {
44718             return false;
44719           }
44721           switch (table.version) {
44722             case 1:
44723               // Adjustments for glyph pairs
44724               var set = table.pairSets.get(_index);
44726               for (var _iterator = set, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
44727                 var _ref;
44729                 if (_isArray) {
44730                   if (_i >= _iterator.length) break;
44731                   _ref = _iterator[_i++];
44732                 } else {
44733                   _i = _iterator.next();
44734                   if (_i.done) break;
44735                   _ref = _i.value;
44736                 }
44738                 var _pair = _ref;
44740                 if (_pair.secondGlyph === nextGlyph.id) {
44741                   this.applyPositionValue(0, _pair.value1);
44742                   this.applyPositionValue(1, _pair.value2);
44743                   return true;
44744                 }
44745               }
44747               return false;
44749             case 2:
44750               // Class pair adjustment
44751               var class1 = this.getClassID(this.glyphIterator.cur.id, table.classDef1);
44752               var class2 = this.getClassID(nextGlyph.id, table.classDef2);
44753               if (class1 === -1 || class2 === -1) {
44754                 return false;
44755               }
44757               var pair = table.classRecords.get(class1).get(class2);
44758               this.applyPositionValue(0, pair.value1);
44759               this.applyPositionValue(1, pair.value2);
44760               return true;
44761           }
44762         }
44764       case 3:
44765         {
44766           // Cursive Attachment Positioning
44767           var nextIndex = this.glyphIterator.peekIndex();
44768           var _nextGlyph = this.glyphs[nextIndex];
44769           if (!_nextGlyph) {
44770             return false;
44771           }
44773           var curRecord = table.entryExitRecords[this.coverageIndex(table.coverage)];
44774           if (!curRecord || !curRecord.exitAnchor) {
44775             return false;
44776           }
44778           var nextRecord = table.entryExitRecords[this.coverageIndex(table.coverage, _nextGlyph.id)];
44779           if (!nextRecord || !nextRecord.entryAnchor) {
44780             return false;
44781           }
44783           var entry = this.getAnchor(nextRecord.entryAnchor);
44784           var exit = this.getAnchor(curRecord.exitAnchor);
44786           var cur = this.positions[this.glyphIterator.index];
44787           var next = this.positions[nextIndex];
44789           switch (this.direction) {
44790             case 'ltr':
44791               cur.xAdvance = exit.x + cur.xOffset;
44793               var d = entry.x + next.xOffset;
44794               next.xAdvance -= d;
44795               next.xOffset -= d;
44796               break;
44798             case 'rtl':
44799               d = exit.x + cur.xOffset;
44800               cur.xAdvance -= d;
44801               cur.xOffset -= d;
44802               next.xAdvance = entry.x + next.xOffset;
44803               break;
44804           }
44806           if (this.glyphIterator.flags.rightToLeft) {
44807             this.glyphIterator.cur.cursiveAttachment = nextIndex;
44808             cur.yOffset = entry.y - exit.y;
44809           } else {
44810             _nextGlyph.cursiveAttachment = this.glyphIterator.index;
44811             cur.yOffset = exit.y - entry.y;
44812           }
44814           return true;
44815         }
44817       case 4:
44818         {
44819           // Mark to base positioning
44820           var markIndex = this.coverageIndex(table.markCoverage);
44821           if (markIndex === -1) {
44822             return false;
44823           }
44825           // search backward for a base glyph
44826           var baseGlyphIndex = this.glyphIterator.index;
44827           while (--baseGlyphIndex >= 0 && (this.glyphs[baseGlyphIndex].isMark || this.glyphs[baseGlyphIndex].ligatureComponent > 0)) {}
44829           if (baseGlyphIndex < 0) {
44830             return false;
44831           }
44833           var baseIndex = this.coverageIndex(table.baseCoverage, this.glyphs[baseGlyphIndex].id);
44834           if (baseIndex === -1) {
44835             return false;
44836           }
44838           var markRecord = table.markArray[markIndex];
44839           var baseAnchor = table.baseArray[baseIndex][markRecord.class];
44840           this.applyAnchor(markRecord, baseAnchor, baseGlyphIndex);
44841           return true;
44842         }
44844       case 5:
44845         {
44846           // Mark to ligature positioning
44847           var _markIndex = this.coverageIndex(table.markCoverage);
44848           if (_markIndex === -1) {
44849             return false;
44850           }
44852           // search backward for a base glyph
44853           var _baseGlyphIndex = this.glyphIterator.index;
44854           while (--_baseGlyphIndex >= 0 && this.glyphs[_baseGlyphIndex].isMark) {}
44856           if (_baseGlyphIndex < 0) {
44857             return false;
44858           }
44860           var ligIndex = this.coverageIndex(table.ligatureCoverage, this.glyphs[_baseGlyphIndex].id);
44861           if (ligIndex === -1) {
44862             return false;
44863           }
44865           var ligAttach = table.ligatureArray[ligIndex];
44866           var markGlyph = this.glyphIterator.cur;
44867           var ligGlyph = this.glyphs[_baseGlyphIndex];
44868           var compIndex = ligGlyph.ligatureID && ligGlyph.ligatureID === markGlyph.ligatureID && markGlyph.ligatureComponent > 0 ? Math.min(markGlyph.ligatureComponent, ligGlyph.codePoints.length) - 1 : ligGlyph.codePoints.length - 1;
44870           var _markRecord = table.markArray[_markIndex];
44871           var _baseAnchor = ligAttach[compIndex][_markRecord.class];
44872           this.applyAnchor(_markRecord, _baseAnchor, _baseGlyphIndex);
44873           return true;
44874         }
44876       case 6:
44877         {
44878           // Mark to mark positioning
44879           var mark1Index = this.coverageIndex(table.mark1Coverage);
44880           if (mark1Index === -1) {
44881             return false;
44882           }
44884           // get the previous mark to attach to
44885           var prevIndex = this.glyphIterator.peekIndex(-1);
44886           var prev = this.glyphs[prevIndex];
44887           if (!prev || !prev.isMark) {
44888             return false;
44889           }
44891           var _cur = this.glyphIterator.cur;
44893           // The following logic was borrowed from Harfbuzz
44894           var good = false;
44895           if (_cur.ligatureID === prev.ligatureID) {
44896             if (!_cur.ligatureID) {
44897               // Marks belonging to the same base
44898               good = true;
44899             } else if (_cur.ligatureComponent === prev.ligatureComponent) {
44900               // Marks belonging to the same ligature component
44901               good = true;
44902             }
44903           } else {
44904             // If ligature ids don't match, it may be the case that one of the marks
44905             // itself is a ligature, in which case match.
44906             if (_cur.ligatureID && !_cur.ligatureComponent || prev.ligatureID && !prev.ligatureComponent) {
44907               good = true;
44908             }
44909           }
44911           if (!good) {
44912             return false;
44913           }
44915           var mark2Index = this.coverageIndex(table.mark2Coverage, prev.id);
44916           if (mark2Index === -1) {
44917             return false;
44918           }
44920           var _markRecord2 = table.mark1Array[mark1Index];
44921           var _baseAnchor2 = table.mark2Array[mark2Index][_markRecord2.class];
44922           this.applyAnchor(_markRecord2, _baseAnchor2, prevIndex);
44923           return true;
44924         }
44926       case 7:
44927         // Contextual positioning
44928         return this.applyContext(table);
44930       case 8:
44931         // Chaining contextual positioning
44932         return this.applyChainingContext(table);
44934       case 9:
44935         // Extension positioning
44936         return this.applyLookup(table.lookupType, table.extension);
44938       default:
44939         throw new Error('Unsupported GPOS table: ' + lookupType);
44940     }
44941   };
44943   GPOSProcessor.prototype.applyAnchor = function applyAnchor(markRecord, baseAnchor, baseGlyphIndex) {
44944     var baseCoords = this.getAnchor(baseAnchor);
44945     var markCoords = this.getAnchor(markRecord.markAnchor);
44947     var basePos = this.positions[baseGlyphIndex];
44948     var markPos = this.positions[this.glyphIterator.index];
44950     markPos.xOffset = baseCoords.x - markCoords.x;
44951     markPos.yOffset = baseCoords.y - markCoords.y;
44952     this.glyphIterator.cur.markAttachment = baseGlyphIndex;
44953   };
44955   GPOSProcessor.prototype.getAnchor = function getAnchor(anchor) {
44956     // TODO: contour point, device tables
44957     var x = anchor.xCoordinate;
44958     var y = anchor.yCoordinate;
44960     // Adjustments for font variations
44961     var variationProcessor = this.font._variationProcessor;
44962     var variationStore = this.font.GDEF && this.font.GDEF.itemVariationStore;
44963     if (variationProcessor && variationStore) {
44964       if (anchor.xDeviceTable) {
44965         x += variationProcessor.getDelta(variationStore, anchor.xDeviceTable.a, anchor.xDeviceTable.b);
44966       }
44968       if (anchor.yDeviceTable) {
44969         y += variationProcessor.getDelta(variationStore, anchor.yDeviceTable.a, anchor.yDeviceTable.b);
44970       }
44971     }
44973     return { x: x, y: y };
44974   };
44976   GPOSProcessor.prototype.applyFeatures = function applyFeatures(userFeatures, glyphs, advances) {
44977     _OTProcessor.prototype.applyFeatures.call(this, userFeatures, glyphs, advances);
44979     for (var i = 0; i < this.glyphs.length; i++) {
44980       this.fixCursiveAttachment(i);
44981     }
44983     this.fixMarkAttachment();
44984   };
44986   GPOSProcessor.prototype.fixCursiveAttachment = function fixCursiveAttachment(i) {
44987     var glyph = this.glyphs[i];
44988     if (glyph.cursiveAttachment != null) {
44989       var j = glyph.cursiveAttachment;
44991       glyph.cursiveAttachment = null;
44992       this.fixCursiveAttachment(j);
44994       this.positions[i].yOffset += this.positions[j].yOffset;
44995     }
44996   };
44998   GPOSProcessor.prototype.fixMarkAttachment = function fixMarkAttachment() {
44999     for (var i = 0; i < this.glyphs.length; i++) {
45000       var glyph = this.glyphs[i];
45001       if (glyph.markAttachment != null) {
45002         var j = glyph.markAttachment;
45004         this.positions[i].xOffset += this.positions[j].xOffset;
45005         this.positions[i].yOffset += this.positions[j].yOffset;
45007         if (this.direction === 'ltr') {
45008           for (var k = j; k < i; k++) {
45009             this.positions[i].xOffset -= this.positions[k].xAdvance;
45010             this.positions[i].yOffset -= this.positions[k].yAdvance;
45011           }
45012         } else {
45013           for (var _k = j + 1; _k < i + 1; _k++) {
45014             this.positions[i].xOffset += this.positions[_k].xAdvance;
45015             this.positions[i].yOffset += this.positions[_k].yAdvance;
45016           }
45017         }
45018       }
45019     }
45020   };
45022   return GPOSProcessor;
45023 }(OTProcessor);
45025 var OTLayoutEngine = function () {
45026   function OTLayoutEngine(font) {
45027     _classCallCheck(this, OTLayoutEngine);
45029     this.font = font;
45030     this.glyphInfos = null;
45031     this.plan = null;
45032     this.GSUBProcessor = null;
45033     this.GPOSProcessor = null;
45034     this.fallbackPosition = true;
45036     if (font.GSUB) {
45037       this.GSUBProcessor = new GSUBProcessor(font, font.GSUB);
45038     }
45040     if (font.GPOS) {
45041       this.GPOSProcessor = new GPOSProcessor(font, font.GPOS);
45042     }
45043   }
45045   OTLayoutEngine.prototype.setup = function setup(glyphRun) {
45046     var _this = this;
45048     // Map glyphs to GlyphInfo objects so data can be passed between
45049     // GSUB and GPOS without mutating the real (shared) Glyph objects.
45050     this.glyphInfos = glyphRun.glyphs.map(function (glyph) {
45051       return new GlyphInfo(_this.font, glyph.id, [].concat(glyph.codePoints));
45052     });
45054     // Select a script based on what is available in GSUB/GPOS.
45055     var script = null;
45056     if (this.GPOSProcessor) {
45057       script = this.GPOSProcessor.selectScript(glyphRun.script, glyphRun.language, glyphRun.direction);
45058     }
45060     if (this.GSUBProcessor) {
45061       script = this.GSUBProcessor.selectScript(glyphRun.script, glyphRun.language, glyphRun.direction);
45062     }
45064     // Choose a shaper based on the script, and setup a shaping plan.
45065     // This determines which features to apply to which glyphs.
45066     this.shaper = choose(script);
45067     this.plan = new ShapingPlan(this.font, script, glyphRun.direction);
45068     this.shaper.plan(this.plan, this.glyphInfos, glyphRun.features);
45070     // Assign chosen features to output glyph run
45071     for (var key in this.plan.allFeatures) {
45072       glyphRun.features[key] = true;
45073     }
45074   };
45076   OTLayoutEngine.prototype.substitute = function substitute(glyphRun) {
45077     var _this2 = this;
45079     if (this.GSUBProcessor) {
45080       this.plan.process(this.GSUBProcessor, this.glyphInfos);
45082       // Map glyph infos back to normal Glyph objects
45083       glyphRun.glyphs = this.glyphInfos.map(function (glyphInfo) {
45084         return _this2.font.getGlyph(glyphInfo.id, glyphInfo.codePoints);
45085       });
45086     }
45087   };
45089   OTLayoutEngine.prototype.position = function position(glyphRun) {
45090     if (this.shaper.zeroMarkWidths === 'BEFORE_GPOS') {
45091       this.zeroMarkAdvances(glyphRun.positions);
45092     }
45094     if (this.GPOSProcessor) {
45095       this.plan.process(this.GPOSProcessor, this.glyphInfos, glyphRun.positions);
45096     }
45098     if (this.shaper.zeroMarkWidths === 'AFTER_GPOS') {
45099       this.zeroMarkAdvances(glyphRun.positions);
45100     }
45102     // Reverse the glyphs and positions if the script is right-to-left
45103     if (glyphRun.direction === 'rtl') {
45104       glyphRun.glyphs.reverse();
45105       glyphRun.positions.reverse();
45106     }
45108     return this.GPOSProcessor && this.GPOSProcessor.features;
45109   };
45111   OTLayoutEngine.prototype.zeroMarkAdvances = function zeroMarkAdvances(positions) {
45112     for (var i = 0; i < this.glyphInfos.length; i++) {
45113       if (this.glyphInfos[i].isMark) {
45114         positions[i].xAdvance = 0;
45115         positions[i].yAdvance = 0;
45116       }
45117     }
45118   };
45120   OTLayoutEngine.prototype.cleanup = function cleanup() {
45121     this.glyphInfos = null;
45122     this.plan = null;
45123     this.shaper = null;
45124   };
45126   OTLayoutEngine.prototype.getAvailableFeatures = function getAvailableFeatures(script, language) {
45127     var features = [];
45129     if (this.GSUBProcessor) {
45130       this.GSUBProcessor.selectScript(script, language);
45131       features.push.apply(features, _Object$keys(this.GSUBProcessor.features));
45132     }
45134     if (this.GPOSProcessor) {
45135       this.GPOSProcessor.selectScript(script, language);
45136       features.push.apply(features, _Object$keys(this.GPOSProcessor.features));
45137     }
45139     return features;
45140   };
45142   return OTLayoutEngine;
45143 }();
45145 var LayoutEngine = function () {
45146   function LayoutEngine(font) {
45147     _classCallCheck(this, LayoutEngine);
45149     this.font = font;
45150     this.unicodeLayoutEngine = null;
45151     this.kernProcessor = null;
45153     // Choose an advanced layout engine. We try the AAT morx table first since more
45154     // scripts are currently supported because the shaping logic is built into the font.
45155     if (this.font.morx) {
45156       this.engine = new AATLayoutEngine(this.font);
45157     } else if (this.font.GSUB || this.font.GPOS) {
45158       this.engine = new OTLayoutEngine(this.font);
45159     }
45160   }
45162   LayoutEngine.prototype.layout = function layout(string, features, script, language, direction) {
45163     // Make the features parameter optional
45164     if (typeof features === 'string') {
45165       direction = language;
45166       language = script;
45167       script = features;
45168       features = [];
45169     }
45171     // Map string to glyphs if needed
45172     if (typeof string === 'string') {
45173       // Attempt to detect the script from the string if not provided.
45174       if (script == null) {
45175         script = forString(string);
45176       }
45178       var glyphs = this.font.glyphsForString(string);
45179     } else {
45180       // Attempt to detect the script from the glyph code points if not provided.
45181       if (script == null) {
45182         var codePoints = [];
45183         for (var _iterator = string, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
45184           var _ref;
45186           if (_isArray) {
45187             if (_i >= _iterator.length) break;
45188             _ref = _iterator[_i++];
45189           } else {
45190             _i = _iterator.next();
45191             if (_i.done) break;
45192             _ref = _i.value;
45193           }
45195           var glyph = _ref;
45197           codePoints.push.apply(codePoints, glyph.codePoints);
45198         }
45200         script = forCodePoints(codePoints);
45201       }
45203       var glyphs = string;
45204     }
45206     var glyphRun = new GlyphRun(glyphs, features, script, language, direction);
45208     // Return early if there are no glyphs
45209     if (glyphs.length === 0) {
45210       glyphRun.positions = [];
45211       return glyphRun;
45212     }
45214     // Setup the advanced layout engine
45215     if (this.engine && this.engine.setup) {
45216       this.engine.setup(glyphRun);
45217     }
45219     // Substitute and position the glyphs
45220     this.substitute(glyphRun);
45221     this.position(glyphRun);
45223     this.hideDefaultIgnorables(glyphRun.glyphs, glyphRun.positions);
45225     // Let the layout engine clean up any state it might have
45226     if (this.engine && this.engine.cleanup) {
45227       this.engine.cleanup();
45228     }
45230     return glyphRun;
45231   };
45233   LayoutEngine.prototype.substitute = function substitute(glyphRun) {
45234     // Call the advanced layout engine to make substitutions
45235     if (this.engine && this.engine.substitute) {
45236       this.engine.substitute(glyphRun);
45237     }
45238   };
45240   LayoutEngine.prototype.position = function position(glyphRun) {
45241     // Get initial glyph positions
45242     glyphRun.positions = glyphRun.glyphs.map(function (glyph) {
45243       return new GlyphPosition(glyph.advanceWidth);
45244     });
45245     var positioned = null;
45247     // Call the advanced layout engine. Returns the features applied.
45248     if (this.engine && this.engine.position) {
45249       positioned = this.engine.position(glyphRun);
45250     }
45252     // if there is no GPOS table, use unicode properties to position marks.
45253     if (!positioned && (!this.engine || this.engine.fallbackPosition)) {
45254       if (!this.unicodeLayoutEngine) {
45255         this.unicodeLayoutEngine = new UnicodeLayoutEngine(this.font);
45256       }
45258       this.unicodeLayoutEngine.positionGlyphs(glyphRun.glyphs, glyphRun.positions);
45259     }
45261     // if kerning is not supported by GPOS, do kerning with the TrueType/AAT kern table
45262     if ((!positioned || !positioned.kern) && glyphRun.features.kern !== false && this.font.kern) {
45263       if (!this.kernProcessor) {
45264         this.kernProcessor = new KernProcessor(this.font);
45265       }
45267       this.kernProcessor.process(glyphRun.glyphs, glyphRun.positions);
45268       glyphRun.features.kern = true;
45269     }
45270   };
45272   LayoutEngine.prototype.hideDefaultIgnorables = function hideDefaultIgnorables(glyphs, positions) {
45273     var space = this.font.glyphForCodePoint(0x20);
45274     for (var i = 0; i < glyphs.length; i++) {
45275       if (this.isDefaultIgnorable(glyphs[i].codePoints[0])) {
45276         glyphs[i] = space;
45277         positions[i].xAdvance = 0;
45278         positions[i].yAdvance = 0;
45279       }
45280     }
45281   };
45283   LayoutEngine.prototype.isDefaultIgnorable = function isDefaultIgnorable(ch) {
45284     // From DerivedCoreProperties.txt in the Unicode database,
45285     // minus U+115F, U+1160, U+3164 and U+FFA0, which is what
45286     // Harfbuzz and Uniscribe do.
45287     var plane = ch >> 16;
45288     if (plane === 0) {
45289       // BMP
45290       switch (ch >> 8) {
45291         case 0x00:
45292           return ch === 0x00AD;
45293         case 0x03:
45294           return ch === 0x034F;
45295         case 0x06:
45296           return ch === 0x061C;
45297         case 0x17:
45298           return 0x17B4 <= ch && ch <= 0x17B5;
45299         case 0x18:
45300           return 0x180B <= ch && ch <= 0x180E;
45301         case 0x20:
45302           return 0x200B <= ch && ch <= 0x200F || 0x202A <= ch && ch <= 0x202E || 0x2060 <= ch && ch <= 0x206F;
45303         case 0xFE:
45304           return 0xFE00 <= ch && ch <= 0xFE0F || ch === 0xFEFF;
45305         case 0xFF:
45306           return 0xFFF0 <= ch && ch <= 0xFFF8;
45307         default:
45308           return false;
45309       }
45310     } else {
45311       // Other planes
45312       switch (plane) {
45313         case 0x01:
45314           return 0x1BCA0 <= ch && ch <= 0x1BCA3 || 0x1D173 <= ch && ch <= 0x1D17A;
45315         case 0x0E:
45316           return 0xE0000 <= ch && ch <= 0xE0FFF;
45317         default:
45318           return false;
45319       }
45320     }
45321   };
45323   LayoutEngine.prototype.getAvailableFeatures = function getAvailableFeatures(script, language) {
45324     var features = [];
45326     if (this.engine) {
45327       features.push.apply(features, this.engine.getAvailableFeatures(script, language));
45328     }
45330     if (this.font.kern && features.indexOf('kern') === -1) {
45331       features.push('kern');
45332     }
45334     return features;
45335   };
45337   LayoutEngine.prototype.stringsForGlyph = function stringsForGlyph(gid) {
45338     var result = new _Set();
45340     var codePoints = this.font._cmapProcessor.codePointsForGlyph(gid);
45341     for (var _iterator2 = codePoints, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
45342       var _ref2;
45344       if (_isArray2) {
45345         if (_i2 >= _iterator2.length) break;
45346         _ref2 = _iterator2[_i2++];
45347       } else {
45348         _i2 = _iterator2.next();
45349         if (_i2.done) break;
45350         _ref2 = _i2.value;
45351       }
45353       var codePoint = _ref2;
45355       result.add(_String$fromCodePoint(codePoint));
45356     }
45358     if (this.engine && this.engine.stringsForGlyph) {
45359       for (var _iterator3 = this.engine.stringsForGlyph(gid), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
45360         var _ref3;
45362         if (_isArray3) {
45363           if (_i3 >= _iterator3.length) break;
45364           _ref3 = _iterator3[_i3++];
45365         } else {
45366           _i3 = _iterator3.next();
45367           if (_i3.done) break;
45368           _ref3 = _i3.value;
45369         }
45371         var string = _ref3;
45373         result.add(string);
45374       }
45375     }
45377     return _Array$from(result);
45378   };
45380   return LayoutEngine;
45381 }();
45383 var SVG_COMMANDS = {
45384   moveTo: 'M',
45385   lineTo: 'L',
45386   quadraticCurveTo: 'Q',
45387   bezierCurveTo: 'C',
45388   closePath: 'Z'
45392  * Path objects are returned by glyphs and represent the actual
45393  * vector outlines for each glyph in the font. Paths can be converted
45394  * to SVG path data strings, or to functions that can be applied to
45395  * render the path to a graphics context.
45396  */
45398 var Path = function () {
45399   function Path() {
45400     _classCallCheck(this, Path);
45402     this.commands = [];
45403     this._bbox = null;
45404     this._cbox = null;
45405   }
45407   /**
45408    * Compiles the path to a JavaScript function that can be applied with
45409    * a graphics context in order to render the path.
45410    * @return {string}
45411    */
45414   Path.prototype.toFunction = function toFunction() {
45415     var cmds = this.commands.map(function (c) {
45416       return '  ctx.' + c.command + '(' + c.args.join(', ') + ');';
45417     });
45418     return new Function('ctx', cmds.join('\n'));
45419   };
45421   /**
45422    * Converts the path to an SVG path data string
45423    * @return {string}
45424    */
45427   Path.prototype.toSVG = function toSVG() {
45428     var cmds = this.commands.map(function (c) {
45429       var args = c.args.map(function (arg) {
45430         return Math.round(arg * 100) / 100;
45431       });
45432       return '' + SVG_COMMANDS[c.command] + args.join(' ');
45433     });
45435     return cmds.join('');
45436   };
45438   /**
45439    * Gets the "control box" of a path.
45440    * This is like the bounding box, but it includes all points including
45441    * control points of bezier segments and is much faster to compute than
45442    * the real bounding box.
45443    * @type {BBox}
45444    */
45447   /**
45448    * Applies a mapping function to each point in the path.
45449    * @param {function} fn
45450    * @return {Path}
45451    */
45452   Path.prototype.mapPoints = function mapPoints(fn) {
45453     var path = new Path();
45455     for (var _iterator = this.commands, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
45456       var _ref;
45458       if (_isArray) {
45459         if (_i >= _iterator.length) break;
45460         _ref = _iterator[_i++];
45461       } else {
45462         _i = _iterator.next();
45463         if (_i.done) break;
45464         _ref = _i.value;
45465       }
45467       var c = _ref;
45469       var args = [];
45470       for (var _i2 = 0; _i2 < c.args.length; _i2 += 2) {
45471         var _fn = fn(c.args[_i2], c.args[_i2 + 1]),
45472             x = _fn[0],
45473             y = _fn[1];
45475         args.push(x, y);
45476       }
45478       path[c.command].apply(path, args);
45479     }
45481     return path;
45482   };
45484   /**
45485    * Transforms the path by the given matrix.
45486    */
45489   Path.prototype.transform = function transform(m0, m1, m2, m3, m4, m5) {
45490     return this.mapPoints(function (x, y) {
45491       x = m0 * x + m2 * y + m4;
45492       y = m1 * x + m3 * y + m5;
45493       return [x, y];
45494     });
45495   };
45497   /**
45498    * Translates the path by the given offset.
45499    */
45502   Path.prototype.translate = function translate(x, y) {
45503     return this.transform(1, 0, 0, 1, x, y);
45504   };
45506   /**
45507    * Rotates the path by the given angle (in radians).
45508    */
45511   Path.prototype.rotate = function rotate(angle) {
45512     var cos = Math.cos(angle);
45513     var sin = Math.sin(angle);
45514     return this.transform(cos, sin, -sin, cos, 0, 0);
45515   };
45517   /**
45518    * Scales the path.
45519    */
45522   Path.prototype.scale = function scale(scaleX) {
45523     var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX;
45525     return this.transform(scaleX, 0, 0, scaleY, 0, 0);
45526   };
45528   _createClass(Path, [{
45529     key: 'cbox',
45530     get: function get() {
45531       if (!this._cbox) {
45532         var cbox = new BBox();
45533         for (var _iterator2 = this.commands, _isArray2 = Array.isArray(_iterator2), _i3 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
45534           var _ref2;
45536           if (_isArray2) {
45537             if (_i3 >= _iterator2.length) break;
45538             _ref2 = _iterator2[_i3++];
45539           } else {
45540             _i3 = _iterator2.next();
45541             if (_i3.done) break;
45542             _ref2 = _i3.value;
45543           }
45545           var command = _ref2;
45547           for (var _i4 = 0; _i4 < command.args.length; _i4 += 2) {
45548             cbox.addPoint(command.args[_i4], command.args[_i4 + 1]);
45549           }
45550         }
45552         this._cbox = _Object$freeze(cbox);
45553       }
45555       return this._cbox;
45556     }
45558     /**
45559      * Gets the exact bounding box of the path by evaluating curve segments.
45560      * Slower to compute than the control box, but more accurate.
45561      * @type {BBox}
45562      */
45564   }, {
45565     key: 'bbox',
45566     get: function get() {
45567       if (this._bbox) {
45568         return this._bbox;
45569       }
45571       var bbox = new BBox();
45572       var cx = 0,
45573           cy = 0;
45575       var f = function f(t) {
45576         return Math.pow(1 - t, 3) * p0[i] + 3 * Math.pow(1 - t, 2) * t * p1[i] + 3 * (1 - t) * Math.pow(t, 2) * p2[i] + Math.pow(t, 3) * p3[i];
45577       };
45579       for (var _iterator3 = this.commands, _isArray3 = Array.isArray(_iterator3), _i5 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
45580         var _ref3;
45582         if (_isArray3) {
45583           if (_i5 >= _iterator3.length) break;
45584           _ref3 = _iterator3[_i5++];
45585         } else {
45586           _i5 = _iterator3.next();
45587           if (_i5.done) break;
45588           _ref3 = _i5.value;
45589         }
45591         var c = _ref3;
45593         switch (c.command) {
45594           case 'moveTo':
45595           case 'lineTo':
45596             var _c$args = c.args,
45597                 x = _c$args[0],
45598                 y = _c$args[1];
45600             bbox.addPoint(x, y);
45601             cx = x;
45602             cy = y;
45603             break;
45605           case 'quadraticCurveTo':
45606           case 'bezierCurveTo':
45607             if (c.command === 'quadraticCurveTo') {
45608               // http://fontforge.org/bezier.html
45609               var _c$args2 = c.args,
45610                   qp1x = _c$args2[0],
45611                   qp1y = _c$args2[1],
45612                   p3x = _c$args2[2],
45613                   p3y = _c$args2[3];
45615               var cp1x = cx + 2 / 3 * (qp1x - cx); // CP1 = QP0 + 2/3 * (QP1-QP0)
45616               var cp1y = cy + 2 / 3 * (qp1y - cy);
45617               var cp2x = p3x + 2 / 3 * (qp1x - p3x); // CP2 = QP2 + 2/3 * (QP1-QP2)
45618               var cp2y = p3y + 2 / 3 * (qp1y - p3y);
45619             } else {
45620               var _c$args3 = c.args,
45621                   cp1x = _c$args3[0],
45622                   cp1y = _c$args3[1],
45623                   cp2x = _c$args3[2],
45624                   cp2y = _c$args3[3],
45625                   p3x = _c$args3[4],
45626                   p3y = _c$args3[5];
45627             }
45629             // http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html
45630             bbox.addPoint(p3x, p3y);
45632             var p0 = [cx, cy];
45633             var p1 = [cp1x, cp1y];
45634             var p2 = [cp2x, cp2y];
45635             var p3 = [p3x, p3y];
45637             for (var i = 0; i <= 1; i++) {
45638               var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];
45639               var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];
45640               c = 3 * p1[i] - 3 * p0[i];
45642               if (a === 0) {
45643                 if (b === 0) {
45644                   continue;
45645                 }
45647                 var t = -c / b;
45648                 if (0 < t && t < 1) {
45649                   if (i === 0) {
45650                     bbox.addPoint(f(t), bbox.maxY);
45651                   } else if (i === 1) {
45652                     bbox.addPoint(bbox.maxX, f(t));
45653                   }
45654                 }
45656                 continue;
45657               }
45659               var b2ac = Math.pow(b, 2) - 4 * c * a;
45660               if (b2ac < 0) {
45661                 continue;
45662               }
45664               var t1 = (-b + Math.sqrt(b2ac)) / (2 * a);
45665               if (0 < t1 && t1 < 1) {
45666                 if (i === 0) {
45667                   bbox.addPoint(f(t1), bbox.maxY);
45668                 } else if (i === 1) {
45669                   bbox.addPoint(bbox.maxX, f(t1));
45670                 }
45671               }
45673               var t2 = (-b - Math.sqrt(b2ac)) / (2 * a);
45674               if (0 < t2 && t2 < 1) {
45675                 if (i === 0) {
45676                   bbox.addPoint(f(t2), bbox.maxY);
45677                 } else if (i === 1) {
45678                   bbox.addPoint(bbox.maxX, f(t2));
45679                 }
45680               }
45681             }
45683             cx = p3x;
45684             cy = p3y;
45685             break;
45686         }
45687       }
45689       return this._bbox = _Object$freeze(bbox);
45690     }
45691   }]);
45693   return Path;
45694 }();
45696 var _arr = ['moveTo', 'lineTo', 'quadraticCurveTo', 'bezierCurveTo', 'closePath'];
45698 var _loop = function _loop() {
45699   var command = _arr[_i6];
45700   Path.prototype[command] = function () {
45701     for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
45702       args[_key] = arguments[_key];
45703     }
45705     this._bbox = this._cbox = null;
45706     this.commands.push({
45707       command: command,
45708       args: args
45709     });
45711     return this;
45712   };
45715 for (var _i6 = 0; _i6 < _arr.length; _i6++) {
45716   _loop();
45719 var StandardNames = ['.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter', 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];
45721 var _class$8;
45722 function _applyDecoratedDescriptor$4(target, property, decorators, descriptor, context) {
45723   var desc = {};
45724   Object['ke' + 'ys'](descriptor).forEach(function (key) {
45725     desc[key] = descriptor[key];
45726   });
45727   desc.enumerable = !!desc.enumerable;
45728   desc.configurable = !!desc.configurable;
45730   if ('value' in desc || desc.initializer) {
45731     desc.writable = true;
45732   }
45734   desc = decorators.slice().reverse().reduce(function (desc, decorator) {
45735     return decorator(target, property, desc) || desc;
45736   }, desc);
45738   if (context && desc.initializer !== void 0) {
45739     desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
45740     desc.initializer = undefined;
45741   }
45743   if (desc.initializer === void 0) {
45744     Object['define' + 'Property'](target, property, desc);
45745     desc = null;
45746   }
45748   return desc;
45752  * Glyph objects represent a glyph in the font. They have various properties for accessing metrics and
45753  * the actual vector path the glyph represents, and methods for rendering the glyph to a graphics context.
45755  * You do not create glyph objects directly. They are created by various methods on the font object.
45756  * There are several subclasses of the base Glyph class internally that may be returned depending
45757  * on the font format, but they all inherit from this class.
45758  */
45759 var Glyph = (_class$8 = function () {
45760   function Glyph(id, codePoints, font) {
45761     _classCallCheck(this, Glyph);
45763     /**
45764      * The glyph id in the font
45765      * @type {number}
45766      */
45767     this.id = id;
45769     /**
45770      * An array of unicode code points that are represented by this glyph.
45771      * There can be multiple code points in the case of ligatures and other glyphs
45772      * that represent multiple visual characters.
45773      * @type {number[]}
45774      */
45775     this.codePoints = codePoints;
45776     this._font = font;
45778     // TODO: get this info from GDEF if available
45779     this.isMark = this.codePoints.every(unicode.isMark);
45780     this.isLigature = this.codePoints.length > 1;
45781   }
45783   Glyph.prototype._getPath = function _getPath() {
45784     return new Path();
45785   };
45787   Glyph.prototype._getCBox = function _getCBox() {
45788     return this.path.cbox;
45789   };
45791   Glyph.prototype._getBBox = function _getBBox() {
45792     return this.path.bbox;
45793   };
45795   Glyph.prototype._getTableMetrics = function _getTableMetrics(table) {
45796     if (this.id < table.metrics.length) {
45797       return table.metrics.get(this.id);
45798     }
45800     var metric = table.metrics.get(table.metrics.length - 1);
45801     var res = {
45802       advance: metric ? metric.advance : 0,
45803       bearing: table.bearings.get(this.id - table.metrics.length) || 0
45804     };
45806     return res;
45807   };
45809   Glyph.prototype._getMetrics = function _getMetrics(cbox) {
45810     if (this._metrics) {
45811       return this._metrics;
45812     }
45814     var _getTableMetrics2 = this._getTableMetrics(this._font.hmtx),
45815         advanceWidth = _getTableMetrics2.advance,
45816         leftBearing = _getTableMetrics2.bearing;
45818     // For vertical metrics, use vmtx if available, or fall back to global data from OS/2 or hhea
45821     if (this._font.vmtx) {
45822       var _getTableMetrics3 = this._getTableMetrics(this._font.vmtx),
45823           advanceHeight = _getTableMetrics3.advance,
45824           topBearing = _getTableMetrics3.bearing;
45825     } else {
45826       var os2 = void 0;
45827       if (typeof cbox === 'undefined' || cbox === null) {
45828         cbox = this.cbox;
45829       }
45831       if ((os2 = this._font['OS/2']) && os2.version > 0) {
45832         var advanceHeight = Math.abs(os2.typoAscender - os2.typoDescender);
45833         var topBearing = os2.typoAscender - cbox.maxY;
45834       } else {
45835         var hhea = this._font.hhea;
45837         var advanceHeight = Math.abs(hhea.ascent - hhea.descent);
45838         var topBearing = hhea.ascent - cbox.maxY;
45839       }
45840     }
45842     if (this._font._variationProcessor && this._font.HVAR) {
45843       advanceWidth += this._font._variationProcessor.getAdvanceAdjustment(this.id, this._font.HVAR);
45844     }
45846     return this._metrics = { advanceWidth: advanceWidth, advanceHeight: advanceHeight, leftBearing: leftBearing, topBearing: topBearing };
45847   };
45849   /**
45850    * The glyph’s control box.
45851    * This is often the same as the bounding box, but is faster to compute.
45852    * Because of the way bezier curves are defined, some of the control points
45853    * can be outside of the bounding box. Where `bbox` takes this into account,
45854    * `cbox` does not. Thus, cbox is less accurate, but faster to compute.
45855    * See [here](http://www.freetype.org/freetype2/docs/glyphs/glyphs-6.html#section-2)
45856    * for a more detailed description.
45857    *
45858    * @type {BBox}
45859    */
45862   /**
45863    * Returns a path scaled to the given font size.
45864    * @param {number} size
45865    * @return {Path}
45866    */
45867   Glyph.prototype.getScaledPath = function getScaledPath(size) {
45868     var scale = 1 / this._font.unitsPerEm * size;
45869     return this.path.scale(scale);
45870   };
45872   /**
45873    * The glyph's advance width.
45874    * @type {number}
45875    */
45878   Glyph.prototype._getName = function _getName() {
45879     var post = this._font.post;
45881     if (!post) {
45882       return null;
45883     }
45885     switch (post.version) {
45886       case 1:
45887         return StandardNames[this.id];
45889       case 2:
45890         var id = post.glyphNameIndex[this.id];
45891         if (id < StandardNames.length) {
45892           return StandardNames[id];
45893         }
45895         return post.names[id - StandardNames.length];
45897       case 2.5:
45898         return StandardNames[this.id + post.offsets[this.id]];
45900       case 4:
45901         return String.fromCharCode(post.map[this.id]);
45902     }
45903   };
45905   /**
45906    * The glyph's name
45907    * @type {string}
45908    */
45911   /**
45912    * Renders the glyph to the given graphics context, at the specified font size.
45913    * @param {CanvasRenderingContext2d} ctx
45914    * @param {number} size
45915    */
45916   Glyph.prototype.render = function render(ctx, size) {
45917     ctx.save();
45919     var scale = 1 / this._font.head.unitsPerEm * size;
45920     ctx.scale(scale, scale);
45922     var fn = this.path.toFunction();
45923     fn(ctx);
45924     ctx.fill();
45926     ctx.restore();
45927   };
45929   _createClass(Glyph, [{
45930     key: 'cbox',
45931     get: function get() {
45932       return this._getCBox();
45933     }
45935     /**
45936      * The glyph’s bounding box, i.e. the rectangle that encloses the
45937      * glyph outline as tightly as possible.
45938      * @type {BBox}
45939      */
45941   }, {
45942     key: 'bbox',
45943     get: function get() {
45944       return this._getBBox();
45945     }
45947     /**
45948      * A vector Path object representing the glyph outline.
45949      * @type {Path}
45950      */
45952   }, {
45953     key: 'path',
45954     get: function get() {
45955       // Cache the path so we only decode it once
45956       // Decoding is actually performed by subclasses
45957       return this._getPath();
45958     }
45959   }, {
45960     key: 'advanceWidth',
45961     get: function get() {
45962       return this._getMetrics().advanceWidth;
45963     }
45965     /**
45966      * The glyph's advance height.
45967      * @type {number}
45968      */
45970   }, {
45971     key: 'advanceHeight',
45972     get: function get() {
45973       return this._getMetrics().advanceHeight;
45974     }
45975   }, {
45976     key: 'ligatureCaretPositions',
45977     get: function get() {}
45978   }, {
45979     key: 'name',
45980     get: function get() {
45981       return this._getName();
45982     }
45983   }]);
45985   return Glyph;
45986 }(), (_applyDecoratedDescriptor$4(_class$8.prototype, 'cbox', [cache], _Object$getOwnPropertyDescriptor(_class$8.prototype, 'cbox'), _class$8.prototype), _applyDecoratedDescriptor$4(_class$8.prototype, 'bbox', [cache], _Object$getOwnPropertyDescriptor(_class$8.prototype, 'bbox'), _class$8.prototype), _applyDecoratedDescriptor$4(_class$8.prototype, 'path', [cache], _Object$getOwnPropertyDescriptor(_class$8.prototype, 'path'), _class$8.prototype), _applyDecoratedDescriptor$4(_class$8.prototype, 'advanceWidth', [cache], _Object$getOwnPropertyDescriptor(_class$8.prototype, 'advanceWidth'), _class$8.prototype), _applyDecoratedDescriptor$4(_class$8.prototype, 'advanceHeight', [cache], _Object$getOwnPropertyDescriptor(_class$8.prototype, 'advanceHeight'), _class$8.prototype), _applyDecoratedDescriptor$4(_class$8.prototype, 'name', [cache], _Object$getOwnPropertyDescriptor(_class$8.prototype, 'name'), _class$8.prototype)), _class$8);
45988 // The header for both simple and composite glyphs
45989 var GlyfHeader = new r.Struct({
45990   numberOfContours: r.int16, // if negative, this is a composite glyph
45991   xMin: r.int16,
45992   yMin: r.int16,
45993   xMax: r.int16,
45994   yMax: r.int16
45997 // Flags for simple glyphs
45998 var ON_CURVE = 1 << 0;
45999 var X_SHORT_VECTOR = 1 << 1;
46000 var Y_SHORT_VECTOR = 1 << 2;
46001 var REPEAT = 1 << 3;
46002 var SAME_X = 1 << 4;
46003 var SAME_Y = 1 << 5;
46005 // Flags for composite glyphs
46006 var ARG_1_AND_2_ARE_WORDS = 1 << 0;
46007 var WE_HAVE_A_SCALE = 1 << 3;
46008 var MORE_COMPONENTS = 1 << 5;
46009 var WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;
46010 var WE_HAVE_A_TWO_BY_TWO = 1 << 7;
46011 var WE_HAVE_INSTRUCTIONS = 1 << 8;
46012 // Represents a point in a simple glyph
46013 var Point = function () {
46014   function Point(onCurve, endContour) {
46015     var x = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
46016     var y = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
46018     _classCallCheck(this, Point);
46020     this.onCurve = onCurve;
46021     this.endContour = endContour;
46022     this.x = x;
46023     this.y = y;
46024   }
46026   Point.prototype.copy = function copy() {
46027     return new Point(this.onCurve, this.endContour, this.x, this.y);
46028   };
46030   return Point;
46031 }();
46033 // Represents a component in a composite glyph
46035 var Component = function Component(glyphID, dx, dy) {
46036   _classCallCheck(this, Component);
46038   this.glyphID = glyphID;
46039   this.dx = dx;
46040   this.dy = dy;
46041   this.pos = 0;
46042   this.scaleX = this.scaleY = 1;
46043   this.scale01 = this.scale10 = 0;
46047  * Represents a TrueType glyph.
46048  */
46051 var TTFGlyph = function (_Glyph) {
46052   _inherits(TTFGlyph, _Glyph);
46054   function TTFGlyph() {
46055     _classCallCheck(this, TTFGlyph);
46057     return _possibleConstructorReturn(this, _Glyph.apply(this, arguments));
46058   }
46060   // Parses just the glyph header and returns the bounding box
46061   TTFGlyph.prototype._getCBox = function _getCBox(internal) {
46062     // We need to decode the glyph if variation processing is requested,
46063     // so it's easier just to recompute the path's cbox after decoding.
46064     if (this._font._variationProcessor && !internal) {
46065       return this.path.cbox;
46066     }
46068     var stream = this._font._getTableStream('glyf');
46069     stream.pos += this._font.loca.offsets[this.id];
46070     var glyph = GlyfHeader.decode(stream);
46072     var cbox = new BBox(glyph.xMin, glyph.yMin, glyph.xMax, glyph.yMax);
46073     return _Object$freeze(cbox);
46074   };
46076   // Parses a single glyph coordinate
46079   TTFGlyph.prototype._parseGlyphCoord = function _parseGlyphCoord(stream, prev, short, same) {
46080     if (short) {
46081       var val = stream.readUInt8();
46082       if (!same) {
46083         val = -val;
46084       }
46086       val += prev;
46087     } else {
46088       if (same) {
46089         var val = prev;
46090       } else {
46091         var val = prev + stream.readInt16BE();
46092       }
46093     }
46095     return val;
46096   };
46098   // Decodes the glyph data into points for simple glyphs,
46099   // or components for composite glyphs
46102   TTFGlyph.prototype._decode = function _decode() {
46103     var glyfPos = this._font.loca.offsets[this.id];
46104     var nextPos = this._font.loca.offsets[this.id + 1];
46106     // Nothing to do if there is no data for this glyph
46107     if (glyfPos === nextPos) {
46108       return null;
46109     }
46111     var stream = this._font._getTableStream('glyf');
46112     stream.pos += glyfPos;
46113     var startPos = stream.pos;
46115     var glyph = GlyfHeader.decode(stream);
46117     if (glyph.numberOfContours > 0) {
46118       this._decodeSimple(glyph, stream);
46119     } else if (glyph.numberOfContours < 0) {
46120       this._decodeComposite(glyph, stream, startPos);
46121     }
46123     return glyph;
46124   };
46126   TTFGlyph.prototype._decodeSimple = function _decodeSimple(glyph, stream) {
46127     // this is a simple glyph
46128     glyph.points = [];
46130     var endPtsOfContours = new r.Array(r.uint16, glyph.numberOfContours).decode(stream);
46131     glyph.instructions = new r.Array(r.uint8, r.uint16).decode(stream);
46133     var flags = [];
46134     var numCoords = endPtsOfContours[endPtsOfContours.length - 1] + 1;
46136     while (flags.length < numCoords) {
46137       var flag = stream.readUInt8();
46138       flags.push(flag);
46140       // check for repeat flag
46141       if (flag & REPEAT) {
46142         var count = stream.readUInt8();
46143         for (var j = 0; j < count; j++) {
46144           flags.push(flag);
46145         }
46146       }
46147     }
46149     for (var i = 0; i < flags.length; i++) {
46150       var flag = flags[i];
46151       var point = new Point(!!(flag & ON_CURVE), endPtsOfContours.indexOf(i) >= 0, 0, 0);
46152       glyph.points.push(point);
46153     }
46155     var px = 0;
46156     for (var i = 0; i < flags.length; i++) {
46157       var flag = flags[i];
46158       glyph.points[i].x = px = this._parseGlyphCoord(stream, px, flag & X_SHORT_VECTOR, flag & SAME_X);
46159     }
46161     var py = 0;
46162     for (var i = 0; i < flags.length; i++) {
46163       var flag = flags[i];
46164       glyph.points[i].y = py = this._parseGlyphCoord(stream, py, flag & Y_SHORT_VECTOR, flag & SAME_Y);
46165     }
46167     if (this._font._variationProcessor) {
46168       var points = glyph.points.slice();
46169       points.push.apply(points, this._getPhantomPoints(glyph));
46171       this._font._variationProcessor.transformPoints(this.id, points);
46172       glyph.phantomPoints = points.slice(-4);
46173     }
46175     return;
46176   };
46178   TTFGlyph.prototype._decodeComposite = function _decodeComposite(glyph, stream) {
46179     var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
46181     // this is a composite glyph
46182     glyph.components = [];
46183     var haveInstructions = false;
46184     var flags = MORE_COMPONENTS;
46186     while (flags & MORE_COMPONENTS) {
46187       flags = stream.readUInt16BE();
46188       var gPos = stream.pos - offset;
46189       var glyphID = stream.readUInt16BE();
46190       if (!haveInstructions) {
46191         haveInstructions = (flags & WE_HAVE_INSTRUCTIONS) !== 0;
46192       }
46194       if (flags & ARG_1_AND_2_ARE_WORDS) {
46195         var dx = stream.readInt16BE();
46196         var dy = stream.readInt16BE();
46197       } else {
46198         var dx = stream.readInt8();
46199         var dy = stream.readInt8();
46200       }
46202       var component = new Component(glyphID, dx, dy);
46203       component.pos = gPos;
46205       if (flags & WE_HAVE_A_SCALE) {
46206         // fixed number with 14 bits of fraction
46207         component.scaleX = component.scaleY = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824;
46208       } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {
46209         component.scaleX = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824;
46210         component.scaleY = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824;
46211       } else if (flags & WE_HAVE_A_TWO_BY_TWO) {
46212         component.scaleX = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824;
46213         component.scale01 = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824;
46214         component.scale10 = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824;
46215         component.scaleY = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824;
46216       }
46218       glyph.components.push(component);
46219     }
46221     if (this._font._variationProcessor) {
46222       var points = [];
46223       for (var j = 0; j < glyph.components.length; j++) {
46224         var component = glyph.components[j];
46225         points.push(new Point(true, true, component.dx, component.dy));
46226       }
46228       points.push.apply(points, this._getPhantomPoints(glyph));
46230       this._font._variationProcessor.transformPoints(this.id, points);
46231       glyph.phantomPoints = points.splice(-4, 4);
46233       for (var i = 0; i < points.length; i++) {
46234         var point = points[i];
46235         glyph.components[i].dx = point.x;
46236         glyph.components[i].dy = point.y;
46237       }
46238     }
46240     return haveInstructions;
46241   };
46243   TTFGlyph.prototype._getPhantomPoints = function _getPhantomPoints(glyph) {
46244     var cbox = this._getCBox(true);
46245     if (this._metrics == null) {
46246       this._metrics = Glyph.prototype._getMetrics.call(this, cbox);
46247     }
46249     var _metrics = this._metrics,
46250         advanceWidth = _metrics.advanceWidth,
46251         advanceHeight = _metrics.advanceHeight,
46252         leftBearing = _metrics.leftBearing,
46253         topBearing = _metrics.topBearing;
46256     return [new Point(false, true, glyph.xMin - leftBearing, 0), new Point(false, true, glyph.xMin - leftBearing + advanceWidth, 0), new Point(false, true, 0, glyph.yMax + topBearing), new Point(false, true, 0, glyph.yMax + topBearing + advanceHeight)];
46257   };
46259   // Decodes font data, resolves composite glyphs, and returns an array of contours
46262   TTFGlyph.prototype._getContours = function _getContours() {
46263     var glyph = this._decode();
46264     if (!glyph) {
46265       return [];
46266     }
46268     var points = [];
46270     if (glyph.numberOfContours < 0) {
46271       // resolve composite glyphs
46272       for (var _iterator = glyph.components, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
46273         var _ref;
46275         if (_isArray) {
46276           if (_i >= _iterator.length) break;
46277           _ref = _iterator[_i++];
46278         } else {
46279           _i = _iterator.next();
46280           if (_i.done) break;
46281           _ref = _i.value;
46282         }
46284         var component = _ref;
46286         var _contours = this._font.getGlyph(component.glyphID)._getContours();
46287         for (var i = 0; i < _contours.length; i++) {
46288           var contour = _contours[i];
46289           for (var j = 0; j < contour.length; j++) {
46290             var _point = contour[j];
46291             var x = _point.x * component.scaleX + _point.y * component.scale01 + component.dx;
46292             var y = _point.y * component.scaleY + _point.x * component.scale10 + component.dy;
46293             points.push(new Point(_point.onCurve, _point.endContour, x, y));
46294           }
46295         }
46296       }
46297     } else {
46298       points = glyph.points || [];
46299     }
46301     // Recompute and cache metrics if we performed variation processing, and don't have an HVAR table
46302     if (glyph.phantomPoints && !this._font.directory.tables.HVAR) {
46303       this._metrics.advanceWidth = glyph.phantomPoints[1].x - glyph.phantomPoints[0].x;
46304       this._metrics.advanceHeight = glyph.phantomPoints[3].y - glyph.phantomPoints[2].y;
46305       this._metrics.leftBearing = glyph.xMin - glyph.phantomPoints[0].x;
46306       this._metrics.topBearing = glyph.phantomPoints[2].y - glyph.yMax;
46307     }
46309     var contours = [];
46310     var cur = [];
46311     for (var k = 0; k < points.length; k++) {
46312       var point = points[k];
46313       cur.push(point);
46314       if (point.endContour) {
46315         contours.push(cur);
46316         cur = [];
46317       }
46318     }
46320     return contours;
46321   };
46323   TTFGlyph.prototype._getMetrics = function _getMetrics() {
46324     if (this._metrics) {
46325       return this._metrics;
46326     }
46328     var cbox = this._getCBox(true);
46329     _Glyph.prototype._getMetrics.call(this, cbox);
46331     if (this._font._variationProcessor && !this._font.HVAR) {
46332       // No HVAR table, decode the glyph. This triggers recomputation of metrics.
46333       this.path;
46334     }
46336     return this._metrics;
46337   };
46339   // Converts contours to a Path object that can be rendered
46342   TTFGlyph.prototype._getPath = function _getPath() {
46343     var contours = this._getContours();
46344     var path = new Path();
46346     for (var i = 0; i < contours.length; i++) {
46347       var contour = contours[i];
46348       var firstPt = contour[0];
46349       var lastPt = contour[contour.length - 1];
46350       var start = 0;
46352       if (firstPt.onCurve) {
46353         // The first point will be consumed by the moveTo command, so skip in the loop
46354         var curvePt = null;
46355         start = 1;
46356       } else {
46357         if (lastPt.onCurve) {
46358           // Start at the last point if the first point is off curve and the last point is on curve
46359           firstPt = lastPt;
46360         } else {
46361           // Start at the middle if both the first and last points are off curve
46362           firstPt = new Point(false, false, (firstPt.x + lastPt.x) / 2, (firstPt.y + lastPt.y) / 2);
46363         }
46365         var curvePt = firstPt;
46366       }
46368       path.moveTo(firstPt.x, firstPt.y);
46370       for (var j = start; j < contour.length; j++) {
46371         var pt = contour[j];
46372         var prevPt = j === 0 ? firstPt : contour[j - 1];
46374         if (prevPt.onCurve && pt.onCurve) {
46375           path.lineTo(pt.x, pt.y);
46376         } else if (prevPt.onCurve && !pt.onCurve) {
46377           var curvePt = pt;
46378         } else if (!prevPt.onCurve && !pt.onCurve) {
46379           var midX = (prevPt.x + pt.x) / 2;
46380           var midY = (prevPt.y + pt.y) / 2;
46381           path.quadraticCurveTo(prevPt.x, prevPt.y, midX, midY);
46382           var curvePt = pt;
46383         } else if (!prevPt.onCurve && pt.onCurve) {
46384           path.quadraticCurveTo(curvePt.x, curvePt.y, pt.x, pt.y);
46385           var curvePt = null;
46386         } else {
46387           throw new Error("Unknown TTF path state");
46388         }
46389       }
46391       // Connect the first and last points
46392       if (curvePt) {
46393         path.quadraticCurveTo(curvePt.x, curvePt.y, firstPt.x, firstPt.y);
46394       }
46396       path.closePath();
46397     }
46399     return path;
46400   };
46402   return TTFGlyph;
46403 }(Glyph);
46406  * Represents an OpenType PostScript glyph, in the Compact Font Format.
46407  */
46409 var CFFGlyph = function (_Glyph) {
46410   _inherits(CFFGlyph, _Glyph);
46412   function CFFGlyph() {
46413     _classCallCheck(this, CFFGlyph);
46415     return _possibleConstructorReturn(this, _Glyph.apply(this, arguments));
46416   }
46418   CFFGlyph.prototype._getName = function _getName() {
46419     if (this._font.CFF2) {
46420       return _Glyph.prototype._getName.call(this);
46421     }
46423     return this._font['CFF '].getGlyphName(this.id);
46424   };
46426   CFFGlyph.prototype.bias = function bias(s) {
46427     if (s.length < 1240) {
46428       return 107;
46429     } else if (s.length < 33900) {
46430       return 1131;
46431     } else {
46432       return 32768;
46433     }
46434   };
46436   CFFGlyph.prototype._getPath = function _getPath() {
46437     var stream = this._font.stream;
46438     var pos = stream.pos;
46441     var cff = this._font.CFF2 || this._font['CFF '];
46442     var str = cff.topDict.CharStrings[this.id];
46443     var end = str.offset + str.length;
46444     stream.pos = str.offset;
46446     var path = new Path();
46447     var stack = [];
46448     var trans = [];
46450     var width = null;
46451     var nStems = 0;
46452     var x = 0,
46453         y = 0;
46454     var usedGsubrs = void 0;
46455     var usedSubrs = void 0;
46456     var open = false;
46458     this._usedGsubrs = usedGsubrs = {};
46459     this._usedSubrs = usedSubrs = {};
46461     var gsubrs = cff.globalSubrIndex || [];
46462     var gsubrsBias = this.bias(gsubrs);
46464     var privateDict = cff.privateDictForGlyph(this.id);
46465     var subrs = privateDict.Subrs || [];
46466     var subrsBias = this.bias(subrs);
46468     var vstore = cff.topDict.vstore && cff.topDict.vstore.itemVariationStore;
46469     var vsindex = privateDict.vsindex;
46470     var variationProcessor = this._font._variationProcessor;
46472     function checkWidth() {
46473       if (width == null) {
46474         width = stack.shift() + privateDict.nominalWidthX;
46475       }
46476     }
46478     function parseStems() {
46479       if (stack.length % 2 !== 0) {
46480         checkWidth();
46481       }
46483       nStems += stack.length >> 1;
46484       return stack.length = 0;
46485     }
46487     function moveTo(x, y) {
46488       if (open) {
46489         path.closePath();
46490       }
46492       path.moveTo(x, y);
46493       open = true;
46494     }
46496     var parse = function parse() {
46497       while (stream.pos < end) {
46498         var op = stream.readUInt8();
46499         if (op < 32) {
46500           switch (op) {
46501             case 1: // hstem
46502             case 3: // vstem
46503             case 18: // hstemhm
46504             case 23:
46505               // vstemhm
46506               parseStems();
46507               break;
46509             case 4:
46510               // vmoveto
46511               if (stack.length > 1) {
46512                 checkWidth();
46513               }
46515               y += stack.shift();
46516               moveTo(x, y);
46517               break;
46519             case 5:
46520               // rlineto
46521               while (stack.length >= 2) {
46522                 x += stack.shift();
46523                 y += stack.shift();
46524                 path.lineTo(x, y);
46525               }
46526               break;
46528             case 6: // hlineto
46529             case 7:
46530               // vlineto
46531               var phase = op === 6;
46532               while (stack.length >= 1) {
46533                 if (phase) {
46534                   x += stack.shift();
46535                 } else {
46536                   y += stack.shift();
46537                 }
46539                 path.lineTo(x, y);
46540                 phase = !phase;
46541               }
46542               break;
46544             case 8:
46545               // rrcurveto
46546               while (stack.length > 0) {
46547                 var c1x = x + stack.shift();
46548                 var c1y = y + stack.shift();
46549                 var c2x = c1x + stack.shift();
46550                 var c2y = c1y + stack.shift();
46551                 x = c2x + stack.shift();
46552                 y = c2y + stack.shift();
46553                 path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);
46554               }
46555               break;
46557             case 10:
46558               // callsubr
46559               var index = stack.pop() + subrsBias;
46560               var subr = subrs[index];
46561               if (subr) {
46562                 usedSubrs[index] = true;
46563                 var p = stream.pos;
46564                 var e = end;
46565                 stream.pos = subr.offset;
46566                 end = subr.offset + subr.length;
46567                 parse();
46568                 stream.pos = p;
46569                 end = e;
46570               }
46571               break;
46573             case 11:
46574               // return
46575               if (cff.version >= 2) {
46576                 break;
46577               }
46578               return;
46580             case 14:
46581               // endchar
46582               if (cff.version >= 2) {
46583                 break;
46584               }
46586               if (stack.length > 0) {
46587                 checkWidth();
46588               }
46590               if (open) {
46591                 path.closePath();
46592                 open = false;
46593               }
46594               break;
46596             case 15:
46597               {
46598                 // vsindex
46599                 if (cff.version < 2) {
46600                   throw new Error('vsindex operator not supported in CFF v1');
46601                 }
46603                 vsindex = stack.pop();
46604                 break;
46605               }
46607             case 16:
46608               {
46609                 // blend
46610                 if (cff.version < 2) {
46611                   throw new Error('blend operator not supported in CFF v1');
46612                 }
46614                 if (!variationProcessor) {
46615                   throw new Error('blend operator in non-variation font');
46616                 }
46618                 var blendVector = variationProcessor.getBlendVector(vstore, vsindex);
46619                 var numBlends = stack.pop();
46620                 var numOperands = numBlends * blendVector.length;
46621                 var delta = stack.length - numOperands;
46622                 var base = delta - numBlends;
46624                 for (var i = 0; i < numBlends; i++) {
46625                   var sum = stack[base + i];
46626                   for (var j = 0; j < blendVector.length; j++) {
46627                     sum += blendVector[j] * stack[delta++];
46628                   }
46630                   stack[base + i] = sum;
46631                 }
46633                 while (numOperands--) {
46634                   stack.pop();
46635                 }
46637                 break;
46638               }
46640             case 19: // hintmask
46641             case 20:
46642               // cntrmask
46643               parseStems();
46644               stream.pos += nStems + 7 >> 3;
46645               break;
46647             case 21:
46648               // rmoveto
46649               if (stack.length > 2) {
46650                 checkWidth();
46651               }
46653               x += stack.shift();
46654               y += stack.shift();
46655               moveTo(x, y);
46656               break;
46658             case 22:
46659               // hmoveto
46660               if (stack.length > 1) {
46661                 checkWidth();
46662               }
46664               x += stack.shift();
46665               moveTo(x, y);
46666               break;
46668             case 24:
46669               // rcurveline
46670               while (stack.length >= 8) {
46671                 var c1x = x + stack.shift();
46672                 var c1y = y + stack.shift();
46673                 var c2x = c1x + stack.shift();
46674                 var c2y = c1y + stack.shift();
46675                 x = c2x + stack.shift();
46676                 y = c2y + stack.shift();
46677                 path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);
46678               }
46680               x += stack.shift();
46681               y += stack.shift();
46682               path.lineTo(x, y);
46683               break;
46685             case 25:
46686               // rlinecurve
46687               while (stack.length >= 8) {
46688                 x += stack.shift();
46689                 y += stack.shift();
46690                 path.lineTo(x, y);
46691               }
46693               var c1x = x + stack.shift();
46694               var c1y = y + stack.shift();
46695               var c2x = c1x + stack.shift();
46696               var c2y = c1y + stack.shift();
46697               x = c2x + stack.shift();
46698               y = c2y + stack.shift();
46699               path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);
46700               break;
46702             case 26:
46703               // vvcurveto
46704               if (stack.length % 2) {
46705                 x += stack.shift();
46706               }
46708               while (stack.length >= 4) {
46709                 c1x = x;
46710                 c1y = y + stack.shift();
46711                 c2x = c1x + stack.shift();
46712                 c2y = c1y + stack.shift();
46713                 x = c2x;
46714                 y = c2y + stack.shift();
46715                 path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);
46716               }
46717               break;
46719             case 27:
46720               // hhcurveto
46721               if (stack.length % 2) {
46722                 y += stack.shift();
46723               }
46725               while (stack.length >= 4) {
46726                 c1x = x + stack.shift();
46727                 c1y = y;
46728                 c2x = c1x + stack.shift();
46729                 c2y = c1y + stack.shift();
46730                 x = c2x + stack.shift();
46731                 y = c2y;
46732                 path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);
46733               }
46734               break;
46736             case 28:
46737               // shortint
46738               stack.push(stream.readInt16BE());
46739               break;
46741             case 29:
46742               // callgsubr
46743               index = stack.pop() + gsubrsBias;
46744               subr = gsubrs[index];
46745               if (subr) {
46746                 usedGsubrs[index] = true;
46747                 var p = stream.pos;
46748                 var e = end;
46749                 stream.pos = subr.offset;
46750                 end = subr.offset + subr.length;
46751                 parse();
46752                 stream.pos = p;
46753                 end = e;
46754               }
46755               break;
46757             case 30: // vhcurveto
46758             case 31:
46759               // hvcurveto
46760               phase = op === 31;
46761               while (stack.length >= 4) {
46762                 if (phase) {
46763                   c1x = x + stack.shift();
46764                   c1y = y;
46765                   c2x = c1x + stack.shift();
46766                   c2y = c1y + stack.shift();
46767                   y = c2y + stack.shift();
46768                   x = c2x + (stack.length === 1 ? stack.shift() : 0);
46769                 } else {
46770                   c1x = x;
46771                   c1y = y + stack.shift();
46772                   c2x = c1x + stack.shift();
46773                   c2y = c1y + stack.shift();
46774                   x = c2x + stack.shift();
46775                   y = c2y + (stack.length === 1 ? stack.shift() : 0);
46776                 }
46778                 path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);
46779                 phase = !phase;
46780               }
46781               break;
46783             case 12:
46784               op = stream.readUInt8();
46785               switch (op) {
46786                 case 3:
46787                   // and
46788                   var a = stack.pop();
46789                   var b = stack.pop();
46790                   stack.push(a && b ? 1 : 0);
46791                   break;
46793                 case 4:
46794                   // or
46795                   a = stack.pop();
46796                   b = stack.pop();
46797                   stack.push(a || b ? 1 : 0);
46798                   break;
46800                 case 5:
46801                   // not
46802                   a = stack.pop();
46803                   stack.push(a ? 0 : 1);
46804                   break;
46806                 case 9:
46807                   // abs
46808                   a = stack.pop();
46809                   stack.push(Math.abs(a));
46810                   break;
46812                 case 10:
46813                   // add
46814                   a = stack.pop();
46815                   b = stack.pop();
46816                   stack.push(a + b);
46817                   break;
46819                 case 11:
46820                   // sub
46821                   a = stack.pop();
46822                   b = stack.pop();
46823                   stack.push(a - b);
46824                   break;
46826                 case 12:
46827                   // div
46828                   a = stack.pop();
46829                   b = stack.pop();
46830                   stack.push(a / b);
46831                   break;
46833                 case 14:
46834                   // neg
46835                   a = stack.pop();
46836                   stack.push(-a);
46837                   break;
46839                 case 15:
46840                   // eq
46841                   a = stack.pop();
46842                   b = stack.pop();
46843                   stack.push(a === b ? 1 : 0);
46844                   break;
46846                 case 18:
46847                   // drop
46848                   stack.pop();
46849                   break;
46851                 case 20:
46852                   // put
46853                   var val = stack.pop();
46854                   var idx = stack.pop();
46855                   trans[idx] = val;
46856                   break;
46858                 case 21:
46859                   // get
46860                   idx = stack.pop();
46861                   stack.push(trans[idx] || 0);
46862                   break;
46864                 case 22:
46865                   // ifelse
46866                   var s1 = stack.pop();
46867                   var s2 = stack.pop();
46868                   var v1 = stack.pop();
46869                   var v2 = stack.pop();
46870                   stack.push(v1 <= v2 ? s1 : s2);
46871                   break;
46873                 case 23:
46874                   // random
46875                   stack.push(Math.random());
46876                   break;
46878                 case 24:
46879                   // mul
46880                   a = stack.pop();
46881                   b = stack.pop();
46882                   stack.push(a * b);
46883                   break;
46885                 case 26:
46886                   // sqrt
46887                   a = stack.pop();
46888                   stack.push(Math.sqrt(a));
46889                   break;
46891                 case 27:
46892                   // dup
46893                   a = stack.pop();
46894                   stack.push(a, a);
46895                   break;
46897                 case 28:
46898                   // exch
46899                   a = stack.pop();
46900                   b = stack.pop();
46901                   stack.push(b, a);
46902                   break;
46904                 case 29:
46905                   // index
46906                   idx = stack.pop();
46907                   if (idx < 0) {
46908                     idx = 0;
46909                   } else if (idx > stack.length - 1) {
46910                     idx = stack.length - 1;
46911                   }
46913                   stack.push(stack[idx]);
46914                   break;
46916                 case 30:
46917                   // roll
46918                   var n = stack.pop();
46919                   var _j = stack.pop();
46921                   if (_j >= 0) {
46922                     while (_j > 0) {
46923                       var t = stack[n - 1];
46924                       for (var _i = n - 2; _i >= 0; _i--) {
46925                         stack[_i + 1] = stack[_i];
46926                       }
46928                       stack[0] = t;
46929                       _j--;
46930                     }
46931                   } else {
46932                     while (_j < 0) {
46933                       var t = stack[0];
46934                       for (var _i2 = 0; _i2 <= n; _i2++) {
46935                         stack[_i2] = stack[_i2 + 1];
46936                       }
46938                       stack[n - 1] = t;
46939                       _j++;
46940                     }
46941                   }
46942                   break;
46944                 case 34:
46945                   // hflex
46946                   c1x = x + stack.shift();
46947                   c1y = y;
46948                   c2x = c1x + stack.shift();
46949                   c2y = c1y + stack.shift();
46950                   var c3x = c2x + stack.shift();
46951                   var c3y = c2y;
46952                   var c4x = c3x + stack.shift();
46953                   var c4y = c3y;
46954                   var c5x = c4x + stack.shift();
46955                   var c5y = c4y;
46956                   var c6x = c5x + stack.shift();
46957                   var c6y = c5y;
46958                   x = c6x;
46959                   y = c6y;
46961                   path.bezierCurveTo(c1x, c1y, c2x, c2y, c3x, c3y);
46962                   path.bezierCurveTo(c4x, c4y, c5x, c5y, c6x, c6y);
46963                   break;
46965                 case 35:
46966                   // flex
46967                   var pts = [];
46969                   for (var _i3 = 0; _i3 <= 5; _i3++) {
46970                     x += stack.shift();
46971                     y += stack.shift();
46972                     pts.push(x, y);
46973                   }
46975                   path.bezierCurveTo.apply(path, pts.slice(0, 6));
46976                   path.bezierCurveTo.apply(path, pts.slice(6));
46977                   stack.shift(); // fd
46978                   break;
46980                 case 36:
46981                   // hflex1
46982                   c1x = x + stack.shift();
46983                   c1y = y + stack.shift();
46984                   c2x = c1x + stack.shift();
46985                   c2y = c1y + stack.shift();
46986                   c3x = c2x + stack.shift();
46987                   c3y = c2y;
46988                   c4x = c3x + stack.shift();
46989                   c4y = c3y;
46990                   c5x = c4x + stack.shift();
46991                   c5y = c4y + stack.shift();
46992                   c6x = c5x + stack.shift();
46993                   c6y = c5y;
46994                   x = c6x;
46995                   y = c6y;
46997                   path.bezierCurveTo(c1x, c1y, c2x, c2y, c3x, c3y);
46998                   path.bezierCurveTo(c4x, c4y, c5x, c5y, c6x, c6y);
46999                   break;
47001                 case 37:
47002                   // flex1
47003                   var startx = x;
47004                   var starty = y;
47006                   pts = [];
47007                   for (var _i4 = 0; _i4 <= 4; _i4++) {
47008                     x += stack.shift();
47009                     y += stack.shift();
47010                     pts.push(x, y);
47011                   }
47013                   if (Math.abs(x - startx) > Math.abs(y - starty)) {
47014                     // horizontal
47015                     x += stack.shift();
47016                     y = starty;
47017                   } else {
47018                     x = startx;
47019                     y += stack.shift();
47020                   }
47022                   pts.push(x, y);
47023                   path.bezierCurveTo.apply(path, pts.slice(0, 6));
47024                   path.bezierCurveTo.apply(path, pts.slice(6));
47025                   break;
47027                 default:
47028                   throw new Error('Unknown op: 12 ' + op);
47029               }
47030               break;
47032             default:
47033               throw new Error('Unknown op: ' + op);
47034           }
47035         } else if (op < 247) {
47036           stack.push(op - 139);
47037         } else if (op < 251) {
47038           var b1 = stream.readUInt8();
47039           stack.push((op - 247) * 256 + b1 + 108);
47040         } else if (op < 255) {
47041           var b1 = stream.readUInt8();
47042           stack.push(-(op - 251) * 256 - b1 - 108);
47043         } else {
47044           stack.push(stream.readInt32BE() / 65536);
47045         }
47046       }
47047     };
47049     parse();
47051     if (open) {
47052       path.closePath();
47053     }
47055     return path;
47056   };
47058   return CFFGlyph;
47059 }(Glyph);
47061 var SBIXImage = new r.Struct({
47062   originX: r.uint16,
47063   originY: r.uint16,
47064   type: new r.String(4),
47065   data: new r.Buffer(function (t) {
47066     return t.parent.buflen - t._currentOffset;
47067   })
47071  * Represents a color (e.g. emoji) glyph in Apple's SBIX format.
47072  */
47074 var SBIXGlyph = function (_TTFGlyph) {
47075   _inherits(SBIXGlyph, _TTFGlyph);
47077   function SBIXGlyph() {
47078     _classCallCheck(this, SBIXGlyph);
47080     return _possibleConstructorReturn(this, _TTFGlyph.apply(this, arguments));
47081   }
47083   /**
47084    * Returns an object representing a glyph image at the given point size.
47085    * The object has a data property with a Buffer containing the actual image data,
47086    * along with the image type, and origin.
47087    *
47088    * @param {number} size
47089    * @return {object}
47090    */
47091   SBIXGlyph.prototype.getImageForSize = function getImageForSize(size) {
47092     for (var i = 0; i < this._font.sbix.imageTables.length; i++) {
47093       var table = this._font.sbix.imageTables[i];
47094       if (table.ppem >= size) {
47095         break;
47096       }
47097     }
47099     var offsets = table.imageOffsets;
47100     var start = offsets[this.id];
47101     var end = offsets[this.id + 1];
47103     if (start === end) {
47104       return null;
47105     }
47107     this._font.stream.pos = start;
47108     return SBIXImage.decode(this._font.stream, { buflen: end - start });
47109   };
47111   SBIXGlyph.prototype.render = function render(ctx, size) {
47112     var img = this.getImageForSize(size);
47113     if (img != null) {
47114       var scale = size / this._font.unitsPerEm;
47115       ctx.image(img.data, { height: size, x: img.originX, y: (this.bbox.minY - img.originY) * scale });
47116     }
47118     if (this._font.sbix.flags.renderOutlines) {
47119       _TTFGlyph.prototype.render.call(this, ctx, size);
47120     }
47121   };
47123   return SBIXGlyph;
47124 }(TTFGlyph);
47126 var COLRLayer = function COLRLayer(glyph, color) {
47127   _classCallCheck(this, COLRLayer);
47129   this.glyph = glyph;
47130   this.color = color;
47134  * Represents a color (e.g. emoji) glyph in Microsoft's COLR format.
47135  * Each glyph in this format contain a list of colored layers, each
47136  * of which  is another vector glyph.
47137  */
47140 var COLRGlyph = function (_Glyph) {
47141   _inherits(COLRGlyph, _Glyph);
47143   function COLRGlyph() {
47144     _classCallCheck(this, COLRGlyph);
47146     return _possibleConstructorReturn(this, _Glyph.apply(this, arguments));
47147   }
47149   COLRGlyph.prototype._getBBox = function _getBBox() {
47150     var bbox = new BBox();
47151     for (var i = 0; i < this.layers.length; i++) {
47152       var layer = this.layers[i];
47153       var b = layer.glyph.bbox;
47154       bbox.addPoint(b.minX, b.minY);
47155       bbox.addPoint(b.maxX, b.maxY);
47156     }
47158     return bbox;
47159   };
47161   /**
47162    * Returns an array of objects containing the glyph and color for
47163    * each layer in the composite color glyph.
47164    * @type {object[]}
47165    */
47168   COLRGlyph.prototype.render = function render(ctx, size) {
47169     for (var _iterator = this.layers, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
47170       var _ref;
47172       if (_isArray) {
47173         if (_i >= _iterator.length) break;
47174         _ref = _iterator[_i++];
47175       } else {
47176         _i = _iterator.next();
47177         if (_i.done) break;
47178         _ref = _i.value;
47179       }
47181       var _ref2 = _ref,
47182           glyph = _ref2.glyph,
47183           color = _ref2.color;
47185       ctx.fillColor([color.red, color.green, color.blue], color.alpha / 255 * 100);
47186       glyph.render(ctx, size);
47187     }
47189     return;
47190   };
47192   _createClass(COLRGlyph, [{
47193     key: 'layers',
47194     get: function get() {
47195       var cpal = this._font.CPAL;
47196       var colr = this._font.COLR;
47197       var low = 0;
47198       var high = colr.baseGlyphRecord.length - 1;
47200       while (low <= high) {
47201         var mid = low + high >> 1;
47202         var rec = colr.baseGlyphRecord[mid];
47204         if (this.id < rec.gid) {
47205           high = mid - 1;
47206         } else if (this.id > rec.gid) {
47207           low = mid + 1;
47208         } else {
47209           var baseLayer = rec;
47210           break;
47211         }
47212       }
47214       // if base glyph not found in COLR table,
47215       // default to normal glyph from glyf or CFF
47216       if (baseLayer == null) {
47217         var g = this._font._getBaseGlyph(this.id);
47218         var color = {
47219           red: 0,
47220           green: 0,
47221           blue: 0,
47222           alpha: 255
47223         };
47225         return [new COLRLayer(g, color)];
47226       }
47228       // otherwise, return an array of all the layers
47229       var layers = [];
47230       for (var i = baseLayer.firstLayerIndex; i < baseLayer.firstLayerIndex + baseLayer.numLayers; i++) {
47231         var rec = colr.layerRecords[i];
47232         var color = cpal.colorRecords[rec.paletteIndex];
47233         var g = this._font._getBaseGlyph(rec.gid);
47234         layers.push(new COLRLayer(g, color));
47235       }
47237       return layers;
47238     }
47239   }]);
47241   return COLRGlyph;
47242 }(Glyph);
47244 var TUPLES_SHARE_POINT_NUMBERS = 0x8000;
47245 var TUPLE_COUNT_MASK = 0x0fff;
47246 var EMBEDDED_TUPLE_COORD = 0x8000;
47247 var INTERMEDIATE_TUPLE = 0x4000;
47248 var PRIVATE_POINT_NUMBERS = 0x2000;
47249 var TUPLE_INDEX_MASK = 0x0fff;
47250 var POINTS_ARE_WORDS = 0x80;
47251 var POINT_RUN_COUNT_MASK = 0x7f;
47252 var DELTAS_ARE_ZERO = 0x80;
47253 var DELTAS_ARE_WORDS = 0x40;
47254 var DELTA_RUN_COUNT_MASK = 0x3f;
47257  * This class is transforms TrueType glyphs according to the data from
47258  * the Apple Advanced Typography variation tables (fvar, gvar, and avar).
47259  * These tables allow infinite adjustments to glyph weight, width, slant,
47260  * and optical size without the designer needing to specify every exact style.
47262  * Apple's documentation for these tables is not great, so thanks to the
47263  * Freetype project for figuring much of this out.
47265  * @private
47266  */
47268 var GlyphVariationProcessor = function () {
47269   function GlyphVariationProcessor(font, coords) {
47270     _classCallCheck(this, GlyphVariationProcessor);
47272     this.font = font;
47273     this.normalizedCoords = this.normalizeCoords(coords);
47274     this.blendVectors = new _Map();
47275   }
47277   GlyphVariationProcessor.prototype.normalizeCoords = function normalizeCoords(coords) {
47278     // the default mapping is linear along each axis, in two segments:
47279     // from the minValue to defaultValue, and from defaultValue to maxValue.
47280     var normalized = [];
47281     for (var i = 0; i < this.font.fvar.axis.length; i++) {
47282       var axis = this.font.fvar.axis[i];
47283       if (coords[i] < axis.defaultValue) {
47284         normalized.push((coords[i] - axis.defaultValue + _Number$EPSILON) / (axis.defaultValue - axis.minValue + _Number$EPSILON));
47285       } else {
47286         normalized.push((coords[i] - axis.defaultValue + _Number$EPSILON) / (axis.maxValue - axis.defaultValue + _Number$EPSILON));
47287       }
47288     }
47290     // if there is an avar table, the normalized value is calculated
47291     // by interpolating between the two nearest mapped values.
47292     if (this.font.avar) {
47293       for (var i = 0; i < this.font.avar.segment.length; i++) {
47294         var segment = this.font.avar.segment[i];
47295         for (var j = 0; j < segment.correspondence.length; j++) {
47296           var pair = segment.correspondence[j];
47297           if (j >= 1 && normalized[i] < pair.fromCoord) {
47298             var prev = segment.correspondence[j - 1];
47299             normalized[i] = ((normalized[i] - prev.fromCoord) * (pair.toCoord - prev.toCoord) + _Number$EPSILON) / (pair.fromCoord - prev.fromCoord + _Number$EPSILON) + prev.toCoord;
47301             break;
47302           }
47303         }
47304       }
47305     }
47307     return normalized;
47308   };
47310   GlyphVariationProcessor.prototype.transformPoints = function transformPoints(gid, glyphPoints) {
47311     if (!this.font.fvar || !this.font.gvar) {
47312       return;
47313     }
47315     var gvar = this.font.gvar;
47317     if (gid >= gvar.glyphCount) {
47318       return;
47319     }
47321     var offset = gvar.offsets[gid];
47322     if (offset === gvar.offsets[gid + 1]) {
47323       return;
47324     }
47326     // Read the gvar data for this glyph
47327     var stream = this.font.stream;
47329     stream.pos = offset;
47330     if (stream.pos >= stream.length) {
47331       return;
47332     }
47334     var tupleCount = stream.readUInt16BE();
47335     var offsetToData = offset + stream.readUInt16BE();
47337     if (tupleCount & TUPLES_SHARE_POINT_NUMBERS) {
47338       var here = stream.pos;
47339       stream.pos = offsetToData;
47340       var sharedPoints = this.decodePoints();
47341       offsetToData = stream.pos;
47342       stream.pos = here;
47343     }
47345     var origPoints = glyphPoints.map(function (pt) {
47346       return pt.copy();
47347     });
47349     tupleCount &= TUPLE_COUNT_MASK;
47350     for (var i = 0; i < tupleCount; i++) {
47351       var tupleDataSize = stream.readUInt16BE();
47352       var tupleIndex = stream.readUInt16BE();
47354       if (tupleIndex & EMBEDDED_TUPLE_COORD) {
47355         var tupleCoords = [];
47356         for (var a = 0; a < gvar.axisCount; a++) {
47357           tupleCoords.push(stream.readInt16BE() / 16384);
47358         }
47359       } else {
47360         if ((tupleIndex & TUPLE_INDEX_MASK) >= gvar.globalCoordCount) {
47361           throw new Error('Invalid gvar table');
47362         }
47364         var tupleCoords = gvar.globalCoords[tupleIndex & TUPLE_INDEX_MASK];
47365       }
47367       if (tupleIndex & INTERMEDIATE_TUPLE) {
47368         var startCoords = [];
47369         for (var _a = 0; _a < gvar.axisCount; _a++) {
47370           startCoords.push(stream.readInt16BE() / 16384);
47371         }
47373         var endCoords = [];
47374         for (var _a2 = 0; _a2 < gvar.axisCount; _a2++) {
47375           endCoords.push(stream.readInt16BE() / 16384);
47376         }
47377       }
47379       // Get the factor at which to apply this tuple
47380       var factor = this.tupleFactor(tupleIndex, tupleCoords, startCoords, endCoords);
47381       if (factor === 0) {
47382         offsetToData += tupleDataSize;
47383         continue;
47384       }
47386       var here = stream.pos;
47387       stream.pos = offsetToData;
47389       if (tupleIndex & PRIVATE_POINT_NUMBERS) {
47390         var points = this.decodePoints();
47391       } else {
47392         var points = sharedPoints;
47393       }
47395       // points.length = 0 means there are deltas for all points
47396       var nPoints = points.length === 0 ? glyphPoints.length : points.length;
47397       var xDeltas = this.decodeDeltas(nPoints);
47398       var yDeltas = this.decodeDeltas(nPoints);
47400       if (points.length === 0) {
47401         // all points
47402         for (var _i = 0; _i < glyphPoints.length; _i++) {
47403           var point = glyphPoints[_i];
47404           point.x += Math.round(xDeltas[_i] * factor);
47405           point.y += Math.round(yDeltas[_i] * factor);
47406         }
47407       } else {
47408         var outPoints = origPoints.map(function (pt) {
47409           return pt.copy();
47410         });
47411         var hasDelta = glyphPoints.map(function () {
47412           return false;
47413         });
47415         for (var _i2 = 0; _i2 < points.length; _i2++) {
47416           var idx = points[_i2];
47417           if (idx < glyphPoints.length) {
47418             var _point = outPoints[idx];
47419             hasDelta[idx] = true;
47421             _point.x += Math.round(xDeltas[_i2] * factor);
47422             _point.y += Math.round(yDeltas[_i2] * factor);
47423           }
47424         }
47426         this.interpolateMissingDeltas(outPoints, origPoints, hasDelta);
47428         for (var _i3 = 0; _i3 < glyphPoints.length; _i3++) {
47429           var deltaX = outPoints[_i3].x - origPoints[_i3].x;
47430           var deltaY = outPoints[_i3].y - origPoints[_i3].y;
47432           glyphPoints[_i3].x += deltaX;
47433           glyphPoints[_i3].y += deltaY;
47434         }
47435       }
47437       offsetToData += tupleDataSize;
47438       stream.pos = here;
47439     }
47440   };
47442   GlyphVariationProcessor.prototype.decodePoints = function decodePoints() {
47443     var stream = this.font.stream;
47444     var count = stream.readUInt8();
47446     if (count & POINTS_ARE_WORDS) {
47447       count = (count & POINT_RUN_COUNT_MASK) << 8 | stream.readUInt8();
47448     }
47450     var points = new Uint16Array(count);
47451     var i = 0;
47452     var point = 0;
47453     while (i < count) {
47454       var run = stream.readUInt8();
47455       var runCount = (run & POINT_RUN_COUNT_MASK) + 1;
47456       var fn = run & POINTS_ARE_WORDS ? stream.readUInt16 : stream.readUInt8;
47458       for (var j = 0; j < runCount && i < count; j++) {
47459         point += fn.call(stream);
47460         points[i++] = point;
47461       }
47462     }
47464     return points;
47465   };
47467   GlyphVariationProcessor.prototype.decodeDeltas = function decodeDeltas(count) {
47468     var stream = this.font.stream;
47469     var i = 0;
47470     var deltas = new Int16Array(count);
47472     while (i < count) {
47473       var run = stream.readUInt8();
47474       var runCount = (run & DELTA_RUN_COUNT_MASK) + 1;
47476       if (run & DELTAS_ARE_ZERO) {
47477         i += runCount;
47478       } else {
47479         var fn = run & DELTAS_ARE_WORDS ? stream.readInt16BE : stream.readInt8;
47480         for (var j = 0; j < runCount && i < count; j++) {
47481           deltas[i++] = fn.call(stream);
47482         }
47483       }
47484     }
47486     return deltas;
47487   };
47489   GlyphVariationProcessor.prototype.tupleFactor = function tupleFactor(tupleIndex, tupleCoords, startCoords, endCoords) {
47490     var normalized = this.normalizedCoords;
47491     var gvar = this.font.gvar;
47493     var factor = 1;
47495     for (var i = 0; i < gvar.axisCount; i++) {
47496       if (tupleCoords[i] === 0) {
47497         continue;
47498       }
47500       if (normalized[i] === 0) {
47501         return 0;
47502       }
47504       if ((tupleIndex & INTERMEDIATE_TUPLE) === 0) {
47505         if (normalized[i] < Math.min(0, tupleCoords[i]) || normalized[i] > Math.max(0, tupleCoords[i])) {
47506           return 0;
47507         }
47509         factor = (factor * normalized[i] + _Number$EPSILON) / (tupleCoords[i] + _Number$EPSILON);
47510       } else {
47511         if (normalized[i] < startCoords[i] || normalized[i] > endCoords[i]) {
47512           return 0;
47513         } else if (normalized[i] < tupleCoords[i]) {
47514           factor = factor * (normalized[i] - startCoords[i] + _Number$EPSILON) / (tupleCoords[i] - startCoords[i] + _Number$EPSILON);
47515         } else {
47516           factor = factor * (endCoords[i] - normalized[i] + _Number$EPSILON) / (endCoords[i] - tupleCoords[i] + _Number$EPSILON);
47517         }
47518       }
47519     }
47521     return factor;
47522   };
47524   // Interpolates points without delta values.
47525   // Needed for the Ø and Q glyphs in Skia.
47526   // Algorithm from Freetype.
47529   GlyphVariationProcessor.prototype.interpolateMissingDeltas = function interpolateMissingDeltas(points, inPoints, hasDelta) {
47530     if (points.length === 0) {
47531       return;
47532     }
47534     var point = 0;
47535     while (point < points.length) {
47536       var firstPoint = point;
47538       // find the end point of the contour
47539       var endPoint = point;
47540       var pt = points[endPoint];
47541       while (!pt.endContour) {
47542         pt = points[++endPoint];
47543       }
47545       // find the first point that has a delta
47546       while (point <= endPoint && !hasDelta[point]) {
47547         point++;
47548       }
47550       if (point > endPoint) {
47551         continue;
47552       }
47554       var firstDelta = point;
47555       var curDelta = point;
47556       point++;
47558       while (point <= endPoint) {
47559         // find the next point with a delta, and interpolate intermediate points
47560         if (hasDelta[point]) {
47561           this.deltaInterpolate(curDelta + 1, point - 1, curDelta, point, inPoints, points);
47562           curDelta = point;
47563         }
47565         point++;
47566       }
47568       // shift contour if we only have a single delta
47569       if (curDelta === firstDelta) {
47570         this.deltaShift(firstPoint, endPoint, curDelta, inPoints, points);
47571       } else {
47572         // otherwise, handle the remaining points at the end and beginning of the contour
47573         this.deltaInterpolate(curDelta + 1, endPoint, curDelta, firstDelta, inPoints, points);
47575         if (firstDelta > 0) {
47576           this.deltaInterpolate(firstPoint, firstDelta - 1, curDelta, firstDelta, inPoints, points);
47577         }
47578       }
47580       point = endPoint + 1;
47581     }
47582   };
47584   GlyphVariationProcessor.prototype.deltaInterpolate = function deltaInterpolate(p1, p2, ref1, ref2, inPoints, outPoints) {
47585     if (p1 > p2) {
47586       return;
47587     }
47589     var iterable = ['x', 'y'];
47590     for (var i = 0; i < iterable.length; i++) {
47591       var k = iterable[i];
47592       if (inPoints[ref1][k] > inPoints[ref2][k]) {
47593         var p = ref1;
47594         ref1 = ref2;
47595         ref2 = p;
47596       }
47598       var in1 = inPoints[ref1][k];
47599       var in2 = inPoints[ref2][k];
47600       var out1 = outPoints[ref1][k];
47601       var out2 = outPoints[ref2][k];
47603       // If the reference points have the same coordinate but different
47604       // delta, inferred delta is zero.  Otherwise interpolate.
47605       if (in1 !== in2 || out1 === out2) {
47606         var scale = in1 === in2 ? 0 : (out2 - out1) / (in2 - in1);
47608         for (var _p = p1; _p <= p2; _p++) {
47609           var out = inPoints[_p][k];
47611           if (out <= in1) {
47612             out += out1 - in1;
47613           } else if (out >= in2) {
47614             out += out2 - in2;
47615           } else {
47616             out = out1 + (out - in1) * scale;
47617           }
47619           outPoints[_p][k] = out;
47620         }
47621       }
47622     }
47623   };
47625   GlyphVariationProcessor.prototype.deltaShift = function deltaShift(p1, p2, ref, inPoints, outPoints) {
47626     var deltaX = outPoints[ref].x - inPoints[ref].x;
47627     var deltaY = outPoints[ref].y - inPoints[ref].y;
47629     if (deltaX === 0 && deltaY === 0) {
47630       return;
47631     }
47633     for (var p = p1; p <= p2; p++) {
47634       if (p !== ref) {
47635         outPoints[p].x += deltaX;
47636         outPoints[p].y += deltaY;
47637       }
47638     }
47639   };
47641   GlyphVariationProcessor.prototype.getAdvanceAdjustment = function getAdvanceAdjustment(gid, table) {
47642     var outerIndex = void 0,
47643         innerIndex = void 0;
47645     if (table.advanceWidthMapping) {
47646       var idx = gid;
47647       if (idx >= table.advanceWidthMapping.mapCount) {
47648         idx = table.advanceWidthMapping.mapCount - 1;
47649       }
47651       var entryFormat = table.advanceWidthMapping.entryFormat;
47652       var _table$advanceWidthMa = table.advanceWidthMapping.mapData[idx];
47653       outerIndex = _table$advanceWidthMa.outerIndex;
47654       innerIndex = _table$advanceWidthMa.innerIndex;
47655     } else {
47656       outerIndex = 0;
47657       innerIndex = gid;
47658     }
47660     return this.getDelta(table.itemVariationStore, outerIndex, innerIndex);
47661   };
47663   // See pseudo code from `Font Variations Overview'
47664   // in the OpenType specification.
47667   GlyphVariationProcessor.prototype.getDelta = function getDelta(itemStore, outerIndex, innerIndex) {
47668     if (outerIndex >= itemStore.itemVariationData.length) {
47669       return 0;
47670     }
47672     var varData = itemStore.itemVariationData[outerIndex];
47673     if (innerIndex >= varData.deltaSets.length) {
47674       return 0;
47675     }
47677     var deltaSet = varData.deltaSets[innerIndex];
47678     var blendVector = this.getBlendVector(itemStore, outerIndex);
47679     var netAdjustment = 0;
47681     for (var master = 0; master < varData.regionIndexCount; master++) {
47682       netAdjustment += deltaSet.deltas[master] * blendVector[master];
47683     }
47685     return netAdjustment;
47686   };
47688   GlyphVariationProcessor.prototype.getBlendVector = function getBlendVector(itemStore, outerIndex) {
47689     var varData = itemStore.itemVariationData[outerIndex];
47690     if (this.blendVectors.has(varData)) {
47691       return this.blendVectors.get(varData);
47692     }
47694     var normalizedCoords = this.normalizedCoords;
47695     var blendVector = [];
47697     // outer loop steps through master designs to be blended
47698     for (var master = 0; master < varData.regionIndexCount; master++) {
47699       var scalar = 1;
47700       var regionIndex = varData.regionIndexes[master];
47701       var axes = itemStore.variationRegionList.variationRegions[regionIndex];
47703       // inner loop steps through axes in this region
47704       for (var j = 0; j < axes.length; j++) {
47705         var axis = axes[j];
47706         var axisScalar = void 0;
47708         // compute the scalar contribution of this axis
47709         // ignore invalid ranges
47710         if (axis.startCoord > axis.peakCoord || axis.peakCoord > axis.endCoord) {
47711           axisScalar = 1;
47712         } else if (axis.startCoord < 0 && axis.endCoord > 0 && axis.peakCoord !== 0) {
47713           axisScalar = 1;
47715           // peak of 0 means ignore this axis
47716         } else if (axis.peakCoord === 0) {
47717           axisScalar = 1;
47719           // ignore this region if coords are out of range
47720         } else if (normalizedCoords[j] < axis.startCoord || normalizedCoords[j] > axis.endCoord) {
47721           axisScalar = 0;
47723           // calculate a proportional factor
47724         } else {
47725           if (normalizedCoords[j] === axis.peakCoord) {
47726             axisScalar = 1;
47727           } else if (normalizedCoords[j] < axis.peakCoord) {
47728             axisScalar = (normalizedCoords[j] - axis.startCoord + _Number$EPSILON) / (axis.peakCoord - axis.startCoord + _Number$EPSILON);
47729           } else {
47730             axisScalar = (axis.endCoord - normalizedCoords[j] + _Number$EPSILON) / (axis.endCoord - axis.peakCoord + _Number$EPSILON);
47731           }
47732         }
47734         // take product of all the axis scalars
47735         scalar *= axisScalar;
47736       }
47738       blendVector[master] = scalar;
47739     }
47741     this.blendVectors.set(varData, blendVector);
47742     return blendVector;
47743   };
47745   return GlyphVariationProcessor;
47746 }();
47748 var Subset = function () {
47749   function Subset(font) {
47750     _classCallCheck(this, Subset);
47752     this.font = font;
47753     this.glyphs = [];
47754     this.mapping = {};
47756     // always include the missing glyph
47757     this.includeGlyph(0);
47758   }
47760   Subset.prototype.includeGlyph = function includeGlyph(glyph) {
47761     if ((typeof glyph === 'undefined' ? 'undefined' : _typeof(glyph)) === 'object') {
47762       glyph = glyph.id;
47763     }
47765     if (this.mapping[glyph] == null) {
47766       this.glyphs.push(glyph);
47767       this.mapping[glyph] = this.glyphs.length - 1;
47768     }
47770     return this.mapping[glyph];
47771   };
47773   Subset.prototype.encodeStream = function encodeStream() {
47774     var _this = this;
47776     var s = new r.EncodeStream();
47778     process.nextTick(function () {
47779       _this.encode(s);
47780       return s.end();
47781     });
47783     return s;
47784   };
47786   return Subset;
47787 }();
47789 // Flags for simple glyphs
47790 var ON_CURVE$1 = 1 << 0;
47791 var X_SHORT_VECTOR$1 = 1 << 1;
47792 var Y_SHORT_VECTOR$1 = 1 << 2;
47793 var REPEAT$1 = 1 << 3;
47794 var SAME_X$1 = 1 << 4;
47795 var SAME_Y$1 = 1 << 5;
47797 var Point$1 = function () {
47798   function Point() {
47799     _classCallCheck(this, Point);
47800   }
47802   Point.size = function size(val) {
47803     return val >= 0 && val <= 255 ? 1 : 2;
47804   };
47806   Point.encode = function encode(stream, value) {
47807     if (value >= 0 && value <= 255) {
47808       stream.writeUInt8(value);
47809     } else {
47810       stream.writeInt16BE(value);
47811     }
47812   };
47814   return Point;
47815 }();
47817 var Glyf = new r.Struct({
47818   numberOfContours: r.int16, // if negative, this is a composite glyph
47819   xMin: r.int16,
47820   yMin: r.int16,
47821   xMax: r.int16,
47822   yMax: r.int16,
47823   endPtsOfContours: new r.Array(r.uint16, 'numberOfContours'),
47824   instructions: new r.Array(r.uint8, r.uint16),
47825   flags: new r.Array(r.uint8, 0),
47826   xPoints: new r.Array(Point$1, 0),
47827   yPoints: new r.Array(Point$1, 0)
47831  * Encodes TrueType glyph outlines
47832  */
47834 var TTFGlyphEncoder = function () {
47835   function TTFGlyphEncoder() {
47836     _classCallCheck(this, TTFGlyphEncoder);
47837   }
47839   TTFGlyphEncoder.prototype.encodeSimple = function encodeSimple(path) {
47840     var instructions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
47842     var endPtsOfContours = [];
47843     var xPoints = [];
47844     var yPoints = [];
47845     var flags = [];
47846     var same = 0;
47847     var lastX = 0,
47848         lastY = 0,
47849         lastFlag = 0;
47850     var pointCount = 0;
47852     for (var i = 0; i < path.commands.length; i++) {
47853       var c = path.commands[i];
47855       for (var j = 0; j < c.args.length; j += 2) {
47856         var x = c.args[j];
47857         var y = c.args[j + 1];
47858         var flag = 0;
47860         // If the ending point of a quadratic curve is the midpoint
47861         // between the control point and the control point of the next
47862         // quadratic curve, we can omit the ending point.
47863         if (c.command === 'quadraticCurveTo' && j === 2) {
47864           var next = path.commands[i + 1];
47865           if (next && next.command === 'quadraticCurveTo') {
47866             var midX = (lastX + next.args[0]) / 2;
47867             var midY = (lastY + next.args[1]) / 2;
47869             if (x === midX && y === midY) {
47870               continue;
47871             }
47872           }
47873         }
47875         // All points except control points are on curve.
47876         if (!(c.command === 'quadraticCurveTo' && j === 0)) {
47877           flag |= ON_CURVE$1;
47878         }
47880         flag = this._encodePoint(x, lastX, xPoints, flag, X_SHORT_VECTOR$1, SAME_X$1);
47881         flag = this._encodePoint(y, lastY, yPoints, flag, Y_SHORT_VECTOR$1, SAME_Y$1);
47883         if (flag === lastFlag && same < 255) {
47884           flags[flags.length - 1] |= REPEAT$1;
47885           same++;
47886         } else {
47887           if (same > 0) {
47888             flags.push(same);
47889             same = 0;
47890           }
47892           flags.push(flag);
47893           lastFlag = flag;
47894         }
47896         lastX = x;
47897         lastY = y;
47898         pointCount++;
47899       }
47901       if (c.command === 'closePath') {
47902         endPtsOfContours.push(pointCount - 1);
47903       }
47904     }
47906     // Close the path if the last command didn't already
47907     if (path.commands.length > 1 && path.commands[path.commands.length - 1].command !== 'closePath') {
47908       endPtsOfContours.push(pointCount - 1);
47909     }
47911     var bbox = path.bbox;
47912     var glyf = {
47913       numberOfContours: endPtsOfContours.length,
47914       xMin: bbox.minX,
47915       yMin: bbox.minY,
47916       xMax: bbox.maxX,
47917       yMax: bbox.maxY,
47918       endPtsOfContours: endPtsOfContours,
47919       instructions: instructions,
47920       flags: flags,
47921       xPoints: xPoints,
47922       yPoints: yPoints
47923     };
47925     var size = Glyf.size(glyf);
47926     var tail = 4 - size % 4;
47928     var stream = new r.EncodeStream(size + tail);
47929     Glyf.encode(stream, glyf);
47931     // Align to 4-byte length
47932     if (tail !== 0) {
47933       stream.fill(0, tail);
47934     }
47936     return stream.buffer;
47937   };
47939   TTFGlyphEncoder.prototype._encodePoint = function _encodePoint(value, last, points, flag, shortFlag, sameFlag) {
47940     var diff = value - last;
47942     if (value === last) {
47943       flag |= sameFlag;
47944     } else {
47945       if (-255 <= diff && diff <= 255) {
47946         flag |= shortFlag;
47947         if (diff < 0) {
47948           diff = -diff;
47949         } else {
47950           flag |= sameFlag;
47951         }
47952       }
47954       points.push(diff);
47955     }
47957     return flag;
47958   };
47960   return TTFGlyphEncoder;
47961 }();
47963 var TTFSubset = function (_Subset) {
47964   _inherits(TTFSubset, _Subset);
47966   function TTFSubset(font) {
47967     _classCallCheck(this, TTFSubset);
47969     var _this = _possibleConstructorReturn(this, _Subset.call(this, font));
47971     _this.glyphEncoder = new TTFGlyphEncoder();
47972     return _this;
47973   }
47975   TTFSubset.prototype._addGlyph = function _addGlyph(gid) {
47976     var glyph = this.font.getGlyph(gid);
47977     var glyf = glyph._decode();
47979     // get the offset to the glyph from the loca table
47980     var curOffset = this.font.loca.offsets[gid];
47981     var nextOffset = this.font.loca.offsets[gid + 1];
47983     var stream = this.font._getTableStream('glyf');
47984     stream.pos += curOffset;
47986     var buffer = stream.readBuffer(nextOffset - curOffset);
47988     // if it is a compound glyph, include its components
47989     if (glyf && glyf.numberOfContours < 0) {
47990       buffer = new Buffer(buffer);
47991       for (var _iterator = glyf.components, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
47992         var _ref;
47994         if (_isArray) {
47995           if (_i >= _iterator.length) break;
47996           _ref = _iterator[_i++];
47997         } else {
47998           _i = _iterator.next();
47999           if (_i.done) break;
48000           _ref = _i.value;
48001         }
48003         var component = _ref;
48005         gid = this.includeGlyph(component.glyphID);
48006         buffer.writeUInt16BE(gid, component.pos);
48007       }
48008     } else if (glyf && this.font._variationProcessor) {
48009       // If this is a TrueType variation glyph, re-encode the path
48010       buffer = this.glyphEncoder.encodeSimple(glyph.path, glyf.instructions);
48011     }
48013     this.glyf.push(buffer);
48014     this.loca.offsets.push(this.offset);
48016     this.hmtx.metrics.push({
48017       advance: glyph.advanceWidth,
48018       bearing: glyph._getMetrics().leftBearing
48019     });
48021     this.offset += buffer.length;
48022     return this.glyf.length - 1;
48023   };
48025   TTFSubset.prototype.encode = function encode(stream) {
48026     // tables required by PDF spec:
48027     //   head, hhea, loca, maxp, cvt , prep, glyf, hmtx, fpgm
48028     //
48029     // additional tables required for standalone fonts:
48030     //   name, cmap, OS/2, post
48032     this.glyf = [];
48033     this.offset = 0;
48034     this.loca = {
48035       offsets: []
48036     };
48038     this.hmtx = {
48039       metrics: [],
48040       bearings: []
48041     };
48043     // include all the glyphs
48044     // not using a for loop because we need to support adding more
48045     // glyphs to the array as we go, and CoffeeScript caches the length.
48046     var i = 0;
48047     while (i < this.glyphs.length) {
48048       this._addGlyph(this.glyphs[i++]);
48049     }
48051     var maxp = cloneDeep(this.font.maxp);
48052     maxp.numGlyphs = this.glyf.length;
48054     this.loca.offsets.push(this.offset);
48055     tables.loca.preEncode.call(this.loca);
48057     var head = cloneDeep(this.font.head);
48058     head.indexToLocFormat = this.loca.version;
48060     var hhea = cloneDeep(this.font.hhea);
48061     hhea.numberOfMetrics = this.hmtx.metrics.length;
48063     // map = []
48064     // for index in [0...256]
48065     //     if index < @numGlyphs
48066     //         map[index] = index
48067     //     else
48068     //         map[index] = 0
48069     //
48070     // cmapTable =
48071     //     version: 0
48072     //     length: 262
48073     //     language: 0
48074     //     codeMap: map
48075     //
48076     // cmap =
48077     //     version: 0
48078     //     numSubtables: 1
48079     //     tables: [
48080     //         platformID: 1
48081     //         encodingID: 0
48082     //         table: cmapTable
48083     //     ]
48085     // TODO: subset prep, cvt, fpgm?
48086     Directory.encode(stream, {
48087       tables: {
48088         head: head,
48089         hhea: hhea,
48090         loca: this.loca,
48091         maxp: maxp,
48092         'cvt ': this.font['cvt '],
48093         prep: this.font.prep,
48094         glyf: this.glyf,
48095         hmtx: this.hmtx,
48096         fpgm: this.font.fpgm
48098         // name: clone @font.name
48099         // 'OS/2': clone @font['OS/2']
48100         // post: clone @font.post
48101         // cmap: cmap
48102       }
48103     });
48104   };
48106   return TTFSubset;
48107 }(Subset);
48109 var CFFSubset = function (_Subset) {
48110   _inherits(CFFSubset, _Subset);
48112   function CFFSubset(font) {
48113     _classCallCheck(this, CFFSubset);
48115     var _this = _possibleConstructorReturn(this, _Subset.call(this, font));
48117     _this.cff = _this.font['CFF '];
48118     if (!_this.cff) {
48119       throw new Error('Not a CFF Font');
48120     }
48121     return _this;
48122   }
48124   CFFSubset.prototype.subsetCharstrings = function subsetCharstrings() {
48125     this.charstrings = [];
48126     var gsubrs = {};
48128     for (var _iterator = this.glyphs, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
48129       var _ref;
48131       if (_isArray) {
48132         if (_i >= _iterator.length) break;
48133         _ref = _iterator[_i++];
48134       } else {
48135         _i = _iterator.next();
48136         if (_i.done) break;
48137         _ref = _i.value;
48138       }
48140       var gid = _ref;
48142       this.charstrings.push(this.cff.getCharString(gid));
48144       var glyph = this.font.getGlyph(gid);
48145       var path = glyph.path; // this causes the glyph to be parsed
48147       for (var subr in glyph._usedGsubrs) {
48148         gsubrs[subr] = true;
48149       }
48150     }
48152     this.gsubrs = this.subsetSubrs(this.cff.globalSubrIndex, gsubrs);
48153   };
48155   CFFSubset.prototype.subsetSubrs = function subsetSubrs(subrs, used) {
48156     var res = [];
48157     for (var i = 0; i < subrs.length; i++) {
48158       var subr = subrs[i];
48159       if (used[i]) {
48160         this.cff.stream.pos = subr.offset;
48161         res.push(this.cff.stream.readBuffer(subr.length));
48162       } else {
48163         res.push(new Buffer([11])); // return
48164       }
48165     }
48167     return res;
48168   };
48170   CFFSubset.prototype.subsetFontdict = function subsetFontdict(topDict) {
48171     topDict.FDArray = [];
48172     topDict.FDSelect = {
48173       version: 0,
48174       fds: []
48175     };
48177     var used_fds = {};
48178     var used_subrs = [];
48179     for (var _iterator2 = this.glyphs, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
48180       var _ref2;
48182       if (_isArray2) {
48183         if (_i2 >= _iterator2.length) break;
48184         _ref2 = _iterator2[_i2++];
48185       } else {
48186         _i2 = _iterator2.next();
48187         if (_i2.done) break;
48188         _ref2 = _i2.value;
48189       }
48191       var gid = _ref2;
48193       var fd = this.cff.fdForGlyph(gid);
48194       if (fd == null) {
48195         continue;
48196       }
48198       if (!used_fds[fd]) {
48199         topDict.FDArray.push(_Object$assign({}, this.cff.topDict.FDArray[fd]));
48200         used_subrs.push({});
48201       }
48203       used_fds[fd] = true;
48204       topDict.FDSelect.fds.push(topDict.FDArray.length - 1);
48206       var glyph = this.font.getGlyph(gid);
48207       var path = glyph.path; // this causes the glyph to be parsed
48208       for (var subr in glyph._usedSubrs) {
48209         used_subrs[used_subrs.length - 1][subr] = true;
48210       }
48211     }
48213     for (var i = 0; i < topDict.FDArray.length; i++) {
48214       var dict = topDict.FDArray[i];
48215       delete dict.FontName;
48216       if (dict.Private && dict.Private.Subrs) {
48217         dict.Private = _Object$assign({}, dict.Private);
48218         dict.Private.Subrs = this.subsetSubrs(dict.Private.Subrs, used_subrs[i]);
48219       }
48220     }
48222     return;
48223   };
48225   CFFSubset.prototype.createCIDFontdict = function createCIDFontdict(topDict) {
48226     var used_subrs = {};
48227     for (var _iterator3 = this.glyphs, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
48228       var _ref3;
48230       if (_isArray3) {
48231         if (_i3 >= _iterator3.length) break;
48232         _ref3 = _iterator3[_i3++];
48233       } else {
48234         _i3 = _iterator3.next();
48235         if (_i3.done) break;
48236         _ref3 = _i3.value;
48237       }
48239       var gid = _ref3;
48241       var glyph = this.font.getGlyph(gid);
48242       var path = glyph.path; // this causes the glyph to be parsed
48244       for (var subr in glyph._usedSubrs) {
48245         used_subrs[subr] = true;
48246       }
48247     }
48249     var privateDict = _Object$assign({}, this.cff.topDict.Private);
48250     privateDict.Subrs = this.subsetSubrs(this.cff.topDict.Private.Subrs, used_subrs);
48252     topDict.FDArray = [{ Private: privateDict }];
48253     return topDict.FDSelect = {
48254       version: 3,
48255       nRanges: 1,
48256       ranges: [{ first: 0, fd: 0 }],
48257       sentinel: this.charstrings.length
48258     };
48259   };
48261   CFFSubset.prototype.addString = function addString(string) {
48262     if (!string) {
48263       return null;
48264     }
48266     if (!this.strings) {
48267       this.strings = [];
48268     }
48270     this.strings.push(string);
48271     return standardStrings.length + this.strings.length - 1;
48272   };
48274   CFFSubset.prototype.encode = function encode(stream) {
48275     this.subsetCharstrings();
48277     var charset = {
48278       version: this.charstrings.length > 255 ? 2 : 1,
48279       ranges: [{ first: 1, nLeft: this.charstrings.length - 2 }]
48280     };
48282     var topDict = _Object$assign({}, this.cff.topDict);
48283     topDict.Private = null;
48284     topDict.charset = charset;
48285     topDict.Encoding = null;
48286     topDict.CharStrings = this.charstrings;
48288     var _arr = ['version', 'Notice', 'Copyright', 'FullName', 'FamilyName', 'Weight', 'PostScript', 'BaseFontName', 'FontName'];
48289     for (var _i4 = 0; _i4 < _arr.length; _i4++) {
48290       var key = _arr[_i4];
48291       topDict[key] = this.addString(this.cff.string(topDict[key]));
48292     }
48294     topDict.ROS = [this.addString('Adobe'), this.addString('Identity'), 0];
48295     topDict.CIDCount = this.charstrings.length;
48297     if (this.cff.isCIDFont) {
48298       this.subsetFontdict(topDict);
48299     } else {
48300       this.createCIDFontdict(topDict);
48301     }
48303     var top = {
48304       version: 1,
48305       hdrSize: this.cff.hdrSize,
48306       offSize: this.cff.length,
48307       header: this.cff.header,
48308       nameIndex: [this.cff.postscriptName],
48309       topDictIndex: [topDict],
48310       stringIndex: this.strings,
48311       globalSubrIndex: this.gsubrs
48312     };
48314     CFFTop.encode(stream, top);
48315   };
48317   return CFFSubset;
48318 }(Subset);
48320 var _class;
48321 function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
48322   var desc = {};
48323   Object['ke' + 'ys'](descriptor).forEach(function (key) {
48324     desc[key] = descriptor[key];
48325   });
48326   desc.enumerable = !!desc.enumerable;
48327   desc.configurable = !!desc.configurable;
48329   if ('value' in desc || desc.initializer) {
48330     desc.writable = true;
48331   }
48333   desc = decorators.slice().reverse().reduce(function (desc, decorator) {
48334     return decorator(target, property, desc) || desc;
48335   }, desc);
48337   if (context && desc.initializer !== void 0) {
48338     desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
48339     desc.initializer = undefined;
48340   }
48342   if (desc.initializer === void 0) {
48343     Object['define' + 'Property'](target, property, desc);
48344     desc = null;
48345   }
48347   return desc;
48351  * This is the base class for all SFNT-based font formats in fontkit.
48352  * It supports TrueType, and PostScript glyphs, and several color glyph formats.
48353  */
48354 var TTFFont = (_class = function () {
48355   TTFFont.probe = function probe(buffer) {
48356     var format = buffer.toString('ascii', 0, 4);
48357     return format === 'true' || format === 'OTTO' || format === String.fromCharCode(0, 1, 0, 0);
48358   };
48360   function TTFFont(stream) {
48361     var variationCoords = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
48363     _classCallCheck(this, TTFFont);
48365     this.stream = stream;
48366     this.variationCoords = variationCoords;
48368     this._directoryPos = this.stream.pos;
48369     this._tables = {};
48370     this._glyphs = {};
48371     this._decodeDirectory();
48373     // define properties for each table to lazily parse
48374     for (var tag in this.directory.tables) {
48375       var table = this.directory.tables[tag];
48376       if (tables[tag] && table.length > 0) {
48377         _Object$defineProperty(this, tag, {
48378           get: this._getTable.bind(this, table)
48379         });
48380       }
48381     }
48382   }
48384   TTFFont.prototype._getTable = function _getTable(table) {
48385     if (!(table.tag in this._tables)) {
48386       try {
48387         this._tables[table.tag] = this._decodeTable(table);
48388       } catch (e) {
48389         if (fontkit.logErrors) {
48390           console.error('Error decoding table ' + table.tag);
48391           console.error(e.stack);
48392         }
48393       }
48394     }
48396     return this._tables[table.tag];
48397   };
48399   TTFFont.prototype._getTableStream = function _getTableStream(tag) {
48400     var table = this.directory.tables[tag];
48401     if (table) {
48402       this.stream.pos = table.offset;
48403       return this.stream;
48404     }
48406     return null;
48407   };
48409   TTFFont.prototype._decodeDirectory = function _decodeDirectory() {
48410     return this.directory = Directory.decode(this.stream, { _startOffset: 0 });
48411   };
48413   TTFFont.prototype._decodeTable = function _decodeTable(table) {
48414     var pos = this.stream.pos;
48416     var stream = this._getTableStream(table.tag);
48417     var result = tables[table.tag].decode(stream, this, table.length);
48419     this.stream.pos = pos;
48420     return result;
48421   };
48423   /**
48424    * The unique PostScript name for this font
48425    * @type {string}
48426    */
48429   /**
48430    * Gets a string from the font's `name` table
48431    * `lang` is a BCP-47 language code.
48432    * @return {string}
48433    */
48434   TTFFont.prototype.getName = function getName(key) {
48435     var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';
48437     var record = this.name.records[key];
48438     if (record) {
48439       return record[lang];
48440     }
48442     return null;
48443   };
48445   /**
48446    * The font's full name, e.g. "Helvetica Bold"
48447    * @type {string}
48448    */
48451   /**
48452    * Returns whether there is glyph in the font for the given unicode code point.
48453    *
48454    * @param {number} codePoint
48455    * @return {boolean}
48456    */
48457   TTFFont.prototype.hasGlyphForCodePoint = function hasGlyphForCodePoint(codePoint) {
48458     return !!this._cmapProcessor.lookup(codePoint);
48459   };
48461   /**
48462    * Maps a single unicode code point to a Glyph object.
48463    * Does not perform any advanced substitutions (there is no context to do so).
48464    *
48465    * @param {number} codePoint
48466    * @return {Glyph}
48467    */
48470   TTFFont.prototype.glyphForCodePoint = function glyphForCodePoint(codePoint) {
48471     return this.getGlyph(this._cmapProcessor.lookup(codePoint), [codePoint]);
48472   };
48474   /**
48475    * Returns an array of Glyph objects for the given string.
48476    * This is only a one-to-one mapping from characters to glyphs.
48477    * For most uses, you should use font.layout (described below), which
48478    * provides a much more advanced mapping supporting AAT and OpenType shaping.
48479    *
48480    * @param {string} string
48481    * @return {Glyph[]}
48482    */
48485   TTFFont.prototype.glyphsForString = function glyphsForString(string) {
48486     var glyphs = [];
48487     var len = string.length;
48488     var idx = 0;
48489     var last = -1;
48490     var state = -1;
48492     while (idx <= len) {
48493       var code = 0;
48494       var nextState = 0;
48496       if (idx < len) {
48497         // Decode the next codepoint from UTF 16
48498         code = string.charCodeAt(idx++);
48499         if (0xd800 <= code && code <= 0xdbff && idx < len) {
48500           var next = string.charCodeAt(idx);
48501           if (0xdc00 <= next && next <= 0xdfff) {
48502             idx++;
48503             code = ((code & 0x3ff) << 10) + (next & 0x3ff) + 0x10000;
48504           }
48505         }
48507         // Compute the next state: 1 if the next codepoint is a variation selector, 0 otherwise.
48508         nextState = 0xfe00 <= code && code <= 0xfe0f || 0xe0100 <= code && code <= 0xe01ef ? 1 : 0;
48509       } else {
48510         idx++;
48511       }
48513       if (state === 0 && nextState === 1) {
48514         // Variation selector following normal codepoint.
48515         glyphs.push(this.getGlyph(this._cmapProcessor.lookup(last, code), [last, code]));
48516       } else if (state === 0 && nextState === 0) {
48517         // Normal codepoint following normal codepoint.
48518         glyphs.push(this.glyphForCodePoint(last));
48519       }
48521       last = code;
48522       state = nextState;
48523     }
48525     return glyphs;
48526   };
48528   /**
48529    * Returns a GlyphRun object, which includes an array of Glyphs and GlyphPositions for the given string.
48530    *
48531    * @param {string} string
48532    * @param {string[]} [userFeatures]
48533    * @param {string} [script]
48534    * @param {string} [language]
48535    * @param {string} [direction]
48536    * @return {GlyphRun}
48537    */
48538   TTFFont.prototype.layout = function layout(string, userFeatures, script, language, direction) {
48539     return this._layoutEngine.layout(string, userFeatures, script, language, direction);
48540   };
48542   /**
48543    * Returns an array of strings that map to the given glyph id.
48544    * @param {number} gid - glyph id
48545    */
48548   TTFFont.prototype.stringsForGlyph = function stringsForGlyph(gid) {
48549     return this._layoutEngine.stringsForGlyph(gid);
48550   };
48552   /**
48553    * An array of all [OpenType feature tags](https://www.microsoft.com/typography/otspec/featuretags.htm)
48554    * (or mapped AAT tags) supported by the font.
48555    * The features parameter is an array of OpenType feature tags to be applied in addition to the default set.
48556    * If this is an AAT font, the OpenType feature tags are mapped to AAT features.
48557    *
48558    * @type {string[]}
48559    */
48562   TTFFont.prototype.getAvailableFeatures = function getAvailableFeatures(script, language) {
48563     return this._layoutEngine.getAvailableFeatures(script, language);
48564   };
48566   TTFFont.prototype._getBaseGlyph = function _getBaseGlyph(glyph) {
48567     var characters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
48569     if (!this._glyphs[glyph]) {
48570       if (this.directory.tables.glyf) {
48571         this._glyphs[glyph] = new TTFGlyph(glyph, characters, this);
48572       } else if (this.directory.tables['CFF '] || this.directory.tables.CFF2) {
48573         this._glyphs[glyph] = new CFFGlyph(glyph, characters, this);
48574       }
48575     }
48577     return this._glyphs[glyph] || null;
48578   };
48580   /**
48581    * Returns a glyph object for the given glyph id.
48582    * You can pass the array of code points this glyph represents for
48583    * your use later, and it will be stored in the glyph object.
48584    *
48585    * @param {number} glyph
48586    * @param {number[]} characters
48587    * @return {Glyph}
48588    */
48591   TTFFont.prototype.getGlyph = function getGlyph(glyph) {
48592     var characters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
48594     if (!this._glyphs[glyph]) {
48595       if (this.directory.tables.sbix) {
48596         this._glyphs[glyph] = new SBIXGlyph(glyph, characters, this);
48597       } else if (this.directory.tables.COLR && this.directory.tables.CPAL) {
48598         this._glyphs[glyph] = new COLRGlyph(glyph, characters, this);
48599       } else {
48600         this._getBaseGlyph(glyph, characters);
48601       }
48602     }
48604     return this._glyphs[glyph] || null;
48605   };
48607   /**
48608    * Returns a Subset for this font.
48609    * @return {Subset}
48610    */
48613   TTFFont.prototype.createSubset = function createSubset() {
48614     if (this.directory.tables['CFF ']) {
48615       return new CFFSubset(this);
48616     }
48618     return new TTFSubset(this);
48619   };
48621   /**
48622    * Returns an object describing the available variation axes
48623    * that this font supports. Keys are setting tags, and values
48624    * contain the axis name, range, and default value.
48625    *
48626    * @type {object}
48627    */
48630   /**
48631    * Returns a new font with the given variation settings applied.
48632    * Settings can either be an instance name, or an object containing
48633    * variation tags as specified by the `variationAxes` property.
48634    *
48635    * @param {object} settings
48636    * @return {TTFFont}
48637    */
48638   TTFFont.prototype.getVariation = function getVariation(settings) {
48639     if (!(this.directory.tables.fvar && (this.directory.tables.gvar && this.directory.tables.glyf || this.directory.tables.CFF2))) {
48640       throw new Error('Variations require a font with the fvar, gvar and glyf, or CFF2 tables.');
48641     }
48643     if (typeof settings === 'string') {
48644       settings = this.namedVariations[settings];
48645     }
48647     if ((typeof settings === 'undefined' ? 'undefined' : _typeof(settings)) !== 'object') {
48648       throw new Error('Variation settings must be either a variation name or settings object.');
48649     }
48651     // normalize the coordinates
48652     var coords = this.fvar.axis.map(function (axis, i) {
48653       var axisTag = axis.axisTag.trim();
48654       if (axisTag in settings) {
48655         return Math.max(axis.minValue, Math.min(axis.maxValue, settings[axisTag]));
48656       } else {
48657         return axis.defaultValue;
48658       }
48659     });
48661     var stream = new r.DecodeStream(this.stream.buffer);
48662     stream.pos = this._directoryPos;
48664     var font = new TTFFont(stream, coords);
48665     font._tables = this._tables;
48667     return font;
48668   };
48670   // Standardized format plugin API
48671   TTFFont.prototype.getFont = function getFont(name) {
48672     return this.getVariation(name);
48673   };
48675   _createClass(TTFFont, [{
48676     key: 'postscriptName',
48677     get: function get() {
48678       var name = this.name.records.postscriptName;
48679       if (name) {
48680         var lang = _Object$keys(name)[0];
48681         return name[lang];
48682       }
48684       return null;
48685     }
48686   }, {
48687     key: 'fullName',
48688     get: function get() {
48689       return this.getName('fullName');
48690     }
48692     /**
48693      * The font's family name, e.g. "Helvetica"
48694      * @type {string}
48695      */
48697   }, {
48698     key: 'familyName',
48699     get: function get() {
48700       return this.getName('fontFamily');
48701     }
48703     /**
48704      * The font's sub-family, e.g. "Bold".
48705      * @type {string}
48706      */
48708   }, {
48709     key: 'subfamilyName',
48710     get: function get() {
48711       return this.getName('fontSubfamily');
48712     }
48714     /**
48715      * The font's copyright information
48716      * @type {string}
48717      */
48719   }, {
48720     key: 'copyright',
48721     get: function get() {
48722       return this.getName('copyright');
48723     }
48725     /**
48726      * The font's version number
48727      * @type {string}
48728      */
48730   }, {
48731     key: 'version',
48732     get: function get() {
48733       return this.getName('version');
48734     }
48736     /**
48737      * The font’s [ascender](https://en.wikipedia.org/wiki/Ascender_(typography))
48738      * @type {number}
48739      */
48741   }, {
48742     key: 'ascent',
48743     get: function get() {
48744       return this.hhea.ascent;
48745     }
48747     /**
48748      * The font’s [descender](https://en.wikipedia.org/wiki/Descender)
48749      * @type {number}
48750      */
48752   }, {
48753     key: 'descent',
48754     get: function get() {
48755       return this.hhea.descent;
48756     }
48758     /**
48759      * The amount of space that should be included between lines
48760      * @type {number}
48761      */
48763   }, {
48764     key: 'lineGap',
48765     get: function get() {
48766       return this.hhea.lineGap;
48767     }
48769     /**
48770      * The offset from the normal underline position that should be used
48771      * @type {number}
48772      */
48774   }, {
48775     key: 'underlinePosition',
48776     get: function get() {
48777       return this.post.underlinePosition;
48778     }
48780     /**
48781      * The weight of the underline that should be used
48782      * @type {number}
48783      */
48785   }, {
48786     key: 'underlineThickness',
48787     get: function get() {
48788       return this.post.underlineThickness;
48789     }
48791     /**
48792      * If this is an italic font, the angle the cursor should be drawn at to match the font design
48793      * @type {number}
48794      */
48796   }, {
48797     key: 'italicAngle',
48798     get: function get() {
48799       return this.post.italicAngle;
48800     }
48802     /**
48803      * The height of capital letters above the baseline.
48804      * See [here](https://en.wikipedia.org/wiki/Cap_height) for more details.
48805      * @type {number}
48806      */
48808   }, {
48809     key: 'capHeight',
48810     get: function get() {
48811       var os2 = this['OS/2'];
48812       return os2 ? os2.capHeight : this.ascent;
48813     }
48815     /**
48816      * The height of lower case letters in the font.
48817      * See [here](https://en.wikipedia.org/wiki/X-height) for more details.
48818      * @type {number}
48819      */
48821   }, {
48822     key: 'xHeight',
48823     get: function get() {
48824       var os2 = this['OS/2'];
48825       return os2 ? os2.xHeight : 0;
48826     }
48828     /**
48829      * The number of glyphs in the font.
48830      * @type {number}
48831      */
48833   }, {
48834     key: 'numGlyphs',
48835     get: function get() {
48836       return this.maxp.numGlyphs;
48837     }
48839     /**
48840      * The size of the font’s internal coordinate grid
48841      * @type {number}
48842      */
48844   }, {
48845     key: 'unitsPerEm',
48846     get: function get() {
48847       return this.head.unitsPerEm;
48848     }
48850     /**
48851      * The font’s bounding box, i.e. the box that encloses all glyphs in the font.
48852      * @type {BBox}
48853      */
48855   }, {
48856     key: 'bbox',
48857     get: function get() {
48858       return _Object$freeze(new BBox(this.head.xMin, this.head.yMin, this.head.xMax, this.head.yMax));
48859     }
48860   }, {
48861     key: '_cmapProcessor',
48862     get: function get() {
48863       return new CmapProcessor(this.cmap);
48864     }
48866     /**
48867      * An array of all of the unicode code points supported by the font.
48868      * @type {number[]}
48869      */
48871   }, {
48872     key: 'characterSet',
48873     get: function get() {
48874       return this._cmapProcessor.getCharacterSet();
48875     }
48876   }, {
48877     key: '_layoutEngine',
48878     get: function get() {
48879       return new LayoutEngine(this);
48880     }
48881   }, {
48882     key: 'availableFeatures',
48883     get: function get() {
48884       return this._layoutEngine.getAvailableFeatures();
48885     }
48886   }, {
48887     key: 'variationAxes',
48888     get: function get() {
48889       var res = {};
48890       if (!this.fvar) {
48891         return res;
48892       }
48894       for (var _iterator = this.fvar.axis, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
48895         var _ref;
48897         if (_isArray) {
48898           if (_i >= _iterator.length) break;
48899           _ref = _iterator[_i++];
48900         } else {
48901           _i = _iterator.next();
48902           if (_i.done) break;
48903           _ref = _i.value;
48904         }
48906         var axis = _ref;
48908         res[axis.axisTag.trim()] = {
48909           name: axis.name.en,
48910           min: axis.minValue,
48911           default: axis.defaultValue,
48912           max: axis.maxValue
48913         };
48914       }
48916       return res;
48917     }
48919     /**
48920      * Returns an object describing the named variation instances
48921      * that the font designer has specified. Keys are variation names
48922      * and values are the variation settings for this instance.
48923      *
48924      * @type {object}
48925      */
48927   }, {
48928     key: 'namedVariations',
48929     get: function get() {
48930       var res = {};
48931       if (!this.fvar) {
48932         return res;
48933       }
48935       for (var _iterator2 = this.fvar.instance, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
48936         var _ref2;
48938         if (_isArray2) {
48939           if (_i2 >= _iterator2.length) break;
48940           _ref2 = _iterator2[_i2++];
48941         } else {
48942           _i2 = _iterator2.next();
48943           if (_i2.done) break;
48944           _ref2 = _i2.value;
48945         }
48947         var instance = _ref2;
48949         var settings = {};
48950         for (var i = 0; i < this.fvar.axis.length; i++) {
48951           var axis = this.fvar.axis[i];
48952           settings[axis.axisTag.trim()] = instance.coord[i];
48953         }
48955         res[instance.name.en] = settings;
48956       }
48958       return res;
48959     }
48960   }, {
48961     key: '_variationProcessor',
48962     get: function get() {
48963       if (!this.fvar) {
48964         return null;
48965       }
48967       var variationCoords = this.variationCoords;
48969       // Ignore if no variation coords and not CFF2
48970       if (!variationCoords && !this.CFF2) {
48971         return null;
48972       }
48974       if (!variationCoords) {
48975         variationCoords = this.fvar.axis.map(function (axis) {
48976           return axis.defaultValue;
48977         });
48978       }
48980       return new GlyphVariationProcessor(this, variationCoords);
48981     }
48982   }]);
48984   return TTFFont;
48985 }(), (_applyDecoratedDescriptor(_class.prototype, 'bbox', [cache], _Object$getOwnPropertyDescriptor(_class.prototype, 'bbox'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_cmapProcessor', [cache], _Object$getOwnPropertyDescriptor(_class.prototype, '_cmapProcessor'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'characterSet', [cache], _Object$getOwnPropertyDescriptor(_class.prototype, 'characterSet'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_layoutEngine', [cache], _Object$getOwnPropertyDescriptor(_class.prototype, '_layoutEngine'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'variationAxes', [cache], _Object$getOwnPropertyDescriptor(_class.prototype, 'variationAxes'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'namedVariations', [cache], _Object$getOwnPropertyDescriptor(_class.prototype, 'namedVariations'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_variationProcessor', [cache], _Object$getOwnPropertyDescriptor(_class.prototype, '_variationProcessor'), _class.prototype)), _class);
48987 var WOFFDirectoryEntry = new r.Struct({
48988   tag: new r.String(4),
48989   offset: new r.Pointer(r.uint32, 'void', { type: 'global' }),
48990   compLength: r.uint32,
48991   length: r.uint32,
48992   origChecksum: r.uint32
48995 var WOFFDirectory = new r.Struct({
48996   tag: new r.String(4), // should be 'wOFF'
48997   flavor: r.uint32,
48998   length: r.uint32,
48999   numTables: r.uint16,
49000   reserved: new r.Reserved(r.uint16),
49001   totalSfntSize: r.uint32,
49002   majorVersion: r.uint16,
49003   minorVersion: r.uint16,
49004   metaOffset: r.uint32,
49005   metaLength: r.uint32,
49006   metaOrigLength: r.uint32,
49007   privOffset: r.uint32,
49008   privLength: r.uint32,
49009   tables: new r.Array(WOFFDirectoryEntry, 'numTables')
49012 WOFFDirectory.process = function () {
49013   var tables = {};
49014   for (var _iterator = this.tables, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
49015     var _ref;
49017     if (_isArray) {
49018       if (_i >= _iterator.length) break;
49019       _ref = _iterator[_i++];
49020     } else {
49021       _i = _iterator.next();
49022       if (_i.done) break;
49023       _ref = _i.value;
49024     }
49026     var table = _ref;
49028     tables[table.tag] = table;
49029   }
49031   this.tables = tables;
49034 var WOFFFont = function (_TTFFont) {
49035   _inherits(WOFFFont, _TTFFont);
49037   function WOFFFont() {
49038     _classCallCheck(this, WOFFFont);
49040     return _possibleConstructorReturn(this, _TTFFont.apply(this, arguments));
49041   }
49043   WOFFFont.probe = function probe(buffer) {
49044     return buffer.toString('ascii', 0, 4) === 'wOFF';
49045   };
49047   WOFFFont.prototype._decodeDirectory = function _decodeDirectory() {
49048     this.directory = WOFFDirectory.decode(this.stream, { _startOffset: 0 });
49049   };
49051   WOFFFont.prototype._getTableStream = function _getTableStream(tag) {
49052     var table = this.directory.tables[tag];
49053     if (table) {
49054       this.stream.pos = table.offset;
49056       if (table.compLength < table.length) {
49057         this.stream.pos += 2; // skip deflate header
49058         var outBuffer = new Buffer(table.length);
49059         var buf = inflate(this.stream.readBuffer(table.compLength - 2), outBuffer);
49060         return new r.DecodeStream(buf);
49061       } else {
49062         return this.stream;
49063       }
49064     }
49066     return null;
49067   };
49069   return WOFFFont;
49070 }(TTFFont);
49073  * Represents a TrueType glyph in the WOFF2 format, which compresses glyphs differently.
49074  */
49076 var WOFF2Glyph = function (_TTFGlyph) {
49077   _inherits(WOFF2Glyph, _TTFGlyph);
49079   function WOFF2Glyph() {
49080     _classCallCheck(this, WOFF2Glyph);
49082     return _possibleConstructorReturn(this, _TTFGlyph.apply(this, arguments));
49083   }
49085   WOFF2Glyph.prototype._decode = function _decode() {
49086     // We have to decode in advance (in WOFF2Font), so just return the pre-decoded data.
49087     return this._font._transformedGlyphs[this.id];
49088   };
49090   WOFF2Glyph.prototype._getCBox = function _getCBox() {
49091     return this.path.bbox;
49092   };
49094   return WOFF2Glyph;
49095 }(TTFGlyph);
49097 var Base128 = {
49098   decode: function decode(stream) {
49099     var result = 0;
49100     var iterable = [0, 1, 2, 3, 4];
49101     for (var j = 0; j < iterable.length; j++) {
49102       var i = iterable[j];
49103       var code = stream.readUInt8();
49105       // If any of the top seven bits are set then we're about to overflow.
49106       if (result & 0xe0000000) {
49107         throw new Error('Overflow');
49108       }
49110       result = result << 7 | code & 0x7f;
49111       if ((code & 0x80) === 0) {
49112         return result;
49113       }
49114     }
49116     throw new Error('Bad base 128 number');
49117   }
49120 var knownTags = ['cmap', 'head', 'hhea', 'hmtx', 'maxp', 'name', 'OS/2', 'post', 'cvt ', 'fpgm', 'glyf', 'loca', 'prep', 'CFF ', 'VORG', 'EBDT', 'EBLC', 'gasp', 'hdmx', 'kern', 'LTSH', 'PCLT', 'VDMX', 'vhea', 'vmtx', 'BASE', 'GDEF', 'GPOS', 'GSUB', 'EBSC', 'JSTF', 'MATH', 'CBDT', 'CBLC', 'COLR', 'CPAL', 'SVG ', 'sbix', 'acnt', 'avar', 'bdat', 'bloc', 'bsln', 'cvar', 'fdsc', 'feat', 'fmtx', 'fvar', 'gvar', 'hsty', 'just', 'lcar', 'mort', 'morx', 'opbd', 'prop', 'trak', 'Zapf', 'Silf', 'Glat', 'Gloc', 'Feat', 'Sill'];
49122 var WOFF2DirectoryEntry = new r.Struct({
49123   flags: r.uint8,
49124   customTag: new r.Optional(new r.String(4), function (t) {
49125     return (t.flags & 0x3f) === 0x3f;
49126   }),
49127   tag: function tag(t) {
49128     return t.customTag || knownTags[t.flags & 0x3f];
49129   }, // || (() => { throw new Error(`Bad tag: ${flags & 0x3f}`); })(); },
49130   length: Base128,
49131   transformVersion: function transformVersion(t) {
49132     return t.flags >>> 6 & 0x03;
49133   },
49134   transformed: function transformed(t) {
49135     return t.tag === 'glyf' || t.tag === 'loca' ? t.transformVersion === 0 : t.transformVersion !== 0;
49136   },
49137   transformLength: new r.Optional(Base128, function (t) {
49138     return t.transformed;
49139   })
49142 var WOFF2Directory = new r.Struct({
49143   tag: new r.String(4), // should be 'wOF2'
49144   flavor: r.uint32,
49145   length: r.uint32,
49146   numTables: r.uint16,
49147   reserved: new r.Reserved(r.uint16),
49148   totalSfntSize: r.uint32,
49149   totalCompressedSize: r.uint32,
49150   majorVersion: r.uint16,
49151   minorVersion: r.uint16,
49152   metaOffset: r.uint32,
49153   metaLength: r.uint32,
49154   metaOrigLength: r.uint32,
49155   privOffset: r.uint32,
49156   privLength: r.uint32,
49157   tables: new r.Array(WOFF2DirectoryEntry, 'numTables')
49160 WOFF2Directory.process = function () {
49161   var tables = {};
49162   for (var i = 0; i < this.tables.length; i++) {
49163     var table = this.tables[i];
49164     tables[table.tag] = table;
49165   }
49167   return this.tables = tables;
49171  * Subclass of TTFFont that represents a TTF/OTF font compressed by WOFF2
49172  * See spec here: http://www.w3.org/TR/WOFF2/
49173  */
49175 var WOFF2Font = function (_TTFFont) {
49176   _inherits(WOFF2Font, _TTFFont);
49178   function WOFF2Font() {
49179     _classCallCheck(this, WOFF2Font);
49181     return _possibleConstructorReturn(this, _TTFFont.apply(this, arguments));
49182   }
49184   WOFF2Font.probe = function probe(buffer) {
49185     return buffer.toString('ascii', 0, 4) === 'wOF2';
49186   };
49188   WOFF2Font.prototype._decodeDirectory = function _decodeDirectory() {
49189     this.directory = WOFF2Directory.decode(this.stream);
49190     this._dataPos = this.stream.pos;
49191   };
49193   WOFF2Font.prototype._decompress = function _decompress() {
49194     // decompress data and setup table offsets if we haven't already
49195     if (!this._decompressed) {
49196       this.stream.pos = this._dataPos;
49197       var buffer = this.stream.readBuffer(this.directory.totalCompressedSize);
49199       var decompressedSize = 0;
49200       for (var tag in this.directory.tables) {
49201         var entry = this.directory.tables[tag];
49202         entry.offset = decompressedSize;
49203         decompressedSize += entry.transformLength != null ? entry.transformLength : entry.length;
49204       }
49206       var decompressed = brotli(buffer, decompressedSize);
49207       if (!decompressed) {
49208         throw new Error('Error decoding compressed data in WOFF2');
49209       }
49211       this.stream = new r.DecodeStream(new Buffer(decompressed));
49212       this._decompressed = true;
49213     }
49214   };
49216   WOFF2Font.prototype._decodeTable = function _decodeTable(table) {
49217     this._decompress();
49218     return _TTFFont.prototype._decodeTable.call(this, table);
49219   };
49221   // Override this method to get a glyph and return our
49222   // custom subclass if there is a glyf table.
49225   WOFF2Font.prototype._getBaseGlyph = function _getBaseGlyph(glyph) {
49226     var characters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
49228     if (!this._glyphs[glyph]) {
49229       if (this.directory.tables.glyf && this.directory.tables.glyf.transformed) {
49230         if (!this._transformedGlyphs) {
49231           this._transformGlyfTable();
49232         }
49233         return this._glyphs[glyph] = new WOFF2Glyph(glyph, characters, this);
49234       } else {
49235         return _TTFFont.prototype._getBaseGlyph.call(this, glyph, characters);
49236       }
49237     }
49238   };
49240   WOFF2Font.prototype._transformGlyfTable = function _transformGlyfTable() {
49241     this._decompress();
49242     this.stream.pos = this.directory.tables.glyf.offset;
49243     var table = GlyfTable.decode(this.stream);
49244     var glyphs = [];
49246     for (var index = 0; index < table.numGlyphs; index++) {
49247       var glyph = {};
49248       var nContours = table.nContours.readInt16BE();
49249       glyph.numberOfContours = nContours;
49251       if (nContours > 0) {
49252         // simple glyph
49253         var nPoints = [];
49254         var totalPoints = 0;
49256         for (var i = 0; i < nContours; i++) {
49257           var _r = read255UInt16(table.nPoints);
49258           totalPoints += _r;
49259           nPoints.push(totalPoints);
49260         }
49262         glyph.points = decodeTriplet(table.flags, table.glyphs, totalPoints);
49263         for (var _i = 0; _i < nContours; _i++) {
49264           glyph.points[nPoints[_i] - 1].endContour = true;
49265         }
49267         var instructionSize = read255UInt16(table.glyphs);
49268       } else if (nContours < 0) {
49269         // composite glyph
49270         var haveInstructions = TTFGlyph.prototype._decodeComposite.call({ _font: this }, glyph, table.composites);
49271         if (haveInstructions) {
49272           var instructionSize = read255UInt16(table.glyphs);
49273         }
49274       }
49276       glyphs.push(glyph);
49277     }
49279     this._transformedGlyphs = glyphs;
49280   };
49282   return WOFF2Font;
49283 }(TTFFont);
49285 var Substream = function () {
49286   function Substream(length) {
49287     _classCallCheck(this, Substream);
49289     this.length = length;
49290     this._buf = new r.Buffer(length);
49291   }
49293   Substream.prototype.decode = function decode(stream, parent) {
49294     return new r.DecodeStream(this._buf.decode(stream, parent));
49295   };
49297   return Substream;
49298 }();
49300 // This struct represents the entire glyf table
49303 var GlyfTable = new r.Struct({
49304   version: r.uint32,
49305   numGlyphs: r.uint16,
49306   indexFormat: r.uint16,
49307   nContourStreamSize: r.uint32,
49308   nPointsStreamSize: r.uint32,
49309   flagStreamSize: r.uint32,
49310   glyphStreamSize: r.uint32,
49311   compositeStreamSize: r.uint32,
49312   bboxStreamSize: r.uint32,
49313   instructionStreamSize: r.uint32,
49314   nContours: new Substream('nContourStreamSize'),
49315   nPoints: new Substream('nPointsStreamSize'),
49316   flags: new Substream('flagStreamSize'),
49317   glyphs: new Substream('glyphStreamSize'),
49318   composites: new Substream('compositeStreamSize'),
49319   bboxes: new Substream('bboxStreamSize'),
49320   instructions: new Substream('instructionStreamSize')
49323 var WORD_CODE = 253;
49324 var ONE_MORE_BYTE_CODE2 = 254;
49325 var ONE_MORE_BYTE_CODE1 = 255;
49326 var LOWEST_U_CODE = 253;
49328 function read255UInt16(stream) {
49329   var code = stream.readUInt8();
49331   if (code === WORD_CODE) {
49332     return stream.readUInt16BE();
49333   }
49335   if (code === ONE_MORE_BYTE_CODE1) {
49336     return stream.readUInt8() + LOWEST_U_CODE;
49337   }
49339   if (code === ONE_MORE_BYTE_CODE2) {
49340     return stream.readUInt8() + LOWEST_U_CODE * 2;
49341   }
49343   return code;
49346 function withSign(flag, baseval) {
49347   return flag & 1 ? baseval : -baseval;
49350 function decodeTriplet(flags, glyphs, nPoints) {
49351   var y = void 0;
49352   var x = y = 0;
49353   var res = [];
49355   for (var i = 0; i < nPoints; i++) {
49356     var dx = 0,
49357         dy = 0;
49358     var flag = flags.readUInt8();
49359     var onCurve = !(flag >> 7);
49360     flag &= 0x7f;
49362     if (flag < 10) {
49363       dx = 0;
49364       dy = withSign(flag, ((flag & 14) << 7) + glyphs.readUInt8());
49365     } else if (flag < 20) {
49366       dx = withSign(flag, ((flag - 10 & 14) << 7) + glyphs.readUInt8());
49367       dy = 0;
49368     } else if (flag < 84) {
49369       var b0 = flag - 20;
49370       var b1 = glyphs.readUInt8();
49371       dx = withSign(flag, 1 + (b0 & 0x30) + (b1 >> 4));
49372       dy = withSign(flag >> 1, 1 + ((b0 & 0x0c) << 2) + (b1 & 0x0f));
49373     } else if (flag < 120) {
49374       var b0 = flag - 84;
49375       dx = withSign(flag, 1 + (b0 / 12 << 8) + glyphs.readUInt8());
49376       dy = withSign(flag >> 1, 1 + (b0 % 12 >> 2 << 8) + glyphs.readUInt8());
49377     } else if (flag < 124) {
49378       var b1 = glyphs.readUInt8();
49379       var b2 = glyphs.readUInt8();
49380       dx = withSign(flag, (b1 << 4) + (b2 >> 4));
49381       dy = withSign(flag >> 1, ((b2 & 0x0f) << 8) + glyphs.readUInt8());
49382     } else {
49383       dx = withSign(flag, glyphs.readUInt16BE());
49384       dy = withSign(flag >> 1, glyphs.readUInt16BE());
49385     }
49387     x += dx;
49388     y += dy;
49389     res.push(new Point(onCurve, false, x, y));
49390   }
49392   return res;
49395 var TTCHeader = new r.VersionedStruct(r.uint32, {
49396   0x00010000: {
49397     numFonts: r.uint32,
49398     offsets: new r.Array(r.uint32, 'numFonts')
49399   },
49400   0x00020000: {
49401     numFonts: r.uint32,
49402     offsets: new r.Array(r.uint32, 'numFonts'),
49403     dsigTag: r.uint32,
49404     dsigLength: r.uint32,
49405     dsigOffset: r.uint32
49406   }
49409 var TrueTypeCollection = function () {
49410   TrueTypeCollection.probe = function probe(buffer) {
49411     return buffer.toString('ascii', 0, 4) === 'ttcf';
49412   };
49414   function TrueTypeCollection(stream) {
49415     _classCallCheck(this, TrueTypeCollection);
49417     this.stream = stream;
49418     if (stream.readString(4) !== 'ttcf') {
49419       throw new Error('Not a TrueType collection');
49420     }
49422     this.header = TTCHeader.decode(stream);
49423   }
49425   TrueTypeCollection.prototype.getFont = function getFont(name) {
49426     for (var _iterator = this.header.offsets, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
49427       var _ref;
49429       if (_isArray) {
49430         if (_i >= _iterator.length) break;
49431         _ref = _iterator[_i++];
49432       } else {
49433         _i = _iterator.next();
49434         if (_i.done) break;
49435         _ref = _i.value;
49436       }
49438       var offset = _ref;
49440       var stream = new r.DecodeStream(this.stream.buffer);
49441       stream.pos = offset;
49442       var font = new TTFFont(stream);
49443       if (font.postscriptName === name) {
49444         return font;
49445       }
49446     }
49448     return null;
49449   };
49451   _createClass(TrueTypeCollection, [{
49452     key: 'fonts',
49453     get: function get() {
49454       var fonts = [];
49455       for (var _iterator2 = this.header.offsets, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
49456         var _ref2;
49458         if (_isArray2) {
49459           if (_i2 >= _iterator2.length) break;
49460           _ref2 = _iterator2[_i2++];
49461         } else {
49462           _i2 = _iterator2.next();
49463           if (_i2.done) break;
49464           _ref2 = _i2.value;
49465         }
49467         var offset = _ref2;
49469         var stream = new r.DecodeStream(this.stream.buffer);
49470         stream.pos = offset;
49471         fonts.push(new TTFFont(stream));
49472       }
49474       return fonts;
49475     }
49476   }]);
49478   return TrueTypeCollection;
49479 }();
49481 var DFontName = new r.String(r.uint8);
49482 var DFontData = new r.Struct({
49483   len: r.uint32,
49484   buf: new r.Buffer('len')
49487 var Ref = new r.Struct({
49488   id: r.uint16,
49489   nameOffset: r.int16,
49490   attr: r.uint8,
49491   dataOffset: r.uint24,
49492   handle: r.uint32
49495 var Type = new r.Struct({
49496   name: new r.String(4),
49497   maxTypeIndex: r.uint16,
49498   refList: new r.Pointer(r.uint16, new r.Array(Ref, function (t) {
49499     return t.maxTypeIndex + 1;
49500   }), { type: 'parent' })
49503 var TypeList = new r.Struct({
49504   length: r.uint16,
49505   types: new r.Array(Type, function (t) {
49506     return t.length + 1;
49507   })
49510 var DFontMap = new r.Struct({
49511   reserved: new r.Reserved(r.uint8, 24),
49512   typeList: new r.Pointer(r.uint16, TypeList),
49513   nameListOffset: new r.Pointer(r.uint16, 'void')
49516 var DFontHeader = new r.Struct({
49517   dataOffset: r.uint32,
49518   map: new r.Pointer(r.uint32, DFontMap),
49519   dataLength: r.uint32,
49520   mapLength: r.uint32
49523 var DFont = function () {
49524   DFont.probe = function probe(buffer) {
49525     var stream = new r.DecodeStream(buffer);
49527     try {
49528       var header = DFontHeader.decode(stream);
49529     } catch (e) {
49530       return false;
49531     }
49533     for (var _iterator = header.map.typeList.types, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
49534       var _ref;
49536       if (_isArray) {
49537         if (_i >= _iterator.length) break;
49538         _ref = _iterator[_i++];
49539       } else {
49540         _i = _iterator.next();
49541         if (_i.done) break;
49542         _ref = _i.value;
49543       }
49545       var type = _ref;
49547       if (type.name === 'sfnt') {
49548         return true;
49549       }
49550     }
49552     return false;
49553   };
49555   function DFont(stream) {
49556     _classCallCheck(this, DFont);
49558     this.stream = stream;
49559     this.header = DFontHeader.decode(this.stream);
49561     for (var _iterator2 = this.header.map.typeList.types, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
49562       var _ref2;
49564       if (_isArray2) {
49565         if (_i2 >= _iterator2.length) break;
49566         _ref2 = _iterator2[_i2++];
49567       } else {
49568         _i2 = _iterator2.next();
49569         if (_i2.done) break;
49570         _ref2 = _i2.value;
49571       }
49573       var type = _ref2;
49575       for (var _iterator3 = type.refList, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
49576         var _ref3;
49578         if (_isArray3) {
49579           if (_i3 >= _iterator3.length) break;
49580           _ref3 = _iterator3[_i3++];
49581         } else {
49582           _i3 = _iterator3.next();
49583           if (_i3.done) break;
49584           _ref3 = _i3.value;
49585         }
49587         var ref = _ref3;
49589         if (ref.nameOffset >= 0) {
49590           this.stream.pos = ref.nameOffset + this.header.map.nameListOffset;
49591           ref.name = DFontName.decode(this.stream);
49592         } else {
49593           ref.name = null;
49594         }
49595       }
49597       if (type.name === 'sfnt') {
49598         this.sfnt = type;
49599       }
49600     }
49601   }
49603   DFont.prototype.getFont = function getFont(name) {
49604     if (!this.sfnt) {
49605       return null;
49606     }
49608     for (var _iterator4 = this.sfnt.refList, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _getIterator(_iterator4);;) {
49609       var _ref4;
49611       if (_isArray4) {
49612         if (_i4 >= _iterator4.length) break;
49613         _ref4 = _iterator4[_i4++];
49614       } else {
49615         _i4 = _iterator4.next();
49616         if (_i4.done) break;
49617         _ref4 = _i4.value;
49618       }
49620       var ref = _ref4;
49622       var pos = this.header.dataOffset + ref.dataOffset + 4;
49623       var stream = new r.DecodeStream(this.stream.buffer.slice(pos));
49624       var font = new TTFFont(stream);
49625       if (font.postscriptName === name) {
49626         return font;
49627       }
49628     }
49630     return null;
49631   };
49633   _createClass(DFont, [{
49634     key: 'fonts',
49635     get: function get() {
49636       var fonts = [];
49637       for (var _iterator5 = this.sfnt.refList, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _getIterator(_iterator5);;) {
49638         var _ref5;
49640         if (_isArray5) {
49641           if (_i5 >= _iterator5.length) break;
49642           _ref5 = _iterator5[_i5++];
49643         } else {
49644           _i5 = _iterator5.next();
49645           if (_i5.done) break;
49646           _ref5 = _i5.value;
49647         }
49649         var ref = _ref5;
49651         var pos = this.header.dataOffset + ref.dataOffset + 4;
49652         var stream = new r.DecodeStream(this.stream.buffer.slice(pos));
49653         fonts.push(new TTFFont(stream));
49654       }
49656       return fonts;
49657     }
49658   }]);
49660   return DFont;
49661 }();
49663 // Register font formats
49664 fontkit.registerFormat(TTFFont);
49665 fontkit.registerFormat(WOFFFont);
49666 fontkit.registerFormat(WOFF2Font);
49667 fontkit.registerFormat(TrueTypeCollection);
49668 fontkit.registerFormat(DFont);
49670 module.exports = fontkit;
49672 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer, __webpack_require__(11)))
49674 /***/ }),
49675 /* 168 */
49676 /***/ (function(module, exports, __webpack_require__) {
49678 // Generated by CoffeeScript 1.7.1
49679 (function() {
49680   var key, val, _ref, _ref1;
49682   exports.EncodeStream = __webpack_require__(169);
49684   exports.DecodeStream = __webpack_require__(51);
49686   exports.Array = __webpack_require__(93);
49688   exports.LazyArray = __webpack_require__(187);
49690   exports.Bitfield = __webpack_require__(188);
49692   exports.Boolean = __webpack_require__(189);
49694   exports.Buffer = __webpack_require__(190);
49696   exports.Enum = __webpack_require__(191);
49698   exports.Optional = __webpack_require__(192);
49700   exports.Reserved = __webpack_require__(193);
49702   exports.String = __webpack_require__(194);
49704   exports.Struct = __webpack_require__(94);
49706   exports.VersionedStruct = __webpack_require__(195);
49708   _ref = __webpack_require__(22);
49709   for (key in _ref) {
49710     val = _ref[key];
49711     exports[key] = val;
49712   }
49714   _ref1 = __webpack_require__(196);
49715   for (key in _ref1) {
49716     val = _ref1[key];
49717     exports[key] = val;
49718   }
49720 }).call(this);
49723 /***/ }),
49724 /* 169 */
49725 /***/ (function(module, exports, __webpack_require__) {
49727 /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.7.1
49728 (function() {
49729   var DecodeStream, EncodeStream, iconv, stream,
49730     __hasProp = {}.hasOwnProperty,
49731     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
49733   stream = __webpack_require__(15);
49735   DecodeStream = __webpack_require__(51);
49737   try {
49738     iconv = __webpack_require__(52);
49739   } catch (_error) {}
49741   EncodeStream = (function(_super) {
49742     var key;
49744     __extends(EncodeStream, _super);
49746     function EncodeStream(bufferSize) {
49747       if (bufferSize == null) {
49748         bufferSize = 65536;
49749       }
49750       EncodeStream.__super__.constructor.apply(this, arguments);
49751       this.buffer = new Buffer(bufferSize);
49752       this.bufferOffset = 0;
49753       this.pos = 0;
49754     }
49756     for (key in Buffer.prototype) {
49757       if (key.slice(0, 5) === 'write') {
49758         (function(key) {
49759           var bytes;
49760           bytes = +DecodeStream.TYPES[key.replace(/write|[BL]E/g, '')];
49761           return EncodeStream.prototype[key] = function(value) {
49762             this.ensure(bytes);
49763             this.buffer[key](value, this.bufferOffset);
49764             this.bufferOffset += bytes;
49765             return this.pos += bytes;
49766           };
49767         })(key);
49768       }
49769     }
49771     EncodeStream.prototype._read = function() {};
49773     EncodeStream.prototype.ensure = function(bytes) {
49774       if (this.bufferOffset + bytes > this.buffer.length) {
49775         return this.flush();
49776       }
49777     };
49779     EncodeStream.prototype.flush = function() {
49780       if (this.bufferOffset > 0) {
49781         this.push(new Buffer(this.buffer.slice(0, this.bufferOffset)));
49782         return this.bufferOffset = 0;
49783       }
49784     };
49786     EncodeStream.prototype.writeBuffer = function(buffer) {
49787       this.flush();
49788       this.push(buffer);
49789       return this.pos += buffer.length;
49790     };
49792     EncodeStream.prototype.writeString = function(string, encoding) {
49793       var buf, byte, i, _i, _ref;
49794       if (encoding == null) {
49795         encoding = 'ascii';
49796       }
49797       switch (encoding) {
49798         case 'utf16le':
49799         case 'ucs2':
49800         case 'utf8':
49801         case 'ascii':
49802           return this.writeBuffer(new Buffer(string, encoding));
49803         case 'utf16be':
49804           buf = new Buffer(string, 'utf16le');
49805           for (i = _i = 0, _ref = buf.length - 1; _i < _ref; i = _i += 2) {
49806             byte = buf[i];
49807             buf[i] = buf[i + 1];
49808             buf[i + 1] = byte;
49809           }
49810           return this.writeBuffer(buf);
49811         default:
49812           if (iconv) {
49813             return this.writeBuffer(iconv.encode(string, encoding));
49814           } else {
49815             throw new Error('Install iconv-lite to enable additional string encodings.');
49816           }
49817       }
49818     };
49820     EncodeStream.prototype.writeUInt24BE = function(val) {
49821       this.ensure(3);
49822       this.buffer[this.bufferOffset++] = val >>> 16 & 0xff;
49823       this.buffer[this.bufferOffset++] = val >>> 8 & 0xff;
49824       this.buffer[this.bufferOffset++] = val & 0xff;
49825       return this.pos += 3;
49826     };
49828     EncodeStream.prototype.writeUInt24LE = function(val) {
49829       this.ensure(3);
49830       this.buffer[this.bufferOffset++] = val & 0xff;
49831       this.buffer[this.bufferOffset++] = val >>> 8 & 0xff;
49832       this.buffer[this.bufferOffset++] = val >>> 16 & 0xff;
49833       return this.pos += 3;
49834     };
49836     EncodeStream.prototype.writeInt24BE = function(val) {
49837       if (val >= 0) {
49838         return this.writeUInt24BE(val);
49839       } else {
49840         return this.writeUInt24BE(val + 0xffffff + 1);
49841       }
49842     };
49844     EncodeStream.prototype.writeInt24LE = function(val) {
49845       if (val >= 0) {
49846         return this.writeUInt24LE(val);
49847       } else {
49848         return this.writeUInt24LE(val + 0xffffff + 1);
49849       }
49850     };
49852     EncodeStream.prototype.fill = function(val, length) {
49853       var buf;
49854       if (length < this.buffer.length) {
49855         this.ensure(length);
49856         this.buffer.fill(val, this.bufferOffset, this.bufferOffset + length);
49857         this.bufferOffset += length;
49858         return this.pos += length;
49859       } else {
49860         buf = new Buffer(length);
49861         buf.fill(val);
49862         return this.writeBuffer(buf);
49863       }
49864     };
49866     EncodeStream.prototype.end = function() {
49867       this.flush();
49868       return this.push(null);
49869     };
49871     return EncodeStream;
49873   })(stream.Readable);
49875   module.exports = EncodeStream;
49877 }).call(this);
49879 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
49881 /***/ }),
49882 /* 170 */
49883 /***/ (function(module, exports, __webpack_require__) {
49885 "use strict";
49888 var BOMChar = '\uFEFF';
49890 exports.PrependBOM = PrependBOMWrapper
49891 function PrependBOMWrapper(encoder, options) {
49892     this.encoder = encoder;
49893     this.addBOM = true;
49896 PrependBOMWrapper.prototype.write = function(str) {
49897     if (this.addBOM) {
49898         str = BOMChar + str;
49899         this.addBOM = false;
49900     }
49902     return this.encoder.write(str);
49905 PrependBOMWrapper.prototype.end = function() {
49906     return this.encoder.end();
49910 //------------------------------------------------------------------------------
49912 exports.StripBOM = StripBOMWrapper;
49913 function StripBOMWrapper(decoder, options) {
49914     this.decoder = decoder;
49915     this.pass = false;
49916     this.options = options || {};
49919 StripBOMWrapper.prototype.write = function(buf) {
49920     var res = this.decoder.write(buf);
49921     if (this.pass || !res)
49922         return res;
49924     if (res[0] === BOMChar) {
49925         res = res.slice(1);
49926         if (typeof this.options.stripBOM === 'function')
49927             this.options.stripBOM();
49928     }
49930     this.pass = true;
49931     return res;
49934 StripBOMWrapper.prototype.end = function() {
49935     return this.decoder.end();
49940 /***/ }),
49941 /* 171 */
49942 /***/ (function(module, exports, __webpack_require__) {
49944 "use strict";
49947 // Update this array if you add/rename/remove files in this directory.
49948 // We support Browserify by skipping automatic module discovery and requiring modules directly.
49949 var modules = [
49950     __webpack_require__(172),
49951     __webpack_require__(173),
49952     __webpack_require__(174),
49953     __webpack_require__(175),
49954     __webpack_require__(176),
49955     __webpack_require__(177),
49956     __webpack_require__(178),
49957     __webpack_require__(179),
49960 // Put all encoding/alias/codec definitions to single object and export it.
49961 for (var i = 0; i < modules.length; i++) {
49962     var module = modules[i];
49963     for (var enc in module)
49964         if (Object.prototype.hasOwnProperty.call(module, enc))
49965             exports[enc] = module[enc];
49969 /***/ }),
49970 /* 172 */
49971 /***/ (function(module, exports, __webpack_require__) {
49973 "use strict";
49975 var Buffer = __webpack_require__(1).Buffer;
49977 // Export Node.js internal encodings.
49979 module.exports = {
49980     // Encodings
49981     utf8:   { type: "_internal", bomAware: true},
49982     cesu8:  { type: "_internal", bomAware: true},
49983     unicode11utf8: "utf8",
49985     ucs2:   { type: "_internal", bomAware: true},
49986     utf16le: "ucs2",
49988     binary: { type: "_internal" },
49989     base64: { type: "_internal" },
49990     hex:    { type: "_internal" },
49992     // Codec.
49993     _internal: InternalCodec,
49996 //------------------------------------------------------------------------------
49998 function InternalCodec(codecOptions, iconv) {
49999     this.enc = codecOptions.encodingName;
50000     this.bomAware = codecOptions.bomAware;
50002     if (this.enc === "base64")
50003         this.encoder = InternalEncoderBase64;
50004     else if (this.enc === "cesu8") {
50005         this.enc = "utf8"; // Use utf8 for decoding.
50006         this.encoder = InternalEncoderCesu8;
50008         // Add decoder for versions of Node not supporting CESU-8
50009         if (new Buffer('eda0bdedb2a9', 'hex').toString() !== '💩') {
50010             this.decoder = InternalDecoderCesu8;
50011             this.defaultCharUnicode = iconv.defaultCharUnicode;
50012         }
50013     }
50016 InternalCodec.prototype.encoder = InternalEncoder;
50017 InternalCodec.prototype.decoder = InternalDecoder;
50019 //------------------------------------------------------------------------------
50021 // We use node.js internal decoder. Its signature is the same as ours.
50022 var StringDecoder = __webpack_require__(47).StringDecoder;
50024 if (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method.
50025     StringDecoder.prototype.end = function() {};
50028 function InternalDecoder(options, codec) {
50029     StringDecoder.call(this, codec.enc);
50032 InternalDecoder.prototype = StringDecoder.prototype;
50035 //------------------------------------------------------------------------------
50036 // Encoder is mostly trivial
50038 function InternalEncoder(options, codec) {
50039     this.enc = codec.enc;
50042 InternalEncoder.prototype.write = function(str) {
50043     return new Buffer(str, this.enc);
50046 InternalEncoder.prototype.end = function() {
50050 //------------------------------------------------------------------------------
50051 // Except base64 encoder, which must keep its state.
50053 function InternalEncoderBase64(options, codec) {
50054     this.prevStr = '';
50057 InternalEncoderBase64.prototype.write = function(str) {
50058     str = this.prevStr + str;
50059     var completeQuads = str.length - (str.length % 4);
50060     this.prevStr = str.slice(completeQuads);
50061     str = str.slice(0, completeQuads);
50063     return new Buffer(str, "base64");
50066 InternalEncoderBase64.prototype.end = function() {
50067     return new Buffer(this.prevStr, "base64");
50071 //------------------------------------------------------------------------------
50072 // CESU-8 encoder is also special.
50074 function InternalEncoderCesu8(options, codec) {
50077 InternalEncoderCesu8.prototype.write = function(str) {
50078     var buf = new Buffer(str.length * 3), bufIdx = 0;
50079     for (var i = 0; i < str.length; i++) {
50080         var charCode = str.charCodeAt(i);
50081         // Naive implementation, but it works because CESU-8 is especially easy
50082         // to convert from UTF-16 (which all JS strings are encoded in).
50083         if (charCode < 0x80)
50084             buf[bufIdx++] = charCode;
50085         else if (charCode < 0x800) {
50086             buf[bufIdx++] = 0xC0 + (charCode >>> 6);
50087             buf[bufIdx++] = 0x80 + (charCode & 0x3f);
50088         }
50089         else { // charCode will always be < 0x10000 in javascript.
50090             buf[bufIdx++] = 0xE0 + (charCode >>> 12);
50091             buf[bufIdx++] = 0x80 + ((charCode >>> 6) & 0x3f);
50092             buf[bufIdx++] = 0x80 + (charCode & 0x3f);
50093         }
50094     }
50095     return buf.slice(0, bufIdx);
50098 InternalEncoderCesu8.prototype.end = function() {
50101 //------------------------------------------------------------------------------
50102 // CESU-8 decoder is not implemented in Node v4.0+
50104 function InternalDecoderCesu8(options, codec) {
50105     this.acc = 0;
50106     this.contBytes = 0;
50107     this.accBytes = 0;
50108     this.defaultCharUnicode = codec.defaultCharUnicode;
50111 InternalDecoderCesu8.prototype.write = function(buf) {
50112     var acc = this.acc, contBytes = this.contBytes, accBytes = this.accBytes,
50113         res = '';
50114     for (var i = 0; i < buf.length; i++) {
50115         var curByte = buf[i];
50116         if ((curByte & 0xC0) !== 0x80) { // Leading byte
50117             if (contBytes > 0) { // Previous code is invalid
50118                 res += this.defaultCharUnicode;
50119                 contBytes = 0;
50120             }
50122             if (curByte < 0x80) { // Single-byte code
50123                 res += String.fromCharCode(curByte);
50124             } else if (curByte < 0xE0) { // Two-byte code
50125                 acc = curByte & 0x1F;
50126                 contBytes = 1; accBytes = 1;
50127             } else if (curByte < 0xF0) { // Three-byte code
50128                 acc = curByte & 0x0F;
50129                 contBytes = 2; accBytes = 1;
50130             } else { // Four or more are not supported for CESU-8.
50131                 res += this.defaultCharUnicode;
50132             }
50133         } else { // Continuation byte
50134             if (contBytes > 0) { // We're waiting for it.
50135                 acc = (acc << 6) | (curByte & 0x3f);
50136                 contBytes--; accBytes++;
50137                 if (contBytes === 0) {
50138                     // Check for overlong encoding, but support Modified UTF-8 (encoding NULL as C0 80)
50139                     if (accBytes === 2 && acc < 0x80 && acc > 0)
50140                         res += this.defaultCharUnicode;
50141                     else if (accBytes === 3 && acc < 0x800)
50142                         res += this.defaultCharUnicode;
50143                     else
50144                         // Actually add character.
50145                         res += String.fromCharCode(acc);
50146                 }
50147             } else { // Unexpected continuation byte
50148                 res += this.defaultCharUnicode;
50149             }
50150         }
50151     }
50152     this.acc = acc; this.contBytes = contBytes; this.accBytes = accBytes;
50153     return res;
50156 InternalDecoderCesu8.prototype.end = function() {
50157     var res = 0;
50158     if (this.contBytes > 0)
50159         res += this.defaultCharUnicode;
50160     return res;
50164 /***/ }),
50165 /* 173 */
50166 /***/ (function(module, exports, __webpack_require__) {
50168 "use strict";
50170 var Buffer = __webpack_require__(1).Buffer;
50172 // Note: UTF16-LE (or UCS2) codec is Node.js native. See encodings/internal.js
50174 // == UTF16-BE codec. ==========================================================
50176 exports.utf16be = Utf16BECodec;
50177 function Utf16BECodec() {
50180 Utf16BECodec.prototype.encoder = Utf16BEEncoder;
50181 Utf16BECodec.prototype.decoder = Utf16BEDecoder;
50182 Utf16BECodec.prototype.bomAware = true;
50185 // -- Encoding
50187 function Utf16BEEncoder() {
50190 Utf16BEEncoder.prototype.write = function(str) {
50191     var buf = new Buffer(str, 'ucs2');
50192     for (var i = 0; i < buf.length; i += 2) {
50193         var tmp = buf[i]; buf[i] = buf[i+1]; buf[i+1] = tmp;
50194     }
50195     return buf;
50198 Utf16BEEncoder.prototype.end = function() {
50202 // -- Decoding
50204 function Utf16BEDecoder() {
50205     this.overflowByte = -1;
50208 Utf16BEDecoder.prototype.write = function(buf) {
50209     if (buf.length == 0)
50210         return '';
50212     var buf2 = new Buffer(buf.length + 1),
50213         i = 0, j = 0;
50215     if (this.overflowByte !== -1) {
50216         buf2[0] = buf[0];
50217         buf2[1] = this.overflowByte;
50218         i = 1; j = 2;
50219     }
50221     for (; i < buf.length-1; i += 2, j+= 2) {
50222         buf2[j] = buf[i+1];
50223         buf2[j+1] = buf[i];
50224     }
50226     this.overflowByte = (i == buf.length-1) ? buf[buf.length-1] : -1;
50228     return buf2.slice(0, j).toString('ucs2');
50231 Utf16BEDecoder.prototype.end = function() {
50235 // == UTF-16 codec =============================================================
50236 // Decoder chooses automatically from UTF-16LE and UTF-16BE using BOM and space-based heuristic.
50237 // Defaults to UTF-16LE, as it's prevalent and default in Node.
50238 // http://en.wikipedia.org/wiki/UTF-16 and http://encoding.spec.whatwg.org/#utf-16le
50239 // Decoder default can be changed: iconv.decode(buf, 'utf16', {defaultEncoding: 'utf-16be'});
50241 // Encoder uses UTF-16LE and prepends BOM (which can be overridden with addBOM: false).
50243 exports.utf16 = Utf16Codec;
50244 function Utf16Codec(codecOptions, iconv) {
50245     this.iconv = iconv;
50248 Utf16Codec.prototype.encoder = Utf16Encoder;
50249 Utf16Codec.prototype.decoder = Utf16Decoder;
50252 // -- Encoding (pass-through)
50254 function Utf16Encoder(options, codec) {
50255     options = options || {};
50256     if (options.addBOM === undefined)
50257         options.addBOM = true;
50258     this.encoder = codec.iconv.getEncoder('utf-16le', options);
50261 Utf16Encoder.prototype.write = function(str) {
50262     return this.encoder.write(str);
50265 Utf16Encoder.prototype.end = function() {
50266     return this.encoder.end();
50270 // -- Decoding
50272 function Utf16Decoder(options, codec) {
50273     this.decoder = null;
50274     this.initialBytes = [];
50275     this.initialBytesLen = 0;
50277     this.options = options || {};
50278     this.iconv = codec.iconv;
50281 Utf16Decoder.prototype.write = function(buf) {
50282     if (!this.decoder) {
50283         // Codec is not chosen yet. Accumulate initial bytes.
50284         this.initialBytes.push(buf);
50285         this.initialBytesLen += buf.length;
50287         if (this.initialBytesLen < 16) // We need more bytes to use space heuristic (see below)
50288             return '';
50290         // We have enough bytes -> detect endianness.
50291         var buf = Buffer.concat(this.initialBytes),
50292             encoding = detectEncoding(buf, this.options.defaultEncoding);
50293         this.decoder = this.iconv.getDecoder(encoding, this.options);
50294         this.initialBytes.length = this.initialBytesLen = 0;
50295     }
50297     return this.decoder.write(buf);
50300 Utf16Decoder.prototype.end = function() {
50301     if (!this.decoder) {
50302         var buf = Buffer.concat(this.initialBytes),
50303             encoding = detectEncoding(buf, this.options.defaultEncoding);
50304         this.decoder = this.iconv.getDecoder(encoding, this.options);
50306         var res = this.decoder.write(buf),
50307             trail = this.decoder.end();
50309         return trail ? (res + trail) : res;
50310     }
50311     return this.decoder.end();
50314 function detectEncoding(buf, defaultEncoding) {
50315     var enc = defaultEncoding || 'utf-16le';
50317     if (buf.length >= 2) {
50318         // Check BOM.
50319         if (buf[0] == 0xFE && buf[1] == 0xFF) // UTF-16BE BOM
50320             enc = 'utf-16be';
50321         else if (buf[0] == 0xFF && buf[1] == 0xFE) // UTF-16LE BOM
50322             enc = 'utf-16le';
50323         else {
50324             // No BOM found. Try to deduce encoding from initial content.
50325             // Most of the time, the content has ASCII chars (U+00**), but the opposite (U+**00) is uncommon.
50326             // So, we count ASCII as if it was LE or BE, and decide from that.
50327             var asciiCharsLE = 0, asciiCharsBE = 0, // Counts of chars in both positions
50328                 _len = Math.min(buf.length - (buf.length % 2), 64); // Len is always even.
50330             for (var i = 0; i < _len; i += 2) {
50331                 if (buf[i] === 0 && buf[i+1] !== 0) asciiCharsBE++;
50332                 if (buf[i] !== 0 && buf[i+1] === 0) asciiCharsLE++;
50333             }
50335             if (asciiCharsBE > asciiCharsLE)
50336                 enc = 'utf-16be';
50337             else if (asciiCharsBE < asciiCharsLE)
50338                 enc = 'utf-16le';
50339         }
50340     }
50342     return enc;
50348 /***/ }),
50349 /* 174 */
50350 /***/ (function(module, exports, __webpack_require__) {
50352 "use strict";
50354 var Buffer = __webpack_require__(1).Buffer;
50356 // UTF-7 codec, according to https://tools.ietf.org/html/rfc2152
50357 // See also below a UTF-7-IMAP codec, according to http://tools.ietf.org/html/rfc3501#section-5.1.3
50359 exports.utf7 = Utf7Codec;
50360 exports.unicode11utf7 = 'utf7'; // Alias UNICODE-1-1-UTF-7
50361 function Utf7Codec(codecOptions, iconv) {
50362     this.iconv = iconv;
50365 Utf7Codec.prototype.encoder = Utf7Encoder;
50366 Utf7Codec.prototype.decoder = Utf7Decoder;
50367 Utf7Codec.prototype.bomAware = true;
50370 // -- Encoding
50372 var nonDirectChars = /[^A-Za-z0-9'\(\),-\.\/:\? \n\r\t]+/g;
50374 function Utf7Encoder(options, codec) {
50375     this.iconv = codec.iconv;
50378 Utf7Encoder.prototype.write = function(str) {
50379     // Naive implementation.
50380     // Non-direct chars are encoded as "+<base64>-"; single "+" char is encoded as "+-".
50381     return new Buffer(str.replace(nonDirectChars, function(chunk) {
50382         return "+" + (chunk === '+' ? '' :
50383             this.iconv.encode(chunk, 'utf16-be').toString('base64').replace(/=+$/, ''))
50384             + "-";
50385     }.bind(this)));
50388 Utf7Encoder.prototype.end = function() {
50392 // -- Decoding
50394 function Utf7Decoder(options, codec) {
50395     this.iconv = codec.iconv;
50396     this.inBase64 = false;
50397     this.base64Accum = '';
50400 var base64Regex = /[A-Za-z0-9\/+]/;
50401 var base64Chars = [];
50402 for (var i = 0; i < 256; i++)
50403     base64Chars[i] = base64Regex.test(String.fromCharCode(i));
50405 var plusChar = '+'.charCodeAt(0),
50406     minusChar = '-'.charCodeAt(0),
50407     andChar = '&'.charCodeAt(0);
50409 Utf7Decoder.prototype.write = function(buf) {
50410     var res = "", lastI = 0,
50411         inBase64 = this.inBase64,
50412         base64Accum = this.base64Accum;
50414     // The decoder is more involved as we must handle chunks in stream.
50416     for (var i = 0; i < buf.length; i++) {
50417         if (!inBase64) { // We're in direct mode.
50418             // Write direct chars until '+'
50419             if (buf[i] == plusChar) {
50420                 res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars.
50421                 lastI = i+1;
50422                 inBase64 = true;
50423             }
50424         } else { // We decode base64.
50425             if (!base64Chars[buf[i]]) { // Base64 ended.
50426                 if (i == lastI && buf[i] == minusChar) {// "+-" -> "+"
50427                     res += "+";
50428                 } else {
50429                     var b64str = base64Accum + buf.slice(lastI, i).toString();
50430                     res += this.iconv.decode(new Buffer(b64str, 'base64'), "utf16-be");
50431                 }
50433                 if (buf[i] != minusChar) // Minus is absorbed after base64.
50434                     i--;
50436                 lastI = i+1;
50437                 inBase64 = false;
50438                 base64Accum = '';
50439             }
50440         }
50441     }
50443     if (!inBase64) {
50444         res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars.
50445     } else {
50446         var b64str = base64Accum + buf.slice(lastI).toString();
50448         var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.
50449         base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.
50450         b64str = b64str.slice(0, canBeDecoded);
50452         res += this.iconv.decode(new Buffer(b64str, 'base64'), "utf16-be");
50453     }
50455     this.inBase64 = inBase64;
50456     this.base64Accum = base64Accum;
50458     return res;
50461 Utf7Decoder.prototype.end = function() {
50462     var res = "";
50463     if (this.inBase64 && this.base64Accum.length > 0)
50464         res = this.iconv.decode(new Buffer(this.base64Accum, 'base64'), "utf16-be");
50466     this.inBase64 = false;
50467     this.base64Accum = '';
50468     return res;
50472 // UTF-7-IMAP codec.
50473 // RFC3501 Sec. 5.1.3 Modified UTF-7 (http://tools.ietf.org/html/rfc3501#section-5.1.3)
50474 // Differences:
50475 //  * Base64 part is started by "&" instead of "+"
50476 //  * Direct characters are 0x20-0x7E, except "&" (0x26)
50477 //  * In Base64, "," is used instead of "/"
50478 //  * Base64 must not be used to represent direct characters.
50479 //  * No implicit shift back from Base64 (should always end with '-')
50480 //  * String must end in non-shifted position.
50481 //  * "-&" while in base64 is not allowed.
50484 exports.utf7imap = Utf7IMAPCodec;
50485 function Utf7IMAPCodec(codecOptions, iconv) {
50486     this.iconv = iconv;
50489 Utf7IMAPCodec.prototype.encoder = Utf7IMAPEncoder;
50490 Utf7IMAPCodec.prototype.decoder = Utf7IMAPDecoder;
50491 Utf7IMAPCodec.prototype.bomAware = true;
50494 // -- Encoding
50496 function Utf7IMAPEncoder(options, codec) {
50497     this.iconv = codec.iconv;
50498     this.inBase64 = false;
50499     this.base64Accum = new Buffer(6);
50500     this.base64AccumIdx = 0;
50503 Utf7IMAPEncoder.prototype.write = function(str) {
50504     var inBase64 = this.inBase64,
50505         base64Accum = this.base64Accum,
50506         base64AccumIdx = this.base64AccumIdx,
50507         buf = new Buffer(str.length*5 + 10), bufIdx = 0;
50509     for (var i = 0; i < str.length; i++) {
50510         var uChar = str.charCodeAt(i);
50511         if (0x20 <= uChar && uChar <= 0x7E) { // Direct character or '&'.
50512             if (inBase64) {
50513                 if (base64AccumIdx > 0) {
50514                     bufIdx += buf.write(base64Accum.slice(0, base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx);
50515                     base64AccumIdx = 0;
50516                 }
50518                 buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.
50519                 inBase64 = false;
50520             }
50522             if (!inBase64) {
50523                 buf[bufIdx++] = uChar; // Write direct character
50525                 if (uChar === andChar)  // Ampersand -> '&-'
50526                     buf[bufIdx++] = minusChar;
50527             }
50529         } else { // Non-direct character
50530             if (!inBase64) {
50531                 buf[bufIdx++] = andChar; // Write '&', then go to base64 mode.
50532                 inBase64 = true;
50533             }
50534             if (inBase64) {
50535                 base64Accum[base64AccumIdx++] = uChar >> 8;
50536                 base64Accum[base64AccumIdx++] = uChar & 0xFF;
50538                 if (base64AccumIdx == base64Accum.length) {
50539                     bufIdx += buf.write(base64Accum.toString('base64').replace(/\//g, ','), bufIdx);
50540                     base64AccumIdx = 0;
50541                 }
50542             }
50543         }
50544     }
50546     this.inBase64 = inBase64;
50547     this.base64AccumIdx = base64AccumIdx;
50549     return buf.slice(0, bufIdx);
50552 Utf7IMAPEncoder.prototype.end = function() {
50553     var buf = new Buffer(10), bufIdx = 0;
50554     if (this.inBase64) {
50555         if (this.base64AccumIdx > 0) {
50556             bufIdx += buf.write(this.base64Accum.slice(0, this.base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx);
50557             this.base64AccumIdx = 0;
50558         }
50560         buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.
50561         this.inBase64 = false;
50562     }
50564     return buf.slice(0, bufIdx);
50568 // -- Decoding
50570 function Utf7IMAPDecoder(options, codec) {
50571     this.iconv = codec.iconv;
50572     this.inBase64 = false;
50573     this.base64Accum = '';
50576 var base64IMAPChars = base64Chars.slice();
50577 base64IMAPChars[','.charCodeAt(0)] = true;
50579 Utf7IMAPDecoder.prototype.write = function(buf) {
50580     var res = "", lastI = 0,
50581         inBase64 = this.inBase64,
50582         base64Accum = this.base64Accum;
50584     // The decoder is more involved as we must handle chunks in stream.
50585     // It is forgiving, closer to standard UTF-7 (for example, '-' is optional at the end).
50587     for (var i = 0; i < buf.length; i++) {
50588         if (!inBase64) { // We're in direct mode.
50589             // Write direct chars until '&'
50590             if (buf[i] == andChar) {
50591                 res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars.
50592                 lastI = i+1;
50593                 inBase64 = true;
50594             }
50595         } else { // We decode base64.
50596             if (!base64IMAPChars[buf[i]]) { // Base64 ended.
50597                 if (i == lastI && buf[i] == minusChar) { // "&-" -> "&"
50598                     res += "&";
50599                 } else {
50600                     var b64str = base64Accum + buf.slice(lastI, i).toString().replace(/,/g, '/');
50601                     res += this.iconv.decode(new Buffer(b64str, 'base64'), "utf16-be");
50602                 }
50604                 if (buf[i] != minusChar) // Minus may be absorbed after base64.
50605                     i--;
50607                 lastI = i+1;
50608                 inBase64 = false;
50609                 base64Accum = '';
50610             }
50611         }
50612     }
50614     if (!inBase64) {
50615         res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars.
50616     } else {
50617         var b64str = base64Accum + buf.slice(lastI).toString().replace(/,/g, '/');
50619         var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.
50620         base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.
50621         b64str = b64str.slice(0, canBeDecoded);
50623         res += this.iconv.decode(new Buffer(b64str, 'base64'), "utf16-be");
50624     }
50626     this.inBase64 = inBase64;
50627     this.base64Accum = base64Accum;
50629     return res;
50632 Utf7IMAPDecoder.prototype.end = function() {
50633     var res = "";
50634     if (this.inBase64 && this.base64Accum.length > 0)
50635         res = this.iconv.decode(new Buffer(this.base64Accum, 'base64'), "utf16-be");
50637     this.inBase64 = false;
50638     this.base64Accum = '';
50639     return res;
50645 /***/ }),
50646 /* 175 */
50647 /***/ (function(module, exports, __webpack_require__) {
50649 "use strict";
50651 var Buffer = __webpack_require__(1).Buffer;
50653 // Single-byte codec. Needs a 'chars' string parameter that contains 256 or 128 chars that
50654 // correspond to encoded bytes (if 128 - then lower half is ASCII).
50656 exports._sbcs = SBCSCodec;
50657 function SBCSCodec(codecOptions, iconv) {
50658     if (!codecOptions)
50659         throw new Error("SBCS codec is called without the data.")
50661     // Prepare char buffer for decoding.
50662     if (!codecOptions.chars || (codecOptions.chars.length !== 128 && codecOptions.chars.length !== 256))
50663         throw new Error("Encoding '"+codecOptions.type+"' has incorrect 'chars' (must be of len 128 or 256)");
50665     if (codecOptions.chars.length === 128) {
50666         var asciiString = "";
50667         for (var i = 0; i < 128; i++)
50668             asciiString += String.fromCharCode(i);
50669         codecOptions.chars = asciiString + codecOptions.chars;
50670     }
50672     this.decodeBuf = new Buffer(codecOptions.chars, 'ucs2');
50674     // Encoding buffer.
50675     var encodeBuf = new Buffer(65536);
50676     encodeBuf.fill(iconv.defaultCharSingleByte.charCodeAt(0));
50678     for (var i = 0; i < codecOptions.chars.length; i++)
50679         encodeBuf[codecOptions.chars.charCodeAt(i)] = i;
50681     this.encodeBuf = encodeBuf;
50684 SBCSCodec.prototype.encoder = SBCSEncoder;
50685 SBCSCodec.prototype.decoder = SBCSDecoder;
50688 function SBCSEncoder(options, codec) {
50689     this.encodeBuf = codec.encodeBuf;
50692 SBCSEncoder.prototype.write = function(str) {
50693     var buf = new Buffer(str.length);
50694     for (var i = 0; i < str.length; i++)
50695         buf[i] = this.encodeBuf[str.charCodeAt(i)];
50697     return buf;
50700 SBCSEncoder.prototype.end = function() {
50704 function SBCSDecoder(options, codec) {
50705     this.decodeBuf = codec.decodeBuf;
50708 SBCSDecoder.prototype.write = function(buf) {
50709     // Strings are immutable in JS -> we use ucs2 buffer to speed up computations.
50710     var decodeBuf = this.decodeBuf;
50711     var newBuf = new Buffer(buf.length*2);
50712     var idx1 = 0, idx2 = 0;
50713     for (var i = 0; i < buf.length; i++) {
50714         idx1 = buf[i]*2; idx2 = i*2;
50715         newBuf[idx2] = decodeBuf[idx1];
50716         newBuf[idx2+1] = decodeBuf[idx1+1];
50717     }
50718     return newBuf.toString('ucs2');
50721 SBCSDecoder.prototype.end = function() {
50725 /***/ }),
50726 /* 176 */
50727 /***/ (function(module, exports, __webpack_require__) {
50729 "use strict";
50732 // Manually added data to be used by sbcs codec in addition to generated one.
50734 module.exports = {
50735     // Not supported by iconv, not sure why.
50736     "10029": "maccenteuro",
50737     "maccenteuro": {
50738         "type": "_sbcs",
50739         "chars": "ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ"
50740     },
50742     "808": "cp808",
50743     "ibm808": "cp808",
50744     "cp808": {
50745         "type": "_sbcs",
50746         "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№€■ "
50747     },
50749     // Aliases of generated encodings.
50750     "ascii8bit": "ascii",
50751     "usascii": "ascii",
50752     "ansix34": "ascii",
50753     "ansix341968": "ascii",
50754     "ansix341986": "ascii",
50755     "csascii": "ascii",
50756     "cp367": "ascii",
50757     "ibm367": "ascii",
50758     "isoir6": "ascii",
50759     "iso646us": "ascii",
50760     "iso646irv": "ascii",
50761     "us": "ascii",
50763     "latin1": "iso88591",
50764     "latin2": "iso88592",
50765     "latin3": "iso88593",
50766     "latin4": "iso88594",
50767     "latin5": "iso88599",
50768     "latin6": "iso885910",
50769     "latin7": "iso885913",
50770     "latin8": "iso885914",
50771     "latin9": "iso885915",
50772     "latin10": "iso885916",
50774     "csisolatin1": "iso88591",
50775     "csisolatin2": "iso88592",
50776     "csisolatin3": "iso88593",
50777     "csisolatin4": "iso88594",
50778     "csisolatincyrillic": "iso88595",
50779     "csisolatinarabic": "iso88596",
50780     "csisolatingreek" : "iso88597",
50781     "csisolatinhebrew": "iso88598",
50782     "csisolatin5": "iso88599",
50783     "csisolatin6": "iso885910",
50785     "l1": "iso88591",
50786     "l2": "iso88592",
50787     "l3": "iso88593",
50788     "l4": "iso88594",
50789     "l5": "iso88599",
50790     "l6": "iso885910",
50791     "l7": "iso885913",
50792     "l8": "iso885914",
50793     "l9": "iso885915",
50794     "l10": "iso885916",
50796     "isoir14": "iso646jp",
50797     "isoir57": "iso646cn",
50798     "isoir100": "iso88591",
50799     "isoir101": "iso88592",
50800     "isoir109": "iso88593",
50801     "isoir110": "iso88594",
50802     "isoir144": "iso88595",
50803     "isoir127": "iso88596",
50804     "isoir126": "iso88597",
50805     "isoir138": "iso88598",
50806     "isoir148": "iso88599",
50807     "isoir157": "iso885910",
50808     "isoir166": "tis620",
50809     "isoir179": "iso885913",
50810     "isoir199": "iso885914",
50811     "isoir203": "iso885915",
50812     "isoir226": "iso885916",
50814     "cp819": "iso88591",
50815     "ibm819": "iso88591",
50817     "cyrillic": "iso88595",
50819     "arabic": "iso88596",
50820     "arabic8": "iso88596",
50821     "ecma114": "iso88596",
50822     "asmo708": "iso88596",
50824     "greek" : "iso88597",
50825     "greek8" : "iso88597",
50826     "ecma118" : "iso88597",
50827     "elot928" : "iso88597",
50829     "hebrew": "iso88598",
50830     "hebrew8": "iso88598",
50832     "turkish": "iso88599",
50833     "turkish8": "iso88599",
50835     "thai": "iso885911",
50836     "thai8": "iso885911",
50838     "celtic": "iso885914",
50839     "celtic8": "iso885914",
50840     "isoceltic": "iso885914",
50842     "tis6200": "tis620",
50843     "tis62025291": "tis620",
50844     "tis62025330": "tis620",
50846     "10000": "macroman",
50847     "10006": "macgreek",
50848     "10007": "maccyrillic",
50849     "10079": "maciceland",
50850     "10081": "macturkish",
50852     "cspc8codepage437": "cp437",
50853     "cspc775baltic": "cp775",
50854     "cspc850multilingual": "cp850",
50855     "cspcp852": "cp852",
50856     "cspc862latinhebrew": "cp862",
50857     "cpgr": "cp869",
50859     "msee": "cp1250",
50860     "mscyrl": "cp1251",
50861     "msansi": "cp1252",
50862     "msgreek": "cp1253",
50863     "msturk": "cp1254",
50864     "mshebr": "cp1255",
50865     "msarab": "cp1256",
50866     "winbaltrim": "cp1257",
50868     "cp20866": "koi8r",
50869     "20866": "koi8r",
50870     "ibm878": "koi8r",
50871     "cskoi8r": "koi8r",
50873     "cp21866": "koi8u",
50874     "21866": "koi8u",
50875     "ibm1168": "koi8u",
50877     "strk10482002": "rk1048",
50879     "tcvn5712": "tcvn",
50880     "tcvn57121": "tcvn",
50882     "gb198880": "iso646cn",
50883     "cn": "iso646cn",
50885     "csiso14jisc6220ro": "iso646jp",
50886     "jisc62201969ro": "iso646jp",
50887     "jp": "iso646jp",
50889     "cshproman8": "hproman8",
50890     "r8": "hproman8",
50891     "roman8": "hproman8",
50892     "xroman8": "hproman8",
50893     "ibm1051": "hproman8",
50895     "mac": "macintosh",
50896     "csmacintosh": "macintosh",
50901 /***/ }),
50902 /* 177 */
50903 /***/ (function(module, exports, __webpack_require__) {
50905 "use strict";
50908 // Generated data for sbcs codec. Don't edit manually. Regenerate using generation/gen-sbcs.js script.
50909 module.exports = {
50910   "437": "cp437",
50911   "737": "cp737",
50912   "775": "cp775",
50913   "850": "cp850",
50914   "852": "cp852",
50915   "855": "cp855",
50916   "856": "cp856",
50917   "857": "cp857",
50918   "858": "cp858",
50919   "860": "cp860",
50920   "861": "cp861",
50921   "862": "cp862",
50922   "863": "cp863",
50923   "864": "cp864",
50924   "865": "cp865",
50925   "866": "cp866",
50926   "869": "cp869",
50927   "874": "windows874",
50928   "922": "cp922",
50929   "1046": "cp1046",
50930   "1124": "cp1124",
50931   "1125": "cp1125",
50932   "1129": "cp1129",
50933   "1133": "cp1133",
50934   "1161": "cp1161",
50935   "1162": "cp1162",
50936   "1163": "cp1163",
50937   "1250": "windows1250",
50938   "1251": "windows1251",
50939   "1252": "windows1252",
50940   "1253": "windows1253",
50941   "1254": "windows1254",
50942   "1255": "windows1255",
50943   "1256": "windows1256",
50944   "1257": "windows1257",
50945   "1258": "windows1258",
50946   "28591": "iso88591",
50947   "28592": "iso88592",
50948   "28593": "iso88593",
50949   "28594": "iso88594",
50950   "28595": "iso88595",
50951   "28596": "iso88596",
50952   "28597": "iso88597",
50953   "28598": "iso88598",
50954   "28599": "iso88599",
50955   "28600": "iso885910",
50956   "28601": "iso885911",
50957   "28603": "iso885913",
50958   "28604": "iso885914",
50959   "28605": "iso885915",
50960   "28606": "iso885916",
50961   "windows874": {
50962     "type": "_sbcs",
50963     "chars": "€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
50964   },
50965   "win874": "windows874",
50966   "cp874": "windows874",
50967   "windows1250": {
50968     "type": "_sbcs",
50969     "chars": "€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙"
50970   },
50971   "win1250": "windows1250",
50972   "cp1250": "windows1250",
50973   "windows1251": {
50974     "type": "_sbcs",
50975     "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
50976   },
50977   "win1251": "windows1251",
50978   "cp1251": "windows1251",
50979   "windows1252": {
50980     "type": "_sbcs",
50981     "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
50982   },
50983   "win1252": "windows1252",
50984   "cp1252": "windows1252",
50985   "windows1253": {
50986     "type": "_sbcs",
50987     "chars": "€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�"
50988   },
50989   "win1253": "windows1253",
50990   "cp1253": "windows1253",
50991   "windows1254": {
50992     "type": "_sbcs",
50993     "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"
50994   },
50995   "win1254": "windows1254",
50996   "cp1254": "windows1254",
50997   "windows1255": {
50998     "type": "_sbcs",
50999     "chars": "€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹֺֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�"
51000   },
51001   "win1255": "windows1255",
51002   "cp1255": "windows1255",
51003   "windows1256": {
51004     "type": "_sbcs",
51005     "chars": "€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے"
51006   },
51007   "win1256": "windows1256",
51008   "cp1256": "windows1256",
51009   "windows1257": {
51010     "type": "_sbcs",
51011     "chars": "€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙"
51012   },
51013   "win1257": "windows1257",
51014   "cp1257": "windows1257",
51015   "windows1258": {
51016     "type": "_sbcs",
51017     "chars": "€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
51018   },
51019   "win1258": "windows1258",
51020   "cp1258": "windows1258",
51021   "iso88591": {
51022     "type": "_sbcs",
51023     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
51024   },
51025   "cp28591": "iso88591",
51026   "iso88592": {
51027     "type": "_sbcs",
51028     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙"
51029   },
51030   "cp28592": "iso88592",
51031   "iso88593": {
51032     "type": "_sbcs",
51033     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ħ˘£¤�Ĥ§¨İŞĞĴ­�Ż°ħ²³´µĥ·¸ışğĵ½�żÀÁÂ�ÄĊĈÇÈÉÊËÌÍÎÏ�ÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ�äċĉçèéêëìíîï�ñòóôġö÷ĝùúûüŭŝ˙"
51034   },
51035   "cp28593": "iso88593",
51036   "iso88594": {
51037     "type": "_sbcs",
51038     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄĸŖ¤ĨĻ§¨ŠĒĢŦ­Ž¯°ą˛ŗ´ĩļˇ¸šēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖ×ØŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū˙"
51039   },
51040   "cp28594": "iso88594",
51041   "iso88595": {
51042     "type": "_sbcs",
51043     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ"
51044   },
51045   "cp28595": "iso88595",
51046   "iso88596": {
51047     "type": "_sbcs",
51048     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ���¤�������،­�������������؛���؟�ءآأؤإئابةتثجحخدذرزسشصضطظعغ�����ـفقكلمنهوىيًٌٍَُِّْ�������������"
51049   },
51050   "cp28596": "iso88596",
51051   "iso88597": {
51052     "type": "_sbcs",
51053     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ‘’£€₯¦§¨©ͺ«¬­�―°±²³΄΅Ά·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�"
51054   },
51055   "cp28597": "iso88597",
51056   "iso88598": {
51057     "type": "_sbcs",
51058     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ �¢£¤¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾��������������������������������‗אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�"
51059   },
51060   "cp28598": "iso88598",
51061   "iso88599": {
51062     "type": "_sbcs",
51063     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"
51064   },
51065   "cp28599": "iso88599",
51066   "iso885910": {
51067     "type": "_sbcs",
51068     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄĒĢĪĨĶ§ĻĐŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ"
51069   },
51070   "cp28600": "iso885910",
51071   "iso885911": {
51072     "type": "_sbcs",
51073     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
51074   },
51075   "cp28601": "iso885911",
51076   "iso885913": {
51077     "type": "_sbcs",
51078     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ”¢£¤„¦§Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’"
51079   },
51080   "cp28603": "iso885913",
51081   "iso885914": {
51082     "type": "_sbcs",
51083     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ­®ŸḞḟĠġṀṁ¶ṖẁṗẃṠỳẄẅṡÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŴÑÒÓÔÕÖṪØÙÚÛÜÝŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ"
51084   },
51085   "cp28604": "iso885914",
51086   "iso885915": {
51087     "type": "_sbcs",
51088     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
51089   },
51090   "cp28605": "iso885915",
51091   "iso885916": {
51092     "type": "_sbcs",
51093     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄąŁ€„Š§š©Ș«Ź­źŻ°±ČłŽ”¶·žčș»ŒœŸżÀÁÂĂÄĆÆÇÈÉÊËÌÍÎÏĐŃÒÓÔŐÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ"
51094   },
51095   "cp28606": "iso885916",
51096   "cp437": {
51097     "type": "_sbcs",
51098     "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
51099   },
51100   "ibm437": "cp437",
51101   "csibm437": "cp437",
51102   "cp737": {
51103     "type": "_sbcs",
51104     "chars": "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ "
51105   },
51106   "ibm737": "cp737",
51107   "csibm737": "cp737",
51108   "cp775": {
51109     "type": "_sbcs",
51110     "chars": "ĆüéāäģåćłēŖŗīŹÄÅÉæÆōöĢ¢ŚśÖÜø£ØפĀĪóŻżź”¦©®¬½¼Ł«»░▒▓│┤ĄČĘĖ╣║╗╝ĮŠ┐└┴┬├─┼ŲŪ╚╔╩╦╠═╬Žąčęėįšųūž┘┌█▄▌▐▀ÓßŌŃõÕµńĶķĻļņĒŅ’­±“¾¶§÷„°∙·¹³²■ "
51111   },
51112   "ibm775": "cp775",
51113   "csibm775": "cp775",
51114   "cp850": {
51115     "type": "_sbcs",
51116     "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ "
51117   },
51118   "ibm850": "cp850",
51119   "csibm850": "cp850",
51120   "cp852": {
51121     "type": "_sbcs",
51122     "chars": "ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ "
51123   },
51124   "ibm852": "cp852",
51125   "csibm852": "cp852",
51126   "cp855": {
51127     "type": "_sbcs",
51128     "chars": "ђЂѓЃёЁєЄѕЅіІїЇјЈљЉњЊћЋќЌўЎџЏюЮъЪаАбБцЦдДеЕфФгГ«»░▒▓│┤хХиИ╣║╗╝йЙ┐└┴┬├─┼кК╚╔╩╦╠═╬¤лЛмМнНоОп┘┌█▄Пя▀ЯрРсСтТуУжЖвВьЬ№­ыЫзЗшШэЭщЩчЧ§■ "
51129   },
51130   "ibm855": "cp855",
51131   "csibm855": "cp855",
51132   "cp856": {
51133     "type": "_sbcs",
51134     "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת�£�×����������®¬½¼�«»░▒▓│┤���©╣║╗╝¢¥┐└┴┬├─┼��╚╔╩╦╠═╬¤���������┘┌█▄¦�▀������µ�������¯´­±‗¾¶§÷¸°¨·¹³²■ "
51135   },
51136   "ibm856": "cp856",
51137   "csibm856": "cp856",
51138   "cp857": {
51139     "type": "_sbcs",
51140     "chars": "ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ "
51141   },
51142   "ibm857": "cp857",
51143   "csibm857": "cp857",
51144   "cp858": {
51145     "type": "_sbcs",
51146     "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈ€ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ "
51147   },
51148   "ibm858": "cp858",
51149   "csibm858": "cp858",
51150   "cp860": {
51151     "type": "_sbcs",
51152     "chars": "ÇüéâãàÁçêÊèÍÔìÃÂÉÀÈôõòÚùÌÕÜ¢£Ù₧ÓáíóúñѪº¿Ò¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
51153   },
51154   "ibm860": "cp860",
51155   "csibm860": "cp860",
51156   "cp861": {
51157     "type": "_sbcs",
51158     "chars": "ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
51159   },
51160   "ibm861": "cp861",
51161   "csibm861": "cp861",
51162   "cp862": {
51163     "type": "_sbcs",
51164     "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
51165   },
51166   "ibm862": "cp862",
51167   "csibm862": "cp862",
51168   "cp863": {
51169     "type": "_sbcs",
51170     "chars": "ÇüéâÂà¶çêëèïî‗À§ÉÈÊôËÏûù¤ÔÜ¢£ÙÛƒ¦´óú¨¸³¯Î⌐¬½¼¾«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
51171   },
51172   "ibm863": "cp863",
51173   "csibm863": "cp863",
51174   "cp864": {
51175     "type": "_sbcs",
51176     "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$٪&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f°·∙√▒─│┼┤┬├┴┐┌└┘β∞φ±½¼≈«»ﻷﻸ��ﻻﻼ� ­ﺂ£¤ﺄ��ﺎﺏﺕﺙ،ﺝﺡﺥ٠١٢٣٤٥٦٧٨٩ﻑ؛ﺱﺵﺹ؟¢ﺀﺁﺃﺅﻊﺋﺍﺑﺓﺗﺛﺟﺣﺧﺩﺫﺭﺯﺳﺷﺻﺿﻁﻅﻋﻏ¦¬÷×ﻉـﻓﻗﻛﻟﻣﻧﻫﻭﻯﻳﺽﻌﻎﻍﻡﹽّﻥﻩﻬﻰﻲﻐﻕﻵﻶﻝﻙﻱ■�"
51177   },
51178   "ibm864": "cp864",
51179   "csibm864": "cp864",
51180   "cp865": {
51181     "type": "_sbcs",
51182     "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
51183   },
51184   "ibm865": "cp865",
51185   "csibm865": "cp865",
51186   "cp866": {
51187     "type": "_sbcs",
51188     "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ "
51189   },
51190   "ibm866": "cp866",
51191   "csibm866": "cp866",
51192   "cp869": {
51193     "type": "_sbcs",
51194     "chars": "������Ά�·¬¦‘’Έ―ΉΊΪΌ��ΎΫ©Ώ²³ά£έήίϊΐόύΑΒΓΔΕΖΗ½ΘΙ«»░▒▓│┤ΚΛΜΝ╣║╗╝ΞΟ┐└┴┬├─┼ΠΡ╚╔╩╦╠═╬ΣΤΥΦΧΨΩαβγ┘┌█▄δε▀ζηθικλμνξοπρσςτ΄­±υφχ§ψ΅°¨ωϋΰώ■ "
51195   },
51196   "ibm869": "cp869",
51197   "csibm869": "cp869",
51198   "cp922": {
51199     "type": "_sbcs",
51200     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®‾°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŠÑÒÓÔÕÖ×ØÙÚÛÜÝŽßàáâãäåæçèéêëìíîïšñòóôõö÷øùúûüýžÿ"
51201   },
51202   "ibm922": "cp922",
51203   "csibm922": "cp922",
51204   "cp1046": {
51205     "type": "_sbcs",
51206     "chars": "ﺈ×÷ﹱˆ■│─┐┌└┘ﹹﹻﹽﹿﹷﺊﻰﻳﻲﻎﻏﻐﻶﻸﻺﻼ ¤ﺋﺑﺗﺛﺟﺣ،­ﺧﺳ٠١٢٣٤٥٦٧٨٩ﺷ؛ﺻﺿﻊ؟ﻋءآأؤإئابةتثجحخدذرزسشصضطﻇعغﻌﺂﺄﺎﻓـفقكلمنهوىيًٌٍَُِّْﻗﻛﻟﻵﻷﻹﻻﻣﻧﻬﻩ�"
51207   },
51208   "ibm1046": "cp1046",
51209   "csibm1046": "cp1046",
51210   "cp1124": {
51211     "type": "_sbcs",
51212     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂҐЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђґєѕіїјљњћќ§ўџ"
51213   },
51214   "ibm1124": "cp1124",
51215   "csibm1124": "cp1124",
51216   "cp1125": {
51217     "type": "_sbcs",
51218     "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёҐґЄєІіЇї·√№¤■ "
51219   },
51220   "ibm1125": "cp1125",
51221   "csibm1125": "cp1125",
51222   "cp1129": {
51223     "type": "_sbcs",
51224     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
51225   },
51226   "ibm1129": "cp1129",
51227   "csibm1129": "cp1129",
51228   "cp1133": {
51229     "type": "_sbcs",
51230     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ກຂຄງຈສຊຍດຕຖທນບປຜຝພຟມຢຣລວຫອຮ���ຯະາຳິີຶືຸູຼັົຽ���ເແໂໃໄ່້໊໋໌ໍໆ�ໜໝ₭����������������໐໑໒໓໔໕໖໗໘໙��¢¬¦�"
51231   },
51232   "ibm1133": "cp1133",
51233   "csibm1133": "cp1133",
51234   "cp1161": {
51235     "type": "_sbcs",
51236     "chars": "��������������������������������่กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู้๊๋€฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛¢¬¦ "
51237   },
51238   "ibm1161": "cp1161",
51239   "csibm1161": "cp1161",
51240   "cp1162": {
51241     "type": "_sbcs",
51242     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
51243   },
51244   "ibm1162": "cp1162",
51245   "csibm1162": "cp1162",
51246   "cp1163": {
51247     "type": "_sbcs",
51248     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£€¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
51249   },
51250   "ibm1163": "cp1163",
51251   "csibm1163": "cp1163",
51252   "maccroatian": {
51253     "type": "_sbcs",
51254     "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈Ć«Č… ÀÃÕŒœĐ—“”‘’÷◊�©⁄¤‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ"
51255   },
51256   "maccyrillic": {
51257     "type": "_sbcs",
51258     "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤"
51259   },
51260   "macgreek": {
51261     "type": "_sbcs",
51262     "chars": "Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�"
51263   },
51264   "maciceland": {
51265     "type": "_sbcs",
51266     "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüÝ°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
51267   },
51268   "macroman": {
51269     "type": "_sbcs",
51270     "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
51271   },
51272   "macromania": {
51273     "type": "_sbcs",
51274     "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂŞ∞±≤≥¥µ∂∑∏π∫ªºΩăş¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›Ţţ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
51275   },
51276   "macthai": {
51277     "type": "_sbcs",
51278     "chars": "«»…“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู​–—฿เแโใไๅๆ็่้๊๋์ํ™๏๐๑๒๓๔๕๖๗๘๙®©����"
51279   },
51280   "macturkish": {
51281     "type": "_sbcs",
51282     "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ"
51283   },
51284   "macukraine": {
51285     "type": "_sbcs",
51286     "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤"
51287   },
51288   "koi8r": {
51289     "type": "_sbcs",
51290     "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ё╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡Ё╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
51291   },
51292   "koi8u": {
51293     "type": "_sbcs",
51294     "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґ╝╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪Ґ╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
51295   },
51296   "koi8ru": {
51297     "type": "_sbcs",
51298     "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґў╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪ҐЎ©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
51299   },
51300   "koi8t": {
51301     "type": "_sbcs",
51302     "chars": "қғ‚Ғ„…†‡�‰ҳ‹ҲҷҶ�Қ‘’“”•–—�™�›�����ӯӮё¤ӣ¦§���«¬­®�°±²Ё�Ӣ¶·�№�»���©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
51303   },
51304   "armscii8": {
51305     "type": "_sbcs",
51306     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ �և։)(»«—.՝,-֊…՜՛՞ԱաԲբԳգԴդԵեԶզԷէԸըԹթԺժԻիԼլԽխԾծԿկՀհՁձՂղՃճՄմՅյՆնՇշՈոՉչՊպՋջՌռՍսՎվՏտՐրՑցՒւՓփՔքՕօՖֆ՚�"
51307   },
51308   "rk1048": {
51309     "type": "_sbcs",
51310     "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊҚҺЏђ‘’“”•–—�™љ›њқһџ ҰұӘ¤Ө¦§Ё©Ғ«¬­®Ү°±Ііөµ¶·ё№ғ»әҢңүАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
51311   },
51312   "tcvn": {
51313     "type": "_sbcs",
51314     "chars": "\u0000ÚỤ\u0003ỪỬỮ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010ỨỰỲỶỸÝỴ\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7fÀẢÃÁẠẶẬÈẺẼÉẸỆÌỈĨÍỊÒỎÕÓỌỘỜỞỠỚỢÙỦŨ ĂÂÊÔƠƯĐăâêôơưđẶ̀̀̉̃́àảãáạẲằẳẵắẴẮẦẨẪẤỀặầẩẫấậèỂẻẽéẹềểễếệìỉỄẾỒĩíịòỔỏõóọồổỗốộờởỡớợùỖủũúụừửữứựỳỷỹýỵỐ"
51315   },
51316   "georgianacademy": {
51317     "type": "_sbcs",
51318     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
51319   },
51320   "georgianps": {
51321     "type": "_sbcs",
51322     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზჱთიკლმნჲოპჟრსტჳუფქღყშჩცძწჭხჴჯჰჵæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
51323   },
51324   "pt154": {
51325     "type": "_sbcs",
51326     "chars": "ҖҒӮғ„…ҶҮҲүҠӢҢҚҺҸҗ‘’“”•–—ҳҷҡӣңқһҹ ЎўЈӨҘҰ§Ё©Ә«¬ӯ®Ҝ°ұІіҙө¶·ё№ә»јҪҫҝАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
51327   },
51328   "viscii": {
51329     "type": "_sbcs",
51330     "chars": "\u0000\u0001Ẳ\u0003\u0004ẴẪ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013Ỷ\u0015\u0016\u0017\u0018Ỹ\u001a\u001b\u001c\u001dỴ\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7fẠẮẰẶẤẦẨẬẼẸẾỀỂỄỆỐỒỔỖỘỢỚỜỞỊỎỌỈỦŨỤỲÕắằặấầẩậẽẹếềểễệốồổỗỠƠộờởịỰỨỪỬơớƯÀÁÂÃẢĂẳẵÈÉÊẺÌÍĨỳĐứÒÓÔạỷừửÙÚỹỵÝỡưàáâãảăữẫèéêẻìíĩỉđựòóôõỏọụùúũủýợỮ"
51331   },
51332   "iso646cn": {
51333     "type": "_sbcs",
51334     "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}‾\x7f��������������������������������������������������������������������������������������������������������������������������������"
51335   },
51336   "iso646jp": {
51337     "type": "_sbcs",
51338     "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghijklmnopqrstuvwxyz{|}‾\x7f��������������������������������������������������������������������������������������������������������������������������������"
51339   },
51340   "hproman8": {
51341     "type": "_sbcs",
51342     "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ÀÂÈÊËÎÏ´ˋˆ¨˜ÙÛ₤¯Ýý°ÇçÑñ¡¿¤£¥§ƒ¢âêôûáéóúàèòùäëöüÅîØÆåíøæÄìÖÜÉïßÔÁÃãÐðÍÌÓÒÕõŠšÚŸÿÞþ·µ¶¾—¼½ªº«■»±�"
51343   },
51344   "macintosh": {
51345     "type": "_sbcs",
51346     "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
51347   },
51348   "ascii": {
51349     "type": "_sbcs",
51350     "chars": "��������������������������������������������������������������������������������������������������������������������������������"
51351   },
51352   "tis620": {
51353     "type": "_sbcs",
51354     "chars": "���������������������������������กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
51355   }
51358 /***/ }),
51359 /* 178 */
51360 /***/ (function(module, exports, __webpack_require__) {
51362 "use strict";
51364 var Buffer = __webpack_require__(1).Buffer;
51366 // Multibyte codec. In this scheme, a character is represented by 1 or more bytes.
51367 // Our codec supports UTF-16 surrogates, extensions for GB18030 and unicode sequences.
51368 // To save memory and loading time, we read table files only when requested.
51370 exports._dbcs = DBCSCodec;
51372 var UNASSIGNED = -1,
51373     GB18030_CODE = -2,
51374     SEQ_START  = -10,
51375     NODE_START = -1000,
51376     UNASSIGNED_NODE = new Array(0x100),
51377     DEF_CHAR = -1;
51379 for (var i = 0; i < 0x100; i++)
51380     UNASSIGNED_NODE[i] = UNASSIGNED;
51383 // Class DBCSCodec reads and initializes mapping tables.
51384 function DBCSCodec(codecOptions, iconv) {
51385     this.encodingName = codecOptions.encodingName;
51386     if (!codecOptions)
51387         throw new Error("DBCS codec is called without the data.")
51388     if (!codecOptions.table)
51389         throw new Error("Encoding '" + this.encodingName + "' has no data.");
51391     // Load tables.
51392     var mappingTable = codecOptions.table();
51395     // Decode tables: MBCS -> Unicode.
51397     // decodeTables is a trie, encoded as an array of arrays of integers. Internal arrays are trie nodes and all have len = 256.
51398     // Trie root is decodeTables[0].
51399     // Values: >=  0 -> unicode character code. can be > 0xFFFF
51400     //         == UNASSIGNED -> unknown/unassigned sequence.
51401     //         == GB18030_CODE -> this is the end of a GB18030 4-byte sequence.
51402     //         <= NODE_START -> index of the next node in our trie to process next byte.
51403     //         <= SEQ_START  -> index of the start of a character code sequence, in decodeTableSeq.
51404     this.decodeTables = [];
51405     this.decodeTables[0] = UNASSIGNED_NODE.slice(0); // Create root node.
51407     // Sometimes a MBCS char corresponds to a sequence of unicode chars. We store them as arrays of integers here.
51408     this.decodeTableSeq = [];
51410     // Actual mapping tables consist of chunks. Use them to fill up decode tables.
51411     for (var i = 0; i < mappingTable.length; i++)
51412         this._addDecodeChunk(mappingTable[i]);
51414     this.defaultCharUnicode = iconv.defaultCharUnicode;
51417     // Encode tables: Unicode -> DBCS.
51419     // `encodeTable` is array mapping from unicode char to encoded char. All its values are integers for performance.
51420     // Because it can be sparse, it is represented as array of buckets by 256 chars each. Bucket can be null.
51421     // Values: >=  0 -> it is a normal char. Write the value (if <=256 then 1 byte, if <=65536 then 2 bytes, etc.).
51422     //         == UNASSIGNED -> no conversion found. Output a default char.
51423     //         <= SEQ_START  -> it's an index in encodeTableSeq, see below. The character starts a sequence.
51424     this.encodeTable = [];
51426     // `encodeTableSeq` is used when a sequence of unicode characters is encoded as a single code. We use a tree of
51427     // objects where keys correspond to characters in sequence and leafs are the encoded dbcs values. A special DEF_CHAR key
51428     // means end of sequence (needed when one sequence is a strict subsequence of another).
51429     // Objects are kept separately from encodeTable to increase performance.
51430     this.encodeTableSeq = [];
51432     // Some chars can be decoded, but need not be encoded.
51433     var skipEncodeChars = {};
51434     if (codecOptions.encodeSkipVals)
51435         for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) {
51436             var val = codecOptions.encodeSkipVals[i];
51437             if (typeof val === 'number')
51438                 skipEncodeChars[val] = true;
51439             else
51440                 for (var j = val.from; j <= val.to; j++)
51441                     skipEncodeChars[j] = true;
51442         }
51444     // Use decode trie to recursively fill out encode tables.
51445     this._fillEncodeTable(0, 0, skipEncodeChars);
51447     // Add more encoding pairs when needed.
51448     if (codecOptions.encodeAdd) {
51449         for (var uChar in codecOptions.encodeAdd)
51450             if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar))
51451                 this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]);
51452     }
51454     this.defCharSB  = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)];
51455     if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]['?'];
51456     if (this.defCharSB === UNASSIGNED) this.defCharSB = "?".charCodeAt(0);
51459     // Load & create GB18030 tables when needed.
51460     if (typeof codecOptions.gb18030 === 'function') {
51461         this.gb18030 = codecOptions.gb18030(); // Load GB18030 ranges.
51463         // Add GB18030 decode tables.
51464         var thirdByteNodeIdx = this.decodeTables.length;
51465         var thirdByteNode = this.decodeTables[thirdByteNodeIdx] = UNASSIGNED_NODE.slice(0);
51467         var fourthByteNodeIdx = this.decodeTables.length;
51468         var fourthByteNode = this.decodeTables[fourthByteNodeIdx] = UNASSIGNED_NODE.slice(0);
51470         for (var i = 0x81; i <= 0xFE; i++) {
51471             var secondByteNodeIdx = NODE_START - this.decodeTables[0][i];
51472             var secondByteNode = this.decodeTables[secondByteNodeIdx];
51473             for (var j = 0x30; j <= 0x39; j++)
51474                 secondByteNode[j] = NODE_START - thirdByteNodeIdx;
51475         }
51476         for (var i = 0x81; i <= 0xFE; i++)
51477             thirdByteNode[i] = NODE_START - fourthByteNodeIdx;
51478         for (var i = 0x30; i <= 0x39; i++)
51479             fourthByteNode[i] = GB18030_CODE
51480     }
51483 DBCSCodec.prototype.encoder = DBCSEncoder;
51484 DBCSCodec.prototype.decoder = DBCSDecoder;
51486 // Decoder helpers
51487 DBCSCodec.prototype._getDecodeTrieNode = function(addr) {
51488     var bytes = [];
51489     for (; addr > 0; addr >>= 8)
51490         bytes.push(addr & 0xFF);
51491     if (bytes.length == 0)
51492         bytes.push(0);
51494     var node = this.decodeTables[0];
51495     for (var i = bytes.length-1; i > 0; i--) { // Traverse nodes deeper into the trie.
51496         var val = node[bytes[i]];
51498         if (val == UNASSIGNED) { // Create new node.
51499             node[bytes[i]] = NODE_START - this.decodeTables.length;
51500             this.decodeTables.push(node = UNASSIGNED_NODE.slice(0));
51501         }
51502         else if (val <= NODE_START) { // Existing node.
51503             node = this.decodeTables[NODE_START - val];
51504         }
51505         else
51506             throw new Error("Overwrite byte in " + this.encodingName + ", addr: " + addr.toString(16));
51507     }
51508     return node;
51512 DBCSCodec.prototype._addDecodeChunk = function(chunk) {
51513     // First element of chunk is the hex mbcs code where we start.
51514     var curAddr = parseInt(chunk[0], 16);
51516     // Choose the decoding node where we'll write our chars.
51517     var writeTable = this._getDecodeTrieNode(curAddr);
51518     curAddr = curAddr & 0xFF;
51520     // Write all other elements of the chunk to the table.
51521     for (var k = 1; k < chunk.length; k++) {
51522         var part = chunk[k];
51523         if (typeof part === "string") { // String, write as-is.
51524             for (var l = 0; l < part.length;) {
51525                 var code = part.charCodeAt(l++);
51526                 if (0xD800 <= code && code < 0xDC00) { // Decode surrogate
51527                     var codeTrail = part.charCodeAt(l++);
51528                     if (0xDC00 <= codeTrail && codeTrail < 0xE000)
51529                         writeTable[curAddr++] = 0x10000 + (code - 0xD800) * 0x400 + (codeTrail - 0xDC00);
51530                     else
51531                         throw new Error("Incorrect surrogate pair in "  + this.encodingName + " at chunk " + chunk[0]);
51532                 }
51533                 else if (0x0FF0 < code && code <= 0x0FFF) { // Character sequence (our own encoding used)
51534                     var len = 0xFFF - code + 2;
51535                     var seq = [];
51536                     for (var m = 0; m < len; m++)
51537                         seq.push(part.charCodeAt(l++)); // Simple variation: don't support surrogates or subsequences in seq.
51539                     writeTable[curAddr++] = SEQ_START - this.decodeTableSeq.length;
51540                     this.decodeTableSeq.push(seq);
51541                 }
51542                 else
51543                     writeTable[curAddr++] = code; // Basic char
51544             }
51545         }
51546         else if (typeof part === "number") { // Integer, meaning increasing sequence starting with prev character.
51547             var charCode = writeTable[curAddr - 1] + 1;
51548             for (var l = 0; l < part; l++)
51549                 writeTable[curAddr++] = charCode++;
51550         }
51551         else
51552             throw new Error("Incorrect type '" + typeof part + "' given in "  + this.encodingName + " at chunk " + chunk[0]);
51553     }
51554     if (curAddr > 0xFF)
51555         throw new Error("Incorrect chunk in "  + this.encodingName + " at addr " + chunk[0] + ": too long" + curAddr);
51558 // Encoder helpers
51559 DBCSCodec.prototype._getEncodeBucket = function(uCode) {
51560     var high = uCode >> 8; // This could be > 0xFF because of astral characters.
51561     if (this.encodeTable[high] === undefined)
51562         this.encodeTable[high] = UNASSIGNED_NODE.slice(0); // Create bucket on demand.
51563     return this.encodeTable[high];
51566 DBCSCodec.prototype._setEncodeChar = function(uCode, dbcsCode) {
51567     var bucket = this._getEncodeBucket(uCode);
51568     var low = uCode & 0xFF;
51569     if (bucket[low] <= SEQ_START)
51570         this.encodeTableSeq[SEQ_START-bucket[low]][DEF_CHAR] = dbcsCode; // There's already a sequence, set a single-char subsequence of it.
51571     else if (bucket[low] == UNASSIGNED)
51572         bucket[low] = dbcsCode;
51575 DBCSCodec.prototype._setEncodeSequence = function(seq, dbcsCode) {
51577     // Get the root of character tree according to first character of the sequence.
51578     var uCode = seq[0];
51579     var bucket = this._getEncodeBucket(uCode);
51580     var low = uCode & 0xFF;
51582     var node;
51583     if (bucket[low] <= SEQ_START) {
51584         // There's already a sequence with  - use it.
51585         node = this.encodeTableSeq[SEQ_START-bucket[low]];
51586     }
51587     else {
51588         // There was no sequence object - allocate a new one.
51589         node = {};
51590         if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; // If a char was set before - make it a single-char subsequence.
51591         bucket[low] = SEQ_START - this.encodeTableSeq.length;
51592         this.encodeTableSeq.push(node);
51593     }
51595     // Traverse the character tree, allocating new nodes as needed.
51596     for (var j = 1; j < seq.length-1; j++) {
51597         var oldVal = node[uCode];
51598         if (typeof oldVal === 'object')
51599             node = oldVal;
51600         else {
51601             node = node[uCode] = {}
51602             if (oldVal !== undefined)
51603                 node[DEF_CHAR] = oldVal
51604         }
51605     }
51607     // Set the leaf to given dbcsCode.
51608     uCode = seq[seq.length-1];
51609     node[uCode] = dbcsCode;
51612 DBCSCodec.prototype._fillEncodeTable = function(nodeIdx, prefix, skipEncodeChars) {
51613     var node = this.decodeTables[nodeIdx];
51614     for (var i = 0; i < 0x100; i++) {
51615         var uCode = node[i];
51616         var mbCode = prefix + i;
51617         if (skipEncodeChars[mbCode])
51618             continue;
51620         if (uCode >= 0)
51621             this._setEncodeChar(uCode, mbCode);
51622         else if (uCode <= NODE_START)
51623             this._fillEncodeTable(NODE_START - uCode, mbCode << 8, skipEncodeChars);
51624         else if (uCode <= SEQ_START)
51625             this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode);
51626     }
51631 // == Encoder ==================================================================
51633 function DBCSEncoder(options, codec) {
51634     // Encoder state
51635     this.leadSurrogate = -1;
51636     this.seqObj = undefined;
51638     // Static data
51639     this.encodeTable = codec.encodeTable;
51640     this.encodeTableSeq = codec.encodeTableSeq;
51641     this.defaultCharSingleByte = codec.defCharSB;
51642     this.gb18030 = codec.gb18030;
51645 DBCSEncoder.prototype.write = function(str) {
51646     var newBuf = new Buffer(str.length * (this.gb18030 ? 4 : 3)),
51647         leadSurrogate = this.leadSurrogate,
51648         seqObj = this.seqObj, nextChar = -1,
51649         i = 0, j = 0;
51651     while (true) {
51652         // 0. Get next character.
51653         if (nextChar === -1) {
51654             if (i == str.length) break;
51655             var uCode = str.charCodeAt(i++);
51656         }
51657         else {
51658             var uCode = nextChar;
51659             nextChar = -1;
51660         }
51662         // 1. Handle surrogates.
51663         if (0xD800 <= uCode && uCode < 0xE000) { // Char is one of surrogates.
51664             if (uCode < 0xDC00) { // We've got lead surrogate.
51665                 if (leadSurrogate === -1) {
51666                     leadSurrogate = uCode;
51667                     continue;
51668                 } else {
51669                     leadSurrogate = uCode;
51670                     // Double lead surrogate found.
51671                     uCode = UNASSIGNED;
51672                 }
51673             } else { // We've got trail surrogate.
51674                 if (leadSurrogate !== -1) {
51675                     uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00);
51676                     leadSurrogate = -1;
51677                 } else {
51678                     // Incomplete surrogate pair - only trail surrogate found.
51679                     uCode = UNASSIGNED;
51680                 }
51682             }
51683         }
51684         else if (leadSurrogate !== -1) {
51685             // Incomplete surrogate pair - only lead surrogate found.
51686             nextChar = uCode; uCode = UNASSIGNED; // Write an error, then current char.
51687             leadSurrogate = -1;
51688         }
51690         // 2. Convert uCode character.
51691         var dbcsCode = UNASSIGNED;
51692         if (seqObj !== undefined && uCode != UNASSIGNED) { // We are in the middle of the sequence
51693             var resCode = seqObj[uCode];
51694             if (typeof resCode === 'object') { // Sequence continues.
51695                 seqObj = resCode;
51696                 continue;
51698             } else if (typeof resCode == 'number') { // Sequence finished. Write it.
51699                 dbcsCode = resCode;
51701             } else if (resCode == undefined) { // Current character is not part of the sequence.
51703                 // Try default character for this sequence
51704                 resCode = seqObj[DEF_CHAR];
51705                 if (resCode !== undefined) {
51706                     dbcsCode = resCode; // Found. Write it.
51707                     nextChar = uCode; // Current character will be written too in the next iteration.
51709                 } else {
51710                     // TODO: What if we have no default? (resCode == undefined)
51711                     // Then, we should write first char of the sequence as-is and try the rest recursively.
51712                     // Didn't do it for now because no encoding has this situation yet.
51713                     // Currently, just skip the sequence and write current char.
51714                 }
51715             }
51716             seqObj = undefined;
51717         }
51718         else if (uCode >= 0) {  // Regular character
51719             var subtable = this.encodeTable[uCode >> 8];
51720             if (subtable !== undefined)
51721                 dbcsCode = subtable[uCode & 0xFF];
51723             if (dbcsCode <= SEQ_START) { // Sequence start
51724                 seqObj = this.encodeTableSeq[SEQ_START-dbcsCode];
51725                 continue;
51726             }
51728             if (dbcsCode == UNASSIGNED && this.gb18030) {
51729                 // Use GB18030 algorithm to find character(s) to write.
51730                 var idx = findIdx(this.gb18030.uChars, uCode);
51731                 if (idx != -1) {
51732                     var dbcsCode = this.gb18030.gbChars[idx] + (uCode - this.gb18030.uChars[idx]);
51733                     newBuf[j++] = 0x81 + Math.floor(dbcsCode / 12600); dbcsCode = dbcsCode % 12600;
51734                     newBuf[j++] = 0x30 + Math.floor(dbcsCode / 1260); dbcsCode = dbcsCode % 1260;
51735                     newBuf[j++] = 0x81 + Math.floor(dbcsCode / 10); dbcsCode = dbcsCode % 10;
51736                     newBuf[j++] = 0x30 + dbcsCode;
51737                     continue;
51738                 }
51739             }
51740         }
51742         // 3. Write dbcsCode character.
51743         if (dbcsCode === UNASSIGNED)
51744             dbcsCode = this.defaultCharSingleByte;
51746         if (dbcsCode < 0x100) {
51747             newBuf[j++] = dbcsCode;
51748         }
51749         else if (dbcsCode < 0x10000) {
51750             newBuf[j++] = dbcsCode >> 8;   // high byte
51751             newBuf[j++] = dbcsCode & 0xFF; // low byte
51752         }
51753         else {
51754             newBuf[j++] = dbcsCode >> 16;
51755             newBuf[j++] = (dbcsCode >> 8) & 0xFF;
51756             newBuf[j++] = dbcsCode & 0xFF;
51757         }
51758     }
51760     this.seqObj = seqObj;
51761     this.leadSurrogate = leadSurrogate;
51762     return newBuf.slice(0, j);
51765 DBCSEncoder.prototype.end = function() {
51766     if (this.leadSurrogate === -1 && this.seqObj === undefined)
51767         return; // All clean. Most often case.
51769     var newBuf = new Buffer(10), j = 0;
51771     if (this.seqObj) { // We're in the sequence.
51772         var dbcsCode = this.seqObj[DEF_CHAR];
51773         if (dbcsCode !== undefined) { // Write beginning of the sequence.
51774             if (dbcsCode < 0x100) {
51775                 newBuf[j++] = dbcsCode;
51776             }
51777             else {
51778                 newBuf[j++] = dbcsCode >> 8;   // high byte
51779                 newBuf[j++] = dbcsCode & 0xFF; // low byte
51780             }
51781         } else {
51782             // See todo above.
51783         }
51784         this.seqObj = undefined;
51785     }
51787     if (this.leadSurrogate !== -1) {
51788         // Incomplete surrogate pair - only lead surrogate found.
51789         newBuf[j++] = this.defaultCharSingleByte;
51790         this.leadSurrogate = -1;
51791     }
51793     return newBuf.slice(0, j);
51796 // Export for testing
51797 DBCSEncoder.prototype.findIdx = findIdx;
51800 // == Decoder ==================================================================
51802 function DBCSDecoder(options, codec) {
51803     // Decoder state
51804     this.nodeIdx = 0;
51805     this.prevBuf = new Buffer(0);
51807     // Static data
51808     this.decodeTables = codec.decodeTables;
51809     this.decodeTableSeq = codec.decodeTableSeq;
51810     this.defaultCharUnicode = codec.defaultCharUnicode;
51811     this.gb18030 = codec.gb18030;
51814 DBCSDecoder.prototype.write = function(buf) {
51815     var newBuf = new Buffer(buf.length*2),
51816         nodeIdx = this.nodeIdx,
51817         prevBuf = this.prevBuf, prevBufOffset = this.prevBuf.length,
51818         seqStart = -this.prevBuf.length, // idx of the start of current parsed sequence.
51819         uCode;
51821     if (prevBufOffset > 0) // Make prev buf overlap a little to make it easier to slice later.
51822         prevBuf = Buffer.concat([prevBuf, buf.slice(0, 10)]);
51824     for (var i = 0, j = 0; i < buf.length; i++) {
51825         var curByte = (i >= 0) ? buf[i] : prevBuf[i + prevBufOffset];
51827         // Lookup in current trie node.
51828         var uCode = this.decodeTables[nodeIdx][curByte];
51830         if (uCode >= 0) {
51831             // Normal character, just use it.
51832         }
51833         else if (uCode === UNASSIGNED) { // Unknown char.
51834             // TODO: Callback with seq.
51835             //var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);
51836             i = seqStart; // Try to parse again, after skipping first byte of the sequence ('i' will be incremented by 'for' cycle).
51837             uCode = this.defaultCharUnicode.charCodeAt(0);
51838         }
51839         else if (uCode === GB18030_CODE) {
51840             var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);
51841             var ptr = (curSeq[0]-0x81)*12600 + (curSeq[1]-0x30)*1260 + (curSeq[2]-0x81)*10 + (curSeq[3]-0x30);
51842             var idx = findIdx(this.gb18030.gbChars, ptr);
51843             uCode = this.gb18030.uChars[idx] + ptr - this.gb18030.gbChars[idx];
51844         }
51845         else if (uCode <= NODE_START) { // Go to next trie node.
51846             nodeIdx = NODE_START - uCode;
51847             continue;
51848         }
51849         else if (uCode <= SEQ_START) { // Output a sequence of chars.
51850             var seq = this.decodeTableSeq[SEQ_START - uCode];
51851             for (var k = 0; k < seq.length - 1; k++) {
51852                 uCode = seq[k];
51853                 newBuf[j++] = uCode & 0xFF;
51854                 newBuf[j++] = uCode >> 8;
51855             }
51856             uCode = seq[seq.length-1];
51857         }
51858         else
51859             throw new Error("iconv-lite internal error: invalid decoding table value " + uCode + " at " + nodeIdx + "/" + curByte);
51861         // Write the character to buffer, handling higher planes using surrogate pair.
51862         if (uCode > 0xFFFF) {
51863             uCode -= 0x10000;
51864             var uCodeLead = 0xD800 + Math.floor(uCode / 0x400);
51865             newBuf[j++] = uCodeLead & 0xFF;
51866             newBuf[j++] = uCodeLead >> 8;
51868             uCode = 0xDC00 + uCode % 0x400;
51869         }
51870         newBuf[j++] = uCode & 0xFF;
51871         newBuf[j++] = uCode >> 8;
51873         // Reset trie node.
51874         nodeIdx = 0; seqStart = i+1;
51875     }
51877     this.nodeIdx = nodeIdx;
51878     this.prevBuf = (seqStart >= 0) ? buf.slice(seqStart) : prevBuf.slice(seqStart + prevBufOffset);
51879     return newBuf.slice(0, j).toString('ucs2');
51882 DBCSDecoder.prototype.end = function() {
51883     var ret = '';
51885     // Try to parse all remaining chars.
51886     while (this.prevBuf.length > 0) {
51887         // Skip 1 character in the buffer.
51888         ret += this.defaultCharUnicode;
51889         var buf = this.prevBuf.slice(1);
51891         // Parse remaining as usual.
51892         this.prevBuf = new Buffer(0);
51893         this.nodeIdx = 0;
51894         if (buf.length > 0)
51895             ret += this.write(buf);
51896     }
51898     this.nodeIdx = 0;
51899     return ret;
51902 // Binary search for GB18030. Returns largest i such that table[i] <= val.
51903 function findIdx(table, val) {
51904     if (table[0] > val)
51905         return -1;
51907     var l = 0, r = table.length;
51908     while (l < r-1) { // always table[l] <= val < table[r]
51909         var mid = l + Math.floor((r-l+1)/2);
51910         if (table[mid] <= val)
51911             l = mid;
51912         else
51913             r = mid;
51914     }
51915     return l;
51920 /***/ }),
51921 /* 179 */
51922 /***/ (function(module, exports, __webpack_require__) {
51924 "use strict";
51927 // Description of supported double byte encodings and aliases.
51928 // Tables are not require()-d until they are needed to speed up library load.
51929 // require()-s are direct to support Browserify.
51931 module.exports = {
51933     // == Japanese/ShiftJIS ====================================================
51934     // All japanese encodings are based on JIS X set of standards:
51935     // JIS X 0201 - Single-byte encoding of ASCII + ¥ + Kana chars at 0xA1-0xDF.
51936     // JIS X 0208 - Main set of 6879 characters, placed in 94x94 plane, to be encoded by 2 bytes.
51937     //              Has several variations in 1978, 1983, 1990 and 1997.
51938     // JIS X 0212 - Supplementary plane of 6067 chars in 94x94 plane. 1990. Effectively dead.
51939     // JIS X 0213 - Extension and modern replacement of 0208 and 0212. Total chars: 11233.
51940     //              2 planes, first is superset of 0208, second - revised 0212.
51941     //              Introduced in 2000, revised 2004. Some characters are in Unicode Plane 2 (0x2xxxx)
51943     // Byte encodings are:
51944     //  * Shift_JIS: Compatible with 0201, uses not defined chars in top half as lead bytes for double-byte
51945     //               encoding of 0208. Lead byte ranges: 0x81-0x9F, 0xE0-0xEF; Trail byte ranges: 0x40-0x7E, 0x80-0x9E, 0x9F-0xFC.
51946     //               Windows CP932 is a superset of Shift_JIS. Some companies added more chars, notably KDDI.
51947     //  * EUC-JP:    Up to 3 bytes per character. Used mostly on *nixes.
51948     //               0x00-0x7F       - lower part of 0201
51949     //               0x8E, 0xA1-0xDF - upper part of 0201
51950     //               (0xA1-0xFE)x2   - 0208 plane (94x94).
51951     //               0x8F, (0xA1-0xFE)x2 - 0212 plane (94x94).
51952     //  * JIS X 208: 7-bit, direct encoding of 0208. Byte ranges: 0x21-0x7E (94 values). Uncommon.
51953     //               Used as-is in ISO2022 family.
51954     //  * ISO2022-JP: Stateful encoding, with escape sequences to switch between ASCII,
51955     //                0201-1976 Roman, 0208-1978, 0208-1983.
51956     //  * ISO2022-JP-1: Adds esc seq for 0212-1990.
51957     //  * ISO2022-JP-2: Adds esc seq for GB2313-1980, KSX1001-1992, ISO8859-1, ISO8859-7.
51958     //  * ISO2022-JP-3: Adds esc seq for 0201-1976 Kana set, 0213-2000 Planes 1, 2.
51959     //  * ISO2022-JP-2004: Adds 0213-2004 Plane 1.
51960     //
51961     // After JIS X 0213 appeared, Shift_JIS-2004, EUC-JISX0213 and ISO2022-JP-2004 followed, with just changing the planes.
51962     //
51963     // Overall, it seems that it's a mess :( http://www8.plala.or.jp/tkubota1/unicode-symbols-map2.html
51965     'shiftjis': {
51966         type: '_dbcs',
51967         table: function() { return __webpack_require__(180) },
51968         encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E},
51969         encodeSkipVals: [{from: 0xED40, to: 0xF940}],
51970     },
51971     'csshiftjis': 'shiftjis',
51972     'mskanji': 'shiftjis',
51973     'sjis': 'shiftjis',
51974     'windows31j': 'shiftjis',
51975     'ms31j': 'shiftjis',
51976     'xsjis': 'shiftjis',
51977     'windows932': 'shiftjis',
51978     'ms932': 'shiftjis',
51979     '932': 'shiftjis',
51980     'cp932': 'shiftjis',
51982     'eucjp': {
51983         type: '_dbcs',
51984         table: function() { return __webpack_require__(181) },
51985         encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E},
51986     },
51988     // TODO: KDDI extension to Shift_JIS
51989     // TODO: IBM CCSID 942 = CP932, but F0-F9 custom chars and other char changes.
51990     // TODO: IBM CCSID 943 = Shift_JIS = CP932 with original Shift_JIS lower 128 chars.
51993     // == Chinese/GBK ==========================================================
51994     // http://en.wikipedia.org/wiki/GBK
51995     // We mostly implement W3C recommendation: https://www.w3.org/TR/encoding/#gbk-encoder
51997     // Oldest GB2312 (1981, ~7600 chars) is a subset of CP936
51998     'gb2312': 'cp936',
51999     'gb231280': 'cp936',
52000     'gb23121980': 'cp936',
52001     'csgb2312': 'cp936',
52002     'csiso58gb231280': 'cp936',
52003     'euccn': 'cp936',
52005     // Microsoft's CP936 is a subset and approximation of GBK.
52006     'windows936': 'cp936',
52007     'ms936': 'cp936',
52008     '936': 'cp936',
52009     'cp936': {
52010         type: '_dbcs',
52011         table: function() { return __webpack_require__(53) },
52012     },
52014     // GBK (~22000 chars) is an extension of CP936 that added user-mapped chars and some other.
52015     'gbk': {
52016         type: '_dbcs',
52017         table: function() { return __webpack_require__(53).concat(__webpack_require__(91)) },
52018     },
52019     'xgbk': 'gbk',
52020     'isoir58': 'gbk',
52022     // GB18030 is an algorithmic extension of GBK.
52023     // Main source: https://www.w3.org/TR/encoding/#gbk-encoder
52024     // http://icu-project.org/docs/papers/gb18030.html
52025     // http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml
52026     // http://www.khngai.com/chinese/charmap/tblgbk.php?page=0
52027     'gb18030': {
52028         type: '_dbcs',
52029         table: function() { return __webpack_require__(53).concat(__webpack_require__(91)) },
52030         gb18030: function() { return __webpack_require__(182) },
52031         encodeSkipVals: [0x80],
52032         encodeAdd: {'€': 0xA2E3},
52033     },
52035     'chinese': 'gb18030',
52038     // == Korean ===============================================================
52039     // EUC-KR, KS_C_5601 and KS X 1001 are exactly the same.
52040     'windows949': 'cp949',
52041     'ms949': 'cp949',
52042     '949': 'cp949',
52043     'cp949': {
52044         type: '_dbcs',
52045         table: function() { return __webpack_require__(183) },
52046     },
52048     'cseuckr': 'cp949',
52049     'csksc56011987': 'cp949',
52050     'euckr': 'cp949',
52051     'isoir149': 'cp949',
52052     'korean': 'cp949',
52053     'ksc56011987': 'cp949',
52054     'ksc56011989': 'cp949',
52055     'ksc5601': 'cp949',
52058     // == Big5/Taiwan/Hong Kong ================================================
52059     // There are lots of tables for Big5 and cp950. Please see the following links for history:
52060     // http://moztw.org/docs/big5/  http://www.haible.de/bruno/charsets/conversion-tables/Big5.html
52061     // Variations, in roughly number of defined chars:
52062     //  * Windows CP 950: Microsoft variant of Big5. Canonical: http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT
52063     //  * Windows CP 951: Microsoft variant of Big5-HKSCS-2001. Seems to be never public. http://me.abelcheung.org/articles/research/what-is-cp951/
52064     //  * Big5-2003 (Taiwan standard) almost superset of cp950.
52065     //  * Unicode-at-on (UAO) / Mozilla 1.8. Falling out of use on the Web. Not supported by other browsers.
52066     //  * Big5-HKSCS (-2001, -2004, -2008). Hong Kong standard.
52067     //    many unicode code points moved from PUA to Supplementary plane (U+2XXXX) over the years.
52068     //    Plus, it has 4 combining sequences.
52069     //    Seems that Mozilla refused to support it for 10 yrs. https://bugzilla.mozilla.org/show_bug.cgi?id=162431 https://bugzilla.mozilla.org/show_bug.cgi?id=310299
52070     //    because big5-hkscs is the only encoding to include astral characters in non-algorithmic way.
52071     //    Implementations are not consistent within browsers; sometimes labeled as just big5.
52072     //    MS Internet Explorer switches from big5 to big5-hkscs when a patch applied.
52073     //    Great discussion & recap of what's going on https://bugzilla.mozilla.org/show_bug.cgi?id=912470#c31
52074     //    In the encoder, it might make sense to support encoding old PUA mappings to Big5 bytes seq-s.
52075     //    Official spec: http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/terms/doc/2003cmp_2008.txt
52076     //                   http://www.ogcio.gov.hk/tc/business/tech_promotion/ccli/terms/doc/hkscs-2008-big5-iso.txt
52077     //
52078     // Current understanding of how to deal with Big5(-HKSCS) is in the Encoding Standard, http://encoding.spec.whatwg.org/#big5-encoder
52079     // Unicode mapping (http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT) is said to be wrong.
52081     'windows950': 'cp950',
52082     'ms950': 'cp950',
52083     '950': 'cp950',
52084     'cp950': {
52085         type: '_dbcs',
52086         table: function() { return __webpack_require__(92) },
52087     },
52089     // Big5 has many variations and is an extension of cp950. We use Encoding Standard's as a consensus.
52090     'big5': 'big5hkscs',
52091     'big5hkscs': {
52092         type: '_dbcs',
52093         table: function() { return __webpack_require__(92).concat(__webpack_require__(184)) },
52094         encodeSkipVals: [0xa2cc],
52095     },
52097     'cnbig5': 'big5hkscs',
52098     'csbig5': 'big5hkscs',
52099     'xxbig5': 'big5hkscs',
52103 /***/ }),
52104 /* 180 */
52105 /***/ (function(module, exports) {
52107 module.exports = [["0","\u0000",128],["a1","。",62],["8140"," 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈",9,"+-±×"],["8180","÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓"],["81b8","∈∋⊆⊇⊂⊃∪∩"],["81c8","∧∨¬⇒⇔∀∃"],["81da","∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬"],["81f0","ʼn♯♭♪†‡¶"],["81fc","◯"],["824f","0",9],["8260","A",25],["8281","a",25],["829f","ぁ",82],["8340","ァ",62],["8380","ム",22],["839f","Α",16,"Σ",6],["83bf","α",16,"σ",6],["8440","А",5,"ЁЖ",25],["8470","а",5,"ёж",7],["8480","о",17],["849f","─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂"],["8740","①",19,"Ⅰ",9],["875f","㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡"],["877e","㍻"],["8780","〝〟№㏍℡㊤",4,"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪"],["889f","亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭"],["8940","院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円"],["8980","園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改"],["8a40","魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫"],["8a80","橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄"],["8b40","機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救"],["8b80","朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈"],["8c40","掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨"],["8c80","劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向"],["8d40","后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降"],["8d80","項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷"],["8e40","察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止"],["8e80","死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周"],["8f40","宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳"],["8f80","準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾"],["9040","拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨"],["9080","逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線"],["9140","繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻"],["9180","操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只"],["9240","叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄"],["9280","逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓"],["9340","邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬"],["9380","凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入"],["9440","如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅"],["9480","楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美"],["9540","鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷"],["9580","斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋"],["9640","法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆"],["9680","摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒"],["9740","諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲"],["9780","沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯"],["9840","蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕"],["989f","弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲"],["9940","僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭"],["9980","凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨"],["9a40","咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸"],["9a80","噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩"],["9b40","奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀"],["9b80","它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏"],["9c40","廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠"],["9c80","怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛"],["9d40","戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫"],["9d80","捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼"],["9e40","曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎"],["9e80","梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣"],["9f40","檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯"],["9f80","麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌"],["e040","漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝"],["e080","烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱"],["e140","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿"],["e180","痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"],["e240","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰"],["e280","窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆"],["e340","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷"],["e380","縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋"],["e440","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤"],["e480","艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"],["e540","蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬"],["e580","蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞"],["e640","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧"],["e680","諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊"],["e740","蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜"],["e780","轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮"],["e840","錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙"],["e880","閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰"],["e940","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃"],["e980","騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈"],["ea40","鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯"],["ea80","黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙"],["ed40","纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏"],["ed80","塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱"],["ee40","犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙"],["ee80","蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"],["eeef","ⅰ",9,"¬¦'""],["f040","",62],["f080","",124],["f140","",62],["f180","",124],["f240","",62],["f280","",124],["f340","",62],["f380","",124],["f440","",62],["f480","",124],["f540","",62],["f580","",124],["f640","",62],["f680","",124],["f740","",62],["f780","",124],["f840","",62],["f880","",124],["f940",""],["fa40","ⅰ",9,"Ⅰ",9,"¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊"],["fa80","兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯"],["fb40","涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神"],["fb80","祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙"],["fc40","髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"]]
52109 /***/ }),
52110 /* 181 */
52111 /***/ (function(module, exports) {
52113 module.exports = [["0","\u0000",127],["8ea1","。",62],["a1a1"," 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈",9,"+-±×÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇"],["a2a1","◆□■△▲▽▼※〒→←↑↓〓"],["a2ba","∈∋⊆⊇⊂⊃∪∩"],["a2ca","∧∨¬⇒⇔∀∃"],["a2dc","∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬"],["a2f2","ʼn♯♭♪†‡¶"],["a2fe","◯"],["a3b0","0",9],["a3c1","A",25],["a3e1","a",25],["a4a1","ぁ",82],["a5a1","ァ",85],["a6a1","Α",16,"Σ",6],["a6c1","α",16,"σ",6],["a7a1","А",5,"ЁЖ",25],["a7d1","а",5,"ёж",25],["a8a1","─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂"],["ada1","①",19,"Ⅰ",9],["adc0","㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡"],["addf","㍻〝〟№㏍℡㊤",4,"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪"],["b0a1","亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭"],["b1a1","院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応"],["b2a1","押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改"],["b3a1","魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱"],["b4a1","粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄"],["b5a1","機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京"],["b6a1","供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈"],["b7a1","掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲"],["b8a1","検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向"],["b9a1","后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込"],["baa1","此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷"],["bba1","察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時"],["bca1","次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周"],["bda1","宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償"],["bea1","勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾"],["bfa1","拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾"],["c0a1","澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線"],["c1a1","繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎"],["c2a1","臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只"],["c3a1","叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵"],["c4a1","帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓"],["c5a1","邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到"],["c6a1","董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入"],["c7a1","如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦"],["c8a1","函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美"],["c9a1","鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服"],["caa1","福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋"],["cba1","法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満"],["cca1","漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒"],["cda1","諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃"],["cea1","痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯"],["cfa1","蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕"],["d0a1","弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲"],["d1a1","僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨"],["d2a1","辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨"],["d3a1","咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉"],["d4a1","圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩"],["d5a1","奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓"],["d6a1","屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏"],["d7a1","廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚"],["d8a1","悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛"],["d9a1","戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼"],["daa1","據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼"],["dba1","曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍"],["dca1","棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣"],["dda1","檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾"],["dea1","沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌"],["dfa1","漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼"],["e0a1","燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱"],["e1a1","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰"],["e2a1","癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"],["e3a1","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐"],["e4a1","筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆"],["e5a1","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺"],["e6a1","罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋"],["e7a1","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙"],["e8a1","茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"],["e9a1","蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙"],["eaa1","蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞"],["eba1","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫"],["eca1","譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊"],["eda1","蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸"],["eea1","遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮"],["efa1","錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞"],["f0a1","陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰"],["f1a1","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷"],["f2a1","髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈"],["f3a1","鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠"],["f4a1","堯槇遙瑤凜熙"],["f9a1","纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德"],["faa1","忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱"],["fba1","犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚"],["fca1","釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"],["fcf1","ⅰ",9,"¬¦'""],["8fa2af","˘ˇ¸˙˝¯˛˚~΄΅"],["8fa2c2","¡¦¿"],["8fa2eb","ºª©®™¤№"],["8fa6e1","ΆΈΉΊΪ"],["8fa6e7","Ό"],["8fa6e9","ΎΫ"],["8fa6ec","Ώ"],["8fa6f1","άέήίϊΐόςύϋΰώ"],["8fa7c2","Ђ",10,"ЎЏ"],["8fa7f2","ђ",10,"ўџ"],["8fa9a1","ÆĐ"],["8fa9a4","Ħ"],["8fa9a6","IJ"],["8fa9a8","ŁĿ"],["8fa9ab","ŊØŒ"],["8fa9af","ŦÞ"],["8fa9c1","æđðħıijĸłŀʼnŋøœßŧþ"],["8faaa1","ÁÀÄÂĂǍĀĄÅÃĆĈČÇĊĎÉÈËÊĚĖĒĘ"],["8faaba","ĜĞĢĠĤÍÌÏÎǏİĪĮĨĴĶĹĽĻŃŇŅÑÓÒÖÔǑŐŌÕŔŘŖŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙǕŴÝŸŶŹŽŻ"],["8faba1","áàäâăǎāąåãćĉčçċďéèëêěėēęǵĝğ"],["8fabbd","ġĥíìïîǐ"],["8fabc5","īįĩĵķĺľļńňņñóòöôǒőōõŕřŗśŝšşťţúùüûŭǔűūųůũǘǜǚǖŵýÿŷźžż"],["8fb0a1","丂丄丅丌丒丟丣两丨丫丮丯丰丵乀乁乄乇乑乚乜乣乨乩乴乵乹乿亍亖亗亝亯亹仃仐仚仛仠仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘佟佣佪佬佮佱佷佸佹佺佽佾侁侂侄"],["8fb1a1","侅侉侊侌侎侐侒侓侔侗侙侚侞侟侲侷侹侻侼侽侾俀俁俅俆俈俉俋俌俍俏俒俜俠俢俰俲俼俽俿倀倁倄倇倊倌倎倐倓倗倘倛倜倝倞倢倧倮倰倲倳倵偀偁偂偅偆偊偌偎偑偒偓偗偙偟偠偢偣偦偧偪偭偰偱倻傁傃傄傆傊傎傏傐"],["8fb2a1","傒傓傔傖傛傜傞",4,"傪傯傰傹傺傽僀僃僄僇僌僎僐僓僔僘僜僝僟僢僤僦僨僩僯僱僶僺僾儃儆儇儈儋儌儍儎僲儐儗儙儛儜儝儞儣儧儨儬儭儯儱儳儴儵儸儹兂兊兏兓兕兗兘兟兤兦兾冃冄冋冎冘冝冡冣冭冸冺冼冾冿凂"],["8fb3a1","凈减凑凒凓凕凘凞凢凥凮凲凳凴凷刁刂刅划刓刕刖刘刢刨刱刲刵刼剅剉剕剗剘剚剜剟剠剡剦剮剷剸剹劀劂劅劊劌劓劕劖劗劘劚劜劤劥劦劧劯劰劶劷劸劺劻劽勀勄勆勈勌勏勑勔勖勛勜勡勥勨勩勪勬勰勱勴勶勷匀匃匊匋"],["8fb4a1","匌匑匓匘匛匜匞匟匥匧匨匩匫匬匭匰匲匵匼匽匾卂卌卋卙卛卡卣卥卬卭卲卹卾厃厇厈厎厓厔厙厝厡厤厪厫厯厲厴厵厷厸厺厽叀叅叏叒叓叕叚叝叞叠另叧叵吂吓吚吡吧吨吪启吱吴吵呃呄呇呍呏呞呢呤呦呧呩呫呭呮呴呿"],["8fb5a1","咁咃咅咈咉咍咑咕咖咜咟咡咦咧咩咪咭咮咱咷咹咺咻咿哆哊响哎哠哪哬哯哶哼哾哿唀唁唅唈唉唌唍唎唕唪唫唲唵唶唻唼唽啁啇啉啊啍啐啑啘啚啛啞啠啡啤啦啿喁喂喆喈喎喏喑喒喓喔喗喣喤喭喲喿嗁嗃嗆嗉嗋嗌嗎嗑嗒"],["8fb6a1","嗓嗗嗘嗛嗞嗢嗩嗶嗿嘅嘈嘊嘍",5,"嘙嘬嘰嘳嘵嘷嘹嘻嘼嘽嘿噀噁噃噄噆噉噋噍噏噔噞噠噡噢噣噦噩噭噯噱噲噵嚄嚅嚈嚋嚌嚕嚙嚚嚝嚞嚟嚦嚧嚨嚩嚫嚬嚭嚱嚳嚷嚾囅囉囊囋囏囐囌囍囙囜囝囟囡囤",4,"囱囫园"],["8fb7a1","囶囷圁圂圇圊圌圑圕圚圛圝圠圢圣圤圥圩圪圬圮圯圳圴圽圾圿坅坆坌坍坒坢坥坧坨坫坭",4,"坳坴坵坷坹坺坻坼坾垁垃垌垔垗垙垚垜垝垞垟垡垕垧垨垩垬垸垽埇埈埌埏埕埝埞埤埦埧埩埭埰埵埶埸埽埾埿堃堄堈堉埡"],["8fb8a1","堌堍堛堞堟堠堦堧堭堲堹堿塉塌塍塏塐塕塟塡塤塧塨塸塼塿墀墁墇墈墉墊墌墍墏墐墔墖墝墠墡墢墦墩墱墲壄墼壂壈壍壎壐壒壔壖壚壝壡壢壩壳夅夆夋夌夒夓夔虁夝夡夣夤夨夯夰夳夵夶夿奃奆奒奓奙奛奝奞奟奡奣奫奭"],["8fb9a1","奯奲奵奶她奻奼妋妌妎妒妕妗妟妤妧妭妮妯妰妳妷妺妼姁姃姄姈姊姍姒姝姞姟姣姤姧姮姯姱姲姴姷娀娄娌娍娎娒娓娞娣娤娧娨娪娭娰婄婅婇婈婌婐婕婞婣婥婧婭婷婺婻婾媋媐媓媖媙媜媞媟媠媢媧媬媱媲媳媵媸媺媻媿"],["8fbaa1","嫄嫆嫈嫏嫚嫜嫠嫥嫪嫮嫵嫶嫽嬀嬁嬈嬗嬴嬙嬛嬝嬡嬥嬭嬸孁孋孌孒孖孞孨孮孯孼孽孾孿宁宄宆宊宎宐宑宓宔宖宨宩宬宭宯宱宲宷宺宼寀寁寍寏寖",4,"寠寯寱寴寽尌尗尞尟尣尦尩尫尬尮尰尲尵尶屙屚屜屢屣屧屨屩"],["8fbba1","屭屰屴屵屺屻屼屽岇岈岊岏岒岝岟岠岢岣岦岪岲岴岵岺峉峋峒峝峗峮峱峲峴崁崆崍崒崫崣崤崦崧崱崴崹崽崿嵂嵃嵆嵈嵕嵑嵙嵊嵟嵠嵡嵢嵤嵪嵭嵰嵹嵺嵾嵿嶁嶃嶈嶊嶒嶓嶔嶕嶙嶛嶟嶠嶧嶫嶰嶴嶸嶹巃巇巋巐巎巘巙巠巤"],["8fbca1","巩巸巹帀帇帍帒帔帕帘帟帠帮帨帲帵帾幋幐幉幑幖幘幛幜幞幨幪",4,"幰庀庋庎庢庤庥庨庪庬庱庳庽庾庿廆廌廋廎廑廒廔廕廜廞廥廫异弆弇弈弎弙弜弝弡弢弣弤弨弫弬弮弰弴弶弻弽弿彀彄彅彇彍彐彔彘彛彠彣彤彧"],["8fbda1","彯彲彴彵彸彺彽彾徉徍徏徖徜徝徢徧徫徤徬徯徰徱徸忄忇忈忉忋忐",4,"忞忡忢忨忩忪忬忭忮忯忲忳忶忺忼怇怊怍怓怔怗怘怚怟怤怭怳怵恀恇恈恉恌恑恔恖恗恝恡恧恱恾恿悂悆悈悊悎悑悓悕悘悝悞悢悤悥您悰悱悷"],["8fbea1","悻悾惂惄惈惉惊惋惎惏惔惕惙惛惝惞惢惥惲惵惸惼惽愂愇愊愌愐",4,"愖愗愙愜愞愢愪愫愰愱愵愶愷愹慁慅慆慉慞慠慬慲慸慻慼慿憀憁憃憄憋憍憒憓憗憘憜憝憟憠憥憨憪憭憸憹憼懀懁懂懎懏懕懜懝懞懟懡懢懧懩懥"],["8fbfa1","懬懭懯戁戃戄戇戓戕戜戠戢戣戧戩戫戹戽扂扃扄扆扌扐扑扒扔扖扚扜扤扭扯扳扺扽抍抎抏抐抦抨抳抶抷抺抾抿拄拎拕拖拚拪拲拴拼拽挃挄挊挋挍挐挓挖挘挩挪挭挵挶挹挼捁捂捃捄捆捊捋捎捒捓捔捘捛捥捦捬捭捱捴捵"],["8fc0a1","捸捼捽捿掂掄掇掊掐掔掕掙掚掞掤掦掭掮掯掽揁揅揈揎揑揓揔揕揜揠揥揪揬揲揳揵揸揹搉搊搐搒搔搘搞搠搢搤搥搩搪搯搰搵搽搿摋摏摑摒摓摔摚摛摜摝摟摠摡摣摭摳摴摻摽撅撇撏撐撑撘撙撛撝撟撡撣撦撨撬撳撽撾撿"],["8fc1a1","擄擉擊擋擌擎擐擑擕擗擤擥擩擪擭擰擵擷擻擿攁攄攈攉攊攏攓攔攖攙攛攞攟攢攦攩攮攱攺攼攽敃敇敉敐敒敔敟敠敧敫敺敽斁斅斊斒斕斘斝斠斣斦斮斲斳斴斿旂旈旉旎旐旔旖旘旟旰旲旴旵旹旾旿昀昄昈昉昍昑昒昕昖昝"],["8fc2a1","昞昡昢昣昤昦昩昪昫昬昮昰昱昳昹昷晀晅晆晊晌晑晎晗晘晙晛晜晠晡曻晪晫晬晾晳晵晿晷晸晹晻暀晼暋暌暍暐暒暙暚暛暜暟暠暤暭暱暲暵暻暿曀曂曃曈曌曎曏曔曛曟曨曫曬曮曺朅朇朎朓朙朜朠朢朳朾杅杇杈杌杔杕杝"],["8fc3a1","杦杬杮杴杶杻极构枎枏枑枓枖枘枙枛枰枱枲枵枻枼枽柹柀柂柃柅柈柉柒柗柙柜柡柦柰柲柶柷桒栔栙栝栟栨栧栬栭栯栰栱栳栻栿桄桅桊桌桕桗桘桛桫桮",4,"桵桹桺桻桼梂梄梆梈梖梘梚梜梡梣梥梩梪梮梲梻棅棈棌棏"],["8fc4a1","棐棑棓棖棙棜棝棥棨棪棫棬棭棰棱棵棶棻棼棽椆椉椊椐椑椓椖椗椱椳椵椸椻楂楅楉楎楗楛楣楤楥楦楨楩楬楰楱楲楺楻楿榀榍榒榖榘榡榥榦榨榫榭榯榷榸榺榼槅槈槑槖槗槢槥槮槯槱槳槵槾樀樁樃樏樑樕樚樝樠樤樨樰樲"],["8fc5a1","樴樷樻樾樿橅橆橉橊橎橐橑橒橕橖橛橤橧橪橱橳橾檁檃檆檇檉檋檑檛檝檞檟檥檫檯檰檱檴檽檾檿櫆櫉櫈櫌櫐櫔櫕櫖櫜櫝櫤櫧櫬櫰櫱櫲櫼櫽欂欃欆欇欉欏欐欑欗欛欞欤欨欫欬欯欵欶欻欿歆歊歍歒歖歘歝歠歧歫歮歰歵歽"],["8fc6a1","歾殂殅殗殛殟殠殢殣殨殩殬殭殮殰殸殹殽殾毃毄毉毌毖毚毡毣毦毧毮毱毷毹毿氂氄氅氉氍氎氐氒氙氟氦氧氨氬氮氳氵氶氺氻氿汊汋汍汏汒汔汙汛汜汫汭汯汴汶汸汹汻沅沆沇沉沔沕沗沘沜沟沰沲沴泂泆泍泏泐泑泒泔泖"],["8fc7a1","泚泜泠泧泩泫泬泮泲泴洄洇洊洎洏洑洓洚洦洧洨汧洮洯洱洹洼洿浗浞浟浡浥浧浯浰浼涂涇涑涒涔涖涗涘涪涬涴涷涹涽涿淄淈淊淎淏淖淛淝淟淠淢淥淩淯淰淴淶淼渀渄渞渢渧渲渶渹渻渼湄湅湈湉湋湏湑湒湓湔湗湜湝湞"],["8fc8a1","湢湣湨湳湻湽溍溓溙溠溧溭溮溱溳溻溿滀滁滃滇滈滊滍滎滏滫滭滮滹滻滽漄漈漊漌漍漖漘漚漛漦漩漪漯漰漳漶漻漼漭潏潑潒潓潗潙潚潝潞潡潢潨潬潽潾澃澇澈澋澌澍澐澒澓澔澖澚澟澠澥澦澧澨澮澯澰澵澶澼濅濇濈濊"],["8fc9a1","濚濞濨濩濰濵濹濼濽瀀瀅瀆瀇瀍瀗瀠瀣瀯瀴瀷瀹瀼灃灄灈灉灊灋灔灕灝灞灎灤灥灬灮灵灶灾炁炅炆炔",4,"炛炤炫炰炱炴炷烊烑烓烔烕烖烘烜烤烺焃",4,"焋焌焏焞焠焫焭焯焰焱焸煁煅煆煇煊煋煐煒煗煚煜煞煠"],["8fcaa1","煨煹熀熅熇熌熒熚熛熠熢熯熰熲熳熺熿燀燁燄燋燌燓燖燙燚燜燸燾爀爇爈爉爓爗爚爝爟爤爫爯爴爸爹牁牂牃牅牎牏牐牓牕牖牚牜牞牠牣牨牫牮牯牱牷牸牻牼牿犄犉犍犎犓犛犨犭犮犱犴犾狁狇狉狌狕狖狘狟狥狳狴狺狻"],["8fcba1","狾猂猄猅猇猋猍猒猓猘猙猞猢猤猧猨猬猱猲猵猺猻猽獃獍獐獒獖獘獝獞獟獠獦獧獩獫獬獮獯獱獷獹獼玀玁玃玅玆玎玐玓玕玗玘玜玞玟玠玢玥玦玪玫玭玵玷玹玼玽玿珅珆珉珋珌珏珒珓珖珙珝珡珣珦珧珩珴珵珷珹珺珻珽"],["8fcca1","珿琀琁琄琇琊琑琚琛琤琦琨",9,"琹瑀瑃瑄瑆瑇瑋瑍瑑瑒瑗瑝瑢瑦瑧瑨瑫瑭瑮瑱瑲璀璁璅璆璇璉璏璐璑璒璘璙璚璜璟璠璡璣璦璨璩璪璫璮璯璱璲璵璹璻璿瓈瓉瓌瓐瓓瓘瓚瓛瓞瓟瓤瓨瓪瓫瓯瓴瓺瓻瓼瓿甆"],["8fcda1","甒甖甗甠甡甤甧甩甪甯甶甹甽甾甿畀畃畇畈畎畐畒畗畞畟畡畯畱畹",5,"疁疅疐疒疓疕疙疜疢疤疴疺疿痀痁痄痆痌痎痏痗痜痟痠痡痤痧痬痮痯痱痹瘀瘂瘃瘄瘇瘈瘊瘌瘏瘒瘓瘕瘖瘙瘛瘜瘝瘞瘣瘥瘦瘩瘭瘲瘳瘵瘸瘹"],["8fcea1","瘺瘼癊癀癁癃癄癅癉癋癕癙癟癤癥癭癮癯癱癴皁皅皌皍皕皛皜皝皟皠皢",6,"皪皭皽盁盅盉盋盌盎盔盙盠盦盨盬盰盱盶盹盼眀眆眊眎眒眔眕眗眙眚眜眢眨眭眮眯眴眵眶眹眽眾睂睅睆睊睍睎睏睒睖睗睜睞睟睠睢"],["8fcfa1","睤睧睪睬睰睲睳睴睺睽瞀瞄瞌瞍瞔瞕瞖瞚瞟瞢瞧瞪瞮瞯瞱瞵瞾矃矉矑矒矕矙矞矟矠矤矦矪矬矰矱矴矸矻砅砆砉砍砎砑砝砡砢砣砭砮砰砵砷硃硄硇硈硌硎硒硜硞硠硡硣硤硨硪确硺硾碊碏碔碘碡碝碞碟碤碨碬碭碰碱碲碳"],["8fd0a1","碻碽碿磇磈磉磌磎磒磓磕磖磤磛磟磠磡磦磪磲磳礀磶磷磺磻磿礆礌礐礚礜礞礟礠礥礧礩礭礱礴礵礻礽礿祄祅祆祊祋祏祑祔祘祛祜祧祩祫祲祹祻祼祾禋禌禑禓禔禕禖禘禛禜禡禨禩禫禯禱禴禸离秂秄秇秈秊秏秔秖秚秝秞"],["8fd1a1","秠秢秥秪秫秭秱秸秼稂稃稇稉稊稌稑稕稛稞稡稧稫稭稯稰稴稵稸稹稺穄穅穇穈穌穕穖穙穜穝穟穠穥穧穪穭穵穸穾窀窂窅窆窊窋窐窑窔窞窠窣窬窳窵窹窻窼竆竉竌竎竑竛竨竩竫竬竱竴竻竽竾笇笔笟笣笧笩笪笫笭笮笯笰"],["8fd2a1","笱笴笽笿筀筁筇筎筕筠筤筦筩筪筭筯筲筳筷箄箉箎箐箑箖箛箞箠箥箬箯箰箲箵箶箺箻箼箽篂篅篈篊篔篖篗篙篚篛篨篪篲篴篵篸篹篺篼篾簁簂簃簄簆簉簋簌簎簏簙簛簠簥簦簨簬簱簳簴簶簹簺籆籊籕籑籒籓籙",5],["8fd3a1","籡籣籧籩籭籮籰籲籹籼籽粆粇粏粔粞粠粦粰粶粷粺粻粼粿糄糇糈糉糍糏糓糔糕糗糙糚糝糦糩糫糵紃紇紈紉紏紑紒紓紖紝紞紣紦紪紭紱紼紽紾絀絁絇絈絍絑絓絗絙絚絜絝絥絧絪絰絸絺絻絿綁綂綃綅綆綈綋綌綍綑綖綗綝"],["8fd4a1","綞綦綧綪綳綶綷綹緂",4,"緌緍緎緗緙縀緢緥緦緪緫緭緱緵緶緹緺縈縐縑縕縗縜縝縠縧縨縬縭縯縳縶縿繄繅繇繎繐繒繘繟繡繢繥繫繮繯繳繸繾纁纆纇纊纍纑纕纘纚纝纞缼缻缽缾缿罃罄罇罏罒罓罛罜罝罡罣罤罥罦罭"],["8fd5a1","罱罽罾罿羀羋羍羏羐羑羖羗羜羡羢羦羪羭羴羼羿翀翃翈翎翏翛翟翣翥翨翬翮翯翲翺翽翾翿耇耈耊耍耎耏耑耓耔耖耝耞耟耠耤耦耬耮耰耴耵耷耹耺耼耾聀聄聠聤聦聭聱聵肁肈肎肜肞肦肧肫肸肹胈胍胏胒胔胕胗胘胠胭胮"],["8fd6a1","胰胲胳胶胹胺胾脃脋脖脗脘脜脞脠脤脧脬脰脵脺脼腅腇腊腌腒腗腠腡腧腨腩腭腯腷膁膐膄膅膆膋膎膖膘膛膞膢膮膲膴膻臋臃臅臊臎臏臕臗臛臝臞臡臤臫臬臰臱臲臵臶臸臹臽臿舀舃舏舓舔舙舚舝舡舢舨舲舴舺艃艄艅艆"],["8fd7a1","艋艎艏艑艖艜艠艣艧艭艴艻艽艿芀芁芃芄芇芉芊芎芑芔芖芘芚芛芠芡芣芤芧芨芩芪芮芰芲芴芷芺芼芾芿苆苐苕苚苠苢苤苨苪苭苯苶苷苽苾茀茁茇茈茊茋荔茛茝茞茟茡茢茬茭茮茰茳茷茺茼茽荂荃荄荇荍荎荑荕荖荗荰荸"],["8fd8a1","荽荿莀莂莄莆莍莒莔莕莘莙莛莜莝莦莧莩莬莾莿菀菇菉菏菐菑菔菝荓菨菪菶菸菹菼萁萆萊萏萑萕萙莭萯萹葅葇葈葊葍葏葑葒葖葘葙葚葜葠葤葥葧葪葰葳葴葶葸葼葽蒁蒅蒒蒓蒕蒞蒦蒨蒩蒪蒯蒱蒴蒺蒽蒾蓀蓂蓇蓈蓌蓏蓓"],["8fd9a1","蓜蓧蓪蓯蓰蓱蓲蓷蔲蓺蓻蓽蔂蔃蔇蔌蔎蔐蔜蔞蔢蔣蔤蔥蔧蔪蔫蔯蔳蔴蔶蔿蕆蕏",4,"蕖蕙蕜",6,"蕤蕫蕯蕹蕺蕻蕽蕿薁薅薆薉薋薌薏薓薘薝薟薠薢薥薧薴薶薷薸薼薽薾薿藂藇藊藋藎薭藘藚藟藠藦藨藭藳藶藼"],["8fdaa1","藿蘀蘄蘅蘍蘎蘐蘑蘒蘘蘙蘛蘞蘡蘧蘩蘶蘸蘺蘼蘽虀虂虆虒虓虖虗虘虙虝虠",4,"虩虬虯虵虶虷虺蚍蚑蚖蚘蚚蚜蚡蚦蚧蚨蚭蚱蚳蚴蚵蚷蚸蚹蚿蛀蛁蛃蛅蛑蛒蛕蛗蛚蛜蛠蛣蛥蛧蚈蛺蛼蛽蜄蜅蜇蜋蜎蜏蜐蜓蜔蜙蜞蜟蜡蜣"],["8fdba1","蜨蜮蜯蜱蜲蜹蜺蜼蜽蜾蝀蝃蝅蝍蝘蝝蝡蝤蝥蝯蝱蝲蝻螃",6,"螋螌螐螓螕螗螘螙螞螠螣螧螬螭螮螱螵螾螿蟁蟈蟉蟊蟎蟕蟖蟙蟚蟜蟟蟢蟣蟤蟪蟫蟭蟱蟳蟸蟺蟿蠁蠃蠆蠉蠊蠋蠐蠙蠒蠓蠔蠘蠚蠛蠜蠞蠟蠨蠭蠮蠰蠲蠵"],["8fdca1","蠺蠼衁衃衅衈衉衊衋衎衑衕衖衘衚衜衟衠衤衩衱衹衻袀袘袚袛袜袟袠袨袪袺袽袾裀裊",4,"裑裒裓裛裞裧裯裰裱裵裷褁褆褍褎褏褕褖褘褙褚褜褠褦褧褨褰褱褲褵褹褺褾襀襂襅襆襉襏襒襗襚襛襜襡襢襣襫襮襰襳襵襺"],["8fdda1","襻襼襽覉覍覐覔覕覛覜覟覠覥覰覴覵覶覷覼觔",4,"觥觩觫觭觱觳觶觹觽觿訄訅訇訏訑訒訔訕訞訠訢訤訦訫訬訯訵訷訽訾詀詃詅詇詉詍詎詓詖詗詘詜詝詡詥詧詵詶詷詹詺詻詾詿誀誃誆誋誏誐誒誖誗誙誟誧誩誮誯誳"],["8fdea1","誶誷誻誾諃諆諈諉諊諑諓諔諕諗諝諟諬諰諴諵諶諼諿謅謆謋謑謜謞謟謊謭謰謷謼譂",4,"譈譒譓譔譙譍譞譣譭譶譸譹譼譾讁讄讅讋讍讏讔讕讜讞讟谸谹谽谾豅豇豉豋豏豑豓豔豗豘豛豝豙豣豤豦豨豩豭豳豵豶豻豾貆"],["8fdfa1","貇貋貐貒貓貙貛貜貤貹貺賅賆賉賋賏賖賕賙賝賡賨賬賯賰賲賵賷賸賾賿贁贃贉贒贗贛赥赩赬赮赿趂趄趈趍趐趑趕趞趟趠趦趫趬趯趲趵趷趹趻跀跅跆跇跈跊跎跑跔跕跗跙跤跥跧跬跰趼跱跲跴跽踁踄踅踆踋踑踔踖踠踡踢"],["8fe0a1","踣踦踧踱踳踶踷踸踹踽蹀蹁蹋蹍蹎蹏蹔蹛蹜蹝蹞蹡蹢蹩蹬蹭蹯蹰蹱蹹蹺蹻躂躃躉躐躒躕躚躛躝躞躢躧躩躭躮躳躵躺躻軀軁軃軄軇軏軑軔軜軨軮軰軱軷軹軺軭輀輂輇輈輏輐輖輗輘輞輠輡輣輥輧輨輬輭輮輴輵輶輷輺轀轁"],["8fe1a1","轃轇轏轑",4,"轘轝轞轥辝辠辡辤辥辦辵辶辸达迀迁迆迊迋迍运迒迓迕迠迣迤迨迮迱迵迶迻迾适逄逈逌逘逛逨逩逯逪逬逭逳逴逷逿遃遄遌遛遝遢遦遧遬遰遴遹邅邈邋邌邎邐邕邗邘邙邛邠邡邢邥邰邲邳邴邶邽郌邾郃"],["8fe2a1","郄郅郇郈郕郗郘郙郜郝郟郥郒郶郫郯郰郴郾郿鄀鄄鄅鄆鄈鄍鄐鄔鄖鄗鄘鄚鄜鄞鄠鄥鄢鄣鄧鄩鄮鄯鄱鄴鄶鄷鄹鄺鄼鄽酃酇酈酏酓酗酙酚酛酡酤酧酭酴酹酺酻醁醃醅醆醊醎醑醓醔醕醘醞醡醦醨醬醭醮醰醱醲醳醶醻醼醽醿"],["8fe3a1","釂釃釅釓釔釗釙釚釞釤釥釩釪釬",5,"釷釹釻釽鈀鈁鈄鈅鈆鈇鈉鈊鈌鈐鈒鈓鈖鈘鈜鈝鈣鈤鈥鈦鈨鈮鈯鈰鈳鈵鈶鈸鈹鈺鈼鈾鉀鉂鉃鉆鉇鉊鉍鉎鉏鉑鉘鉙鉜鉝鉠鉡鉥鉧鉨鉩鉮鉯鉰鉵",4,"鉻鉼鉽鉿銈銉銊銍銎銒銗"],["8fe4a1","銙銟銠銤銥銧銨銫銯銲銶銸銺銻銼銽銿",4,"鋅鋆鋇鋈鋋鋌鋍鋎鋐鋓鋕鋗鋘鋙鋜鋝鋟鋠鋡鋣鋥鋧鋨鋬鋮鋰鋹鋻鋿錀錂錈錍錑錔錕錜錝錞錟錡錤錥錧錩錪錳錴錶錷鍇鍈鍉鍐鍑鍒鍕鍗鍘鍚鍞鍤鍥鍧鍩鍪鍭鍯鍰鍱鍳鍴鍶"],["8fe5a1","鍺鍽鍿鎀鎁鎂鎈鎊鎋鎍鎏鎒鎕鎘鎛鎞鎡鎣鎤鎦鎨鎫鎴鎵鎶鎺鎩鏁鏄鏅鏆鏇鏉",4,"鏓鏙鏜鏞鏟鏢鏦鏧鏹鏷鏸鏺鏻鏽鐁鐂鐄鐈鐉鐍鐎鐏鐕鐖鐗鐟鐮鐯鐱鐲鐳鐴鐻鐿鐽鑃鑅鑈鑊鑌鑕鑙鑜鑟鑡鑣鑨鑫鑭鑮鑯鑱鑲钄钃镸镹"],["8fe6a1","镾閄閈閌閍閎閝閞閟閡閦閩閫閬閴閶閺閽閿闆闈闉闋闐闑闒闓闙闚闝闞闟闠闤闦阝阞阢阤阥阦阬阱阳阷阸阹阺阼阽陁陒陔陖陗陘陡陮陴陻陼陾陿隁隂隃隄隉隑隖隚隝隟隤隥隦隩隮隯隳隺雊雒嶲雘雚雝雞雟雩雯雱雺霂"],["8fe7a1","霃霅霉霚霛霝霡霢霣霨霱霳靁靃靊靎靏靕靗靘靚靛靣靧靪靮靳靶靷靸靻靽靿鞀鞉鞕鞖鞗鞙鞚鞞鞟鞢鞬鞮鞱鞲鞵鞶鞸鞹鞺鞼鞾鞿韁韄韅韇韉韊韌韍韎韐韑韔韗韘韙韝韞韠韛韡韤韯韱韴韷韸韺頇頊頙頍頎頔頖頜頞頠頣頦"],["8fe8a1","頫頮頯頰頲頳頵頥頾顄顇顊顑顒顓顖顗顙顚顢顣顥顦顪顬颫颭颮颰颴颷颸颺颻颿飂飅飈飌飡飣飥飦飧飪飳飶餂餇餈餑餕餖餗餚餛餜餟餢餦餧餫餱",4,"餹餺餻餼饀饁饆饇饈饍饎饔饘饙饛饜饞饟饠馛馝馟馦馰馱馲馵"],["8fe9a1","馹馺馽馿駃駉駓駔駙駚駜駞駧駪駫駬駰駴駵駹駽駾騂騃騄騋騌騐騑騖騞騠騢騣騤騧騭騮騳騵騶騸驇驁驄驊驋驌驎驑驔驖驝骪骬骮骯骲骴骵骶骹骻骾骿髁髃髆髈髎髐髒髕髖髗髛髜髠髤髥髧髩髬髲髳髵髹髺髽髿",4],["8feaa1","鬄鬅鬈鬉鬋鬌鬍鬎鬐鬒鬖鬙鬛鬜鬠鬦鬫鬭鬳鬴鬵鬷鬹鬺鬽魈魋魌魕魖魗魛魞魡魣魥魦魨魪",4,"魳魵魷魸魹魿鮀鮄鮅鮆鮇鮉鮊鮋鮍鮏鮐鮔鮚鮝鮞鮦鮧鮩鮬鮰鮱鮲鮷鮸鮻鮼鮾鮿鯁鯇鯈鯎鯐鯗鯘鯝鯟鯥鯧鯪鯫鯯鯳鯷鯸"],["8feba1","鯹鯺鯽鯿鰀鰂鰋鰏鰑鰖鰘鰙鰚鰜鰞鰢鰣鰦",4,"鰱鰵鰶鰷鰽鱁鱃鱄鱅鱉鱊鱎鱏鱐鱓鱔鱖鱘鱛鱝鱞鱟鱣鱩鱪鱜鱫鱨鱮鱰鱲鱵鱷鱻鳦鳲鳷鳹鴋鴂鴑鴗鴘鴜鴝鴞鴯鴰鴲鴳鴴鴺鴼鵅鴽鵂鵃鵇鵊鵓鵔鵟鵣鵢鵥鵩鵪鵫鵰鵶鵷鵻"],["8feca1","鵼鵾鶃鶄鶆鶊鶍鶎鶒鶓鶕鶖鶗鶘鶡鶪鶬鶮鶱鶵鶹鶼鶿鷃鷇鷉鷊鷔鷕鷖鷗鷚鷞鷟鷠鷥鷧鷩鷫鷮鷰鷳鷴鷾鸊鸂鸇鸎鸐鸑鸒鸕鸖鸙鸜鸝鹺鹻鹼麀麂麃麄麅麇麎麏麖麘麛麞麤麨麬麮麯麰麳麴麵黆黈黋黕黟黤黧黬黭黮黰黱黲黵"],["8feda1","黸黿鼂鼃鼉鼏鼐鼑鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿齁齃",4,"齓齕齖齗齘齚齝齞齨齩齭",4,"齳齵齺齽龏龐龑龒龔龖龗龞龡龢龣龥"]]
52115 /***/ }),
52116 /* 182 */
52117 /***/ (function(module, exports) {
52119 module.exports = {"uChars":[128,165,169,178,184,216,226,235,238,244,248,251,253,258,276,284,300,325,329,334,364,463,465,467,469,471,473,475,477,506,594,610,712,716,730,930,938,962,970,1026,1104,1106,8209,8215,8218,8222,8231,8241,8244,8246,8252,8365,8452,8454,8458,8471,8482,8556,8570,8596,8602,8713,8720,8722,8726,8731,8737,8740,8742,8748,8751,8760,8766,8777,8781,8787,8802,8808,8816,8854,8858,8870,8896,8979,9322,9372,9548,9588,9616,9622,9634,9652,9662,9672,9676,9680,9702,9735,9738,9793,9795,11906,11909,11913,11917,11928,11944,11947,11951,11956,11960,11964,11979,12284,12292,12312,12319,12330,12351,12436,12447,12535,12543,12586,12842,12850,12964,13200,13215,13218,13253,13263,13267,13270,13384,13428,13727,13839,13851,14617,14703,14801,14816,14964,15183,15471,15585,16471,16736,17208,17325,17330,17374,17623,17997,18018,18212,18218,18301,18318,18760,18811,18814,18820,18823,18844,18848,18872,19576,19620,19738,19887,40870,59244,59336,59367,59413,59417,59423,59431,59437,59443,59452,59460,59478,59493,63789,63866,63894,63976,63986,64016,64018,64021,64025,64034,64037,64042,65074,65093,65107,65112,65127,65132,65375,65510,65536],"gbChars":[0,36,38,45,50,81,89,95,96,100,103,104,105,109,126,133,148,172,175,179,208,306,307,308,309,310,311,312,313,341,428,443,544,545,558,741,742,749,750,805,819,820,7922,7924,7925,7927,7934,7943,7944,7945,7950,8062,8148,8149,8152,8164,8174,8236,8240,8262,8264,8374,8380,8381,8384,8388,8390,8392,8393,8394,8396,8401,8406,8416,8419,8424,8437,8439,8445,8482,8485,8496,8521,8603,8936,8946,9046,9050,9063,9066,9076,9092,9100,9108,9111,9113,9131,9162,9164,9218,9219,11329,11331,11334,11336,11346,11361,11363,11366,11370,11372,11375,11389,11682,11686,11687,11692,11694,11714,11716,11723,11725,11730,11736,11982,11989,12102,12336,12348,12350,12384,12393,12395,12397,12510,12553,12851,12962,12973,13738,13823,13919,13933,14080,14298,14585,14698,15583,15847,16318,16434,16438,16481,16729,17102,17122,17315,17320,17402,17418,17859,17909,17911,17915,17916,17936,17939,17961,18664,18703,18814,18962,19043,33469,33470,33471,33484,33485,33490,33497,33501,33505,33513,33520,33536,33550,37845,37921,37948,38029,38038,38064,38065,38066,38069,38075,38076,38078,39108,39109,39113,39114,39115,39116,39265,39394,189000]}
52121 /***/ }),
52122 /* 183 */
52123 /***/ (function(module, exports) {
52125 module.exports = [["0","\u0000",127],["8141","갂갃갅갆갋",4,"갘갞갟갡갢갣갥",6,"갮갲갳갴"],["8161","갵갶갷갺갻갽갾갿걁",9,"걌걎",5,"걕"],["8181","걖걗걙걚걛걝",18,"걲걳걵걶걹걻",4,"겂겇겈겍겎겏겑겒겓겕",6,"겞겢",5,"겫겭겮겱",6,"겺겾겿곀곂곃곅곆곇곉곊곋곍",7,"곖곘",7,"곢곣곥곦곩곫곭곮곲곴곷",4,"곾곿괁괂괃괅괇",4,"괎괐괒괓"],["8241","괔괕괖괗괙괚괛괝괞괟괡",7,"괪괫괮",5],["8261","괶괷괹괺괻괽",6,"굆굈굊",5,"굑굒굓굕굖굗"],["8281","굙",7,"굢굤",7,"굮굯굱굲굷굸굹굺굾궀궃",4,"궊궋궍궎궏궑",10,"궞",5,"궥",17,"궸",7,"귂귃귅귆귇귉",6,"귒귔",7,"귝귞귟귡귢귣귥",18],["8341","귺귻귽귾긂",5,"긊긌긎",5,"긕",7],["8361","긝",18,"긲긳긵긶긹긻긼"],["8381","긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗",4,"깞깢깣깤깦깧깪깫깭깮깯깱",6,"깺깾",5,"꺆",5,"꺍",46,"꺿껁껂껃껅",6,"껎껒",5,"껚껛껝",8],["8441","껦껧껩껪껬껮",5,"껵껶껷껹껺껻껽",8],["8461","꼆꼉꼊꼋꼌꼎꼏꼑",18],["8481","꼤",7,"꼮꼯꼱꼳꼵",6,"꼾꽀꽄꽅꽆꽇꽊",5,"꽑",10,"꽞",5,"꽦",18,"꽺",5,"꾁꾂꾃꾅꾆꾇꾉",6,"꾒꾓꾔꾖",5,"꾝",26,"꾺꾻꾽꾾"],["8541","꾿꿁",5,"꿊꿌꿏",4,"꿕",6,"꿝",4],["8561","꿢",5,"꿪",5,"꿲꿳꿵꿶꿷꿹",6,"뀂뀃"],["8581","뀅",6,"뀍뀎뀏뀑뀒뀓뀕",6,"뀞",9,"뀩",26,"끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞",29,"끾끿낁낂낃낅",6,"낎낐낒",5,"낛낝낞낣낤"],["8641","낥낦낧낪낰낲낶낷낹낺낻낽",6,"냆냊",5,"냒"],["8661","냓냕냖냗냙",6,"냡냢냣냤냦",10],["8681","냱",22,"넊넍넎넏넑넔넕넖넗넚넞",4,"넦넧넩넪넫넭",6,"넶넺",5,"녂녃녅녆녇녉",6,"녒녓녖녗녙녚녛녝녞녟녡",22,"녺녻녽녾녿놁놃",4,"놊놌놎놏놐놑놕놖놗놙놚놛놝"],["8741","놞",9,"놩",15],["8761","놹",18,"뇍뇎뇏뇑뇒뇓뇕"],["8781","뇖",5,"뇞뇠",7,"뇪뇫뇭뇮뇯뇱",7,"뇺뇼뇾",5,"눆눇눉눊눍",6,"눖눘눚",5,"눡",18,"눵",6,"눽",26,"뉙뉚뉛뉝뉞뉟뉡",6,"뉪",4],["8841","뉯",4,"뉶",5,"뉽",6,"늆늇늈늊",4],["8861","늏늒늓늕늖늗늛",4,"늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷"],["8881","늸",15,"닊닋닍닎닏닑닓",4,"닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉",6,"댒댖",5,"댝",54,"덗덙덚덝덠덡덢덣"],["8941","덦덨덪덬덭덯덲덳덵덶덷덹",6,"뎂뎆",5,"뎍"],["8961","뎎뎏뎑뎒뎓뎕",10,"뎢",5,"뎩뎪뎫뎭"],["8981","뎮",21,"돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩",18,"돽",18,"됑",6,"됙됚됛됝됞됟됡",6,"됪됬",7,"됵",15],["8a41","둅",10,"둒둓둕둖둗둙",6,"둢둤둦"],["8a61","둧",4,"둭",18,"뒁뒂"],["8a81","뒃",4,"뒉",19,"뒞",5,"뒥뒦뒧뒩뒪뒫뒭",7,"뒶뒸뒺",5,"듁듂듃듅듆듇듉",6,"듑듒듓듔듖",5,"듞듟듡듢듥듧",4,"듮듰듲",5,"듹",26,"딖딗딙딚딝"],["8b41","딞",5,"딦딫",4,"딲딳딵딶딷딹",6,"땂땆"],["8b61","땇땈땉땊땎땏땑땒땓땕",6,"땞땢",8],["8b81","땫",52,"떢떣떥떦떧떩떬떭떮떯떲떶",4,"떾떿뗁뗂뗃뗅",6,"뗎뗒",5,"뗙",18,"뗭",18],["8c41","똀",15,"똒똓똕똖똗똙",4],["8c61","똞",6,"똦",5,"똭",6,"똵",5],["8c81","똻",12,"뙉",26,"뙥뙦뙧뙩",50,"뚞뚟뚡뚢뚣뚥",5,"뚭뚮뚯뚰뚲",16],["8d41","뛃",16,"뛕",8],["8d61","뛞",17,"뛱뛲뛳뛵뛶뛷뛹뛺"],["8d81","뛻",4,"뜂뜃뜄뜆",33,"뜪뜫뜭뜮뜱",6,"뜺뜼",7,"띅띆띇띉띊띋띍",6,"띖",9,"띡띢띣띥띦띧띩",6,"띲띴띶",5,"띾띿랁랂랃랅",6,"랎랓랔랕랚랛랝랞"],["8e41","랟랡",6,"랪랮",5,"랶랷랹",8],["8e61","럂",4,"럈럊",19],["8e81","럞",13,"럮럯럱럲럳럵",6,"럾렂",4,"렊렋렍렎렏렑",6,"렚렜렞",5,"렦렧렩렪렫렭",6,"렶렺",5,"롁롂롃롅",11,"롒롔",7,"롞롟롡롢롣롥",6,"롮롰롲",5,"롹롺롻롽",7],["8f41","뢅",7,"뢎",17],["8f61","뢠",7,"뢩",6,"뢱뢲뢳뢵뢶뢷뢹",4],["8f81","뢾뢿룂룄룆",5,"룍룎룏룑룒룓룕",7,"룞룠룢",5,"룪룫룭룮룯룱",6,"룺룼룾",5,"뤅",18,"뤙",6,"뤡",26,"뤾뤿륁륂륃륅",6,"륍륎륐륒",5],["9041","륚륛륝륞륟륡",6,"륪륬륮",5,"륶륷륹륺륻륽"],["9061","륾",5,"릆릈릋릌릏",15],["9081","릟",12,"릮릯릱릲릳릵",6,"릾맀맂",5,"맊맋맍맓",4,"맚맜맟맠맢맦맧맩맪맫맭",6,"맶맻",4,"먂",5,"먉",11,"먖",33,"먺먻먽먾먿멁멃멄멅멆"],["9141","멇멊멌멏멐멑멒멖멗멙멚멛멝",6,"멦멪",5],["9161","멲멳멵멶멷멹",9,"몆몈몉몊몋몍",5],["9181","몓",20,"몪몭몮몯몱몳",4,"몺몼몾",5,"뫅뫆뫇뫉",14,"뫚",33,"뫽뫾뫿묁묂묃묅",7,"묎묐묒",5,"묙묚묛묝묞묟묡",6],["9241","묨묪묬",7,"묷묹묺묿",4,"뭆뭈뭊뭋뭌뭎뭑뭒"],["9261","뭓뭕뭖뭗뭙",7,"뭢뭤",7,"뭭",4],["9281","뭲",21,"뮉뮊뮋뮍뮎뮏뮑",18,"뮥뮦뮧뮩뮪뮫뮭",6,"뮵뮶뮸",7,"믁믂믃믅믆믇믉",6,"믑믒믔",35,"믺믻믽믾밁"],["9341","밃",4,"밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵"],["9361","밶밷밹",6,"뱂뱆뱇뱈뱊뱋뱎뱏뱑",8],["9381","뱚뱛뱜뱞",37,"벆벇벉벊벍벏",4,"벖벘벛",4,"벢벣벥벦벩",6,"벲벶",5,"벾벿볁볂볃볅",7,"볎볒볓볔볖볗볙볚볛볝",22,"볷볹볺볻볽"],["9441","볾",5,"봆봈봊",5,"봑봒봓봕",8],["9461","봞",5,"봥",6,"봭",12],["9481","봺",5,"뵁",6,"뵊뵋뵍뵎뵏뵑",6,"뵚",9,"뵥뵦뵧뵩",22,"붂붃붅붆붋",4,"붒붔붖붗붘붛붝",6,"붥",10,"붱",6,"붹",24],["9541","뷒뷓뷖뷗뷙뷚뷛뷝",11,"뷪",5,"뷱"],["9561","뷲뷳뷵뷶뷷뷹",6,"븁븂븄븆",5,"븎븏븑븒븓"],["9581","븕",6,"븞븠",35,"빆빇빉빊빋빍빏",4,"빖빘빜빝빞빟빢빣빥빦빧빩빫",4,"빲빶",4,"빾빿뺁뺂뺃뺅",6,"뺎뺒",5,"뺚",13,"뺩",14],["9641","뺸",23,"뻒뻓"],["9661","뻕뻖뻙",6,"뻡뻢뻦",5,"뻭",8],["9681","뻶",10,"뼂",5,"뼊",13,"뼚뼞",33,"뽂뽃뽅뽆뽇뽉",6,"뽒뽓뽔뽖",44],["9741","뾃",16,"뾕",8],["9761","뾞",17,"뾱",7],["9781","뾹",11,"뿆",5,"뿎뿏뿑뿒뿓뿕",6,"뿝뿞뿠뿢",89,"쀽쀾쀿"],["9841","쁀",16,"쁒",5,"쁙쁚쁛"],["9861","쁝쁞쁟쁡",6,"쁪",15],["9881","쁺",21,"삒삓삕삖삗삙",6,"삢삤삦",5,"삮삱삲삷",4,"삾샂샃샄샆샇샊샋샍샎샏샑",6,"샚샞",5,"샦샧샩샪샫샭",6,"샶샸샺",5,"섁섂섃섅섆섇섉",6,"섑섒섓섔섖",5,"섡섢섥섨섩섪섫섮"],["9941","섲섳섴섵섷섺섻섽섾섿셁",6,"셊셎",5,"셖셗"],["9961","셙셚셛셝",6,"셦셪",5,"셱셲셳셵셶셷셹셺셻"],["9981","셼",8,"솆",5,"솏솑솒솓솕솗",4,"솞솠솢솣솤솦솧솪솫솭솮솯솱",11,"솾",5,"쇅쇆쇇쇉쇊쇋쇍",6,"쇕쇖쇙",6,"쇡쇢쇣쇥쇦쇧쇩",6,"쇲쇴",7,"쇾쇿숁숂숃숅",6,"숎숐숒",5,"숚숛숝숞숡숢숣"],["9a41","숤숥숦숧숪숬숮숰숳숵",16],["9a61","쉆쉇쉉",6,"쉒쉓쉕쉖쉗쉙",6,"쉡쉢쉣쉤쉦"],["9a81","쉧",4,"쉮쉯쉱쉲쉳쉵",6,"쉾슀슂",5,"슊",5,"슑",6,"슙슚슜슞",5,"슦슧슩슪슫슮",5,"슶슸슺",33,"싞싟싡싢싥",5,"싮싰싲싳싴싵싷싺싽싾싿쌁",6,"쌊쌋쌎쌏"],["9b41","쌐쌑쌒쌖쌗쌙쌚쌛쌝",6,"쌦쌧쌪",8],["9b61","쌳",17,"썆",7],["9b81","썎",25,"썪썫썭썮썯썱썳",4,"썺썻썾",5,"쎅쎆쎇쎉쎊쎋쎍",50,"쏁",22,"쏚"],["9c41","쏛쏝쏞쏡쏣",4,"쏪쏫쏬쏮",5,"쏶쏷쏹",5],["9c61","쏿",8,"쐉",6,"쐑",9],["9c81","쐛",8,"쐥",6,"쐭쐮쐯쐱쐲쐳쐵",6,"쐾",9,"쑉",26,"쑦쑧쑩쑪쑫쑭",6,"쑶쑷쑸쑺",5,"쒁",18,"쒕",6,"쒝",12],["9d41","쒪",13,"쒹쒺쒻쒽",8],["9d61","쓆",25],["9d81","쓠",8,"쓪",5,"쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂",9,"씍씎씏씑씒씓씕",6,"씝",10,"씪씫씭씮씯씱",6,"씺씼씾",5,"앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩",6,"앲앶",5,"앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔"],["9e41","얖얙얚얛얝얞얟얡",7,"얪",9,"얶"],["9e61","얷얺얿",4,"엋엍엏엒엓엕엖엗엙",6,"엢엤엦엧"],["9e81","엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑",6,"옚옝",6,"옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉",6,"왒왖",5,"왞왟왡",10,"왭왮왰왲",5,"왺왻왽왾왿욁",6,"욊욌욎",5,"욖욗욙욚욛욝",6,"욦"],["9f41","욨욪",5,"욲욳욵욶욷욻",4,"웂웄웆",5,"웎"],["9f61","웏웑웒웓웕",6,"웞웟웢",5,"웪웫웭웮웯웱웲"],["9f81","웳",4,"웺웻웼웾",5,"윆윇윉윊윋윍",6,"윖윘윚",5,"윢윣윥윦윧윩",6,"윲윴윶윸윹윺윻윾윿읁읂읃읅",4,"읋읎읐읙읚읛읝읞읟읡",6,"읩읪읬",7,"읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛",4,"잢잧",4,"잮잯잱잲잳잵잶잷"],["a041","잸잹잺잻잾쟂",5,"쟊쟋쟍쟏쟑",6,"쟙쟚쟛쟜"],["a061","쟞",5,"쟥쟦쟧쟩쟪쟫쟭",13],["a081","쟻",4,"젂젃젅젆젇젉젋",4,"젒젔젗",4,"젞젟젡젢젣젥",6,"젮젰젲",5,"젹젺젻젽젾젿졁",6,"졊졋졎",5,"졕",26,"졲졳졵졶졷졹졻",4,"좂좄좈좉좊좎",5,"좕",7,"좞좠좢좣좤"],["a141","좥좦좧좩",18,"좾좿죀죁"],["a161","죂죃죅죆죇죉죊죋죍",6,"죖죘죚",5,"죢죣죥"],["a181","죦",14,"죶",5,"죾죿줁줂줃줇",4,"줎 、。·‥…¨〃­―∥\∼‘’“”〔〕〈",9,"±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨¬"],["a241","줐줒",5,"줙",18],["a261","줭",6,"줵",18],["a281","쥈",7,"쥒쥓쥕쥖쥗쥙",6,"쥢쥤",7,"쥭쥮쥯⇒⇔∀∃´~ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®"],["a341","쥱쥲쥳쥵",6,"쥽",10,"즊즋즍즎즏"],["a361","즑",6,"즚즜즞",16],["a381","즯",16,"짂짃짅짆짉짋",4,"짒짔짗짘짛!",58,"₩]",32," ̄"],["a441","짞짟짡짣짥짦짨짩짪짫짮짲",5,"짺짻짽짾짿쨁쨂쨃쨄"],["a461","쨅쨆쨇쨊쨎",5,"쨕쨖쨗쨙",12],["a481","쨦쨧쨨쨪",28,"ㄱ",93],["a541","쩇",4,"쩎쩏쩑쩒쩓쩕",6,"쩞쩢",5,"쩩쩪"],["a561","쩫",17,"쩾",5,"쪅쪆"],["a581","쪇",16,"쪙",14,"ⅰ",9],["a5b0","Ⅰ",9],["a5c1","Α",16,"Σ",6],["a5e1","α",16,"σ",6],["a641","쪨",19,"쪾쪿쫁쫂쫃쫅"],["a661","쫆",5,"쫎쫐쫒쫔쫕쫖쫗쫚",5,"쫡",6],["a681","쫨쫩쫪쫫쫭",6,"쫵",18,"쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃",7],["a741","쬋",4,"쬑쬒쬓쬕쬖쬗쬙",6,"쬢",7],["a761","쬪",22,"쭂쭃쭄"],["a781","쭅쭆쭇쭊쭋쭍쭎쭏쭑",6,"쭚쭛쭜쭞",5,"쭥",7,"㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙",9,"㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰",9,"㎀",4,"㎺",5,"㎐",4,"Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆"],["a841","쭭",10,"쭺",14],["a861","쮉",18,"쮝",6],["a881","쮤",19,"쮹",11,"ÆЪĦ"],["a8a6","IJ"],["a8a8","ĿŁØŒºÞŦŊ"],["a8b1","㉠",27,"ⓐ",25,"①",14,"½⅓⅔¼¾⅛⅜⅝⅞"],["a941","쯅",14,"쯕",10],["a961","쯠쯡쯢쯣쯥쯦쯨쯪",18],["a981","쯽",14,"찎찏찑찒찓찕",6,"찞찟찠찣찤æđðħıijĸŀłøœßþŧŋʼn㈀",27,"⒜",25,"⑴",14,"¹²³⁴ⁿ₁₂₃₄"],["aa41","찥찦찪찫찭찯찱",6,"찺찿",4,"챆챇챉챊챋챍챎"],["aa61","챏",4,"챖챚",5,"챡챢챣챥챧챩",6,"챱챲"],["aa81","챳챴챶",29,"ぁ",82],["ab41","첔첕첖첗첚첛첝첞첟첡",6,"첪첮",5,"첶첷첹"],["ab61","첺첻첽",6,"쳆쳈쳊",5,"쳑쳒쳓쳕",5],["ab81","쳛",8,"쳥",6,"쳭쳮쳯쳱",12,"ァ",85],["ac41","쳾쳿촀촂",5,"촊촋촍촎촏촑",6,"촚촜촞촟촠"],["ac61","촡촢촣촥촦촧촩촪촫촭",11,"촺",4],["ac81","촿",28,"쵝쵞쵟А",5,"ЁЖ",25],["acd1","а",5,"ёж",25],["ad41","쵡쵢쵣쵥",6,"쵮쵰쵲",5,"쵹",7],["ad61","춁",6,"춉",10,"춖춗춙춚춛춝춞춟"],["ad81","춠춡춢춣춦춨춪",5,"춱",18,"췅"],["ae41","췆",5,"췍췎췏췑",16],["ae61","췢",5,"췩췪췫췭췮췯췱",6,"췺췼췾",4],["ae81","츃츅츆츇츉츊츋츍",6,"츕츖츗츘츚",5,"츢츣츥츦츧츩츪츫"],["af41","츬츭츮츯츲츴츶",19],["af61","칊",13,"칚칛칝칞칢",5,"칪칬"],["af81","칮",5,"칶칷칹칺칻칽",6,"캆캈캊",5,"캒캓캕캖캗캙"],["b041","캚",5,"캢캦",5,"캮",12],["b061","캻",5,"컂",19],["b081","컖",13,"컦컧컩컪컭",6,"컶컺",5,"가각간갇갈갉갊감",7,"같",4,"갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆"],["b141","켂켃켅켆켇켉",6,"켒켔켖",5,"켝켞켟켡켢켣"],["b161","켥",6,"켮켲",5,"켹",11],["b181","콅",14,"콖콗콙콚콛콝",6,"콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸"],["b241","콭콮콯콲콳콵콶콷콹",6,"쾁쾂쾃쾄쾆",5,"쾍"],["b261","쾎",18,"쾢",5,"쾩"],["b281","쾪",5,"쾱",18,"쿅",6,"깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙"],["b341","쿌",19,"쿢쿣쿥쿦쿧쿩"],["b361","쿪",5,"쿲쿴쿶",5,"쿽쿾쿿퀁퀂퀃퀅",5],["b381","퀋",5,"퀒",5,"퀙",19,"끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫",4,"낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝"],["b441","퀮",5,"퀶퀷퀹퀺퀻퀽",6,"큆큈큊",5],["b461","큑큒큓큕큖큗큙",6,"큡",10,"큮큯"],["b481","큱큲큳큵",6,"큾큿킀킂",18,"뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫",4,"닳담답닷",4,"닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥"],["b541","킕",14,"킦킧킩킪킫킭",5],["b561","킳킶킸킺",5,"탂탃탅탆탇탊",5,"탒탖",4],["b581","탛탞탟탡탢탣탥",6,"탮탲",5,"탹",11,"덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸"],["b641","턅",7,"턎",17],["b661","턠",15,"턲턳턵턶턷턹턻턼턽턾"],["b681","턿텂텆",5,"텎텏텑텒텓텕",6,"텞텠텢",5,"텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗"],["b741","텮",13,"텽",6,"톅톆톇톉톊"],["b761","톋",20,"톢톣톥톦톧"],["b781","톩",6,"톲톴톶톷톸톹톻톽톾톿퇁",14,"래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩"],["b841","퇐",7,"퇙",17],["b861","퇫",8,"퇵퇶퇷퇹",13],["b881","툈툊",5,"툑",24,"륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많",4,"맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼"],["b941","툪툫툮툯툱툲툳툵",6,"툾퉀퉂",5,"퉉퉊퉋퉌"],["b961","퉍",14,"퉝",6,"퉥퉦퉧퉨"],["b981","퉩",22,"튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바",4,"받",4,"밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗"],["ba41","튍튎튏튒튓튔튖",5,"튝튞튟튡튢튣튥",6,"튭"],["ba61","튮튯튰튲",5,"튺튻튽튾틁틃",4,"틊틌",5],["ba81","틒틓틕틖틗틙틚틛틝",6,"틦",9,"틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤"],["bb41","틻",4,"팂팄팆",5,"팏팑팒팓팕팗",4,"팞팢팣"],["bb61","팤팦팧팪팫팭팮팯팱",6,"팺팾",5,"퍆퍇퍈퍉"],["bb81","퍊",31,"빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤"],["bc41","퍪",17,"퍾퍿펁펂펃펅펆펇"],["bc61","펈펉펊펋펎펒",5,"펚펛펝펞펟펡",6,"펪펬펮"],["bc81","펯",4,"펵펶펷펹펺펻펽",6,"폆폇폊",5,"폑",5,"샥샨샬샴샵샷샹섀섄섈섐섕서",4,"섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭"],["bd41","폗폙",7,"폢폤",7,"폮폯폱폲폳폵폶폷"],["bd61","폸폹폺폻폾퐀퐂",5,"퐉",13],["bd81","퐗",5,"퐞",25,"숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰"],["be41","퐸",7,"푁푂푃푅",14],["be61","푔",7,"푝푞푟푡푢푣푥",7,"푮푰푱푲"],["be81","푳",4,"푺푻푽푾풁풃",4,"풊풌풎",5,"풕",8,"쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄",6,"엌엎"],["bf41","풞",10,"풪",14],["bf61","풹",18,"퓍퓎퓏퓑퓒퓓퓕"],["bf81","퓖",5,"퓝퓞퓠",7,"퓩퓪퓫퓭퓮퓯퓱",6,"퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염",5,"옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨"],["c041","퓾",5,"픅픆픇픉픊픋픍",6,"픖픘",5],["c061","픞",25],["c081","픸픹픺픻픾픿핁핂핃핅",6,"핎핐핒",5,"핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응",7,"읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊"],["c141","핤핦핧핪핬핮",5,"핶핷핹핺핻핽",6,"햆햊햋"],["c161","햌햍햎햏햑",19,"햦햧"],["c181","햨",31,"점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓"],["c241","헊헋헍헎헏헑헓",4,"헚헜헞",5,"헦헧헩헪헫헭헮"],["c261","헯",4,"헶헸헺",5,"혂혃혅혆혇혉",6,"혒"],["c281","혖",5,"혝혞혟혡혢혣혥",7,"혮",9,"혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻"],["c341","혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝",4],["c361","홢",4,"홨홪",5,"홲홳홵",11],["c381","횁횂횄횆",5,"횎횏횑횒횓횕",7,"횞횠횢",5,"횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층"],["c441","횫횭횮횯횱",7,"횺횼",7,"훆훇훉훊훋"],["c461","훍훎훏훐훒훓훕훖훘훚",5,"훡훢훣훥훦훧훩",4],["c481","훮훯훱훲훳훴훶",5,"훾훿휁휂휃휅",11,"휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼"],["c541","휕휖휗휚휛휝휞휟휡",6,"휪휬휮",5,"휶휷휹"],["c561","휺휻휽",6,"흅흆흈흊",5,"흒흓흕흚",4],["c581","흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵",6,"흾흿힀힂",5,"힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜"],["c641","힍힎힏힑",6,"힚힜힞",5],["c6a1","퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁"],["c7a1","퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠"],["c8a1","혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝"],["caa1","伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕"],["cba1","匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢"],["cca1","瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械"],["cda1","棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜"],["cea1","科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾"],["cfa1","區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴"],["d0a1","鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣"],["d1a1","朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩",5,"那樂",4,"諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉"],["d2a1","納臘蠟衲囊娘廊",4,"乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧",5,"駑魯",10,"濃籠聾膿農惱牢磊腦賂雷尿壘",7,"嫩訥杻紐勒",5,"能菱陵尼泥匿溺多茶"],["d3a1","丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃"],["d4a1","棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅"],["d5a1","蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣"],["d6a1","煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼"],["d7a1","遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬"],["d8a1","立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅"],["d9a1","蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文"],["daa1","汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑"],["dba1","發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖"],["dca1","碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦"],["dda1","孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥"],["dea1","脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索"],["dfa1","傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署"],["e0a1","胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬"],["e1a1","聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁"],["e2a1","戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧"],["e3a1","嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁"],["e4a1","沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額"],["e5a1","櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬"],["e6a1","旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒"],["e7a1","簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳"],["e8a1","烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療"],["e9a1","窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓"],["eaa1","運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜"],["eba1","濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼"],["eca1","議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄"],["eda1","立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長"],["eea1","障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱"],["efa1","煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖"],["f0a1","靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫"],["f1a1","踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只"],["f2a1","咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯"],["f3a1","鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策"],["f4a1","責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢"],["f5a1","椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃"],["f6a1","贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託"],["f7a1","鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑"],["f8a1","阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃"],["f9a1","品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航"],["faa1","行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型"],["fba1","形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵"],["fca1","禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆"],["fda1","爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰"]]
52127 /***/ }),
52128 /* 184 */
52129 /***/ (function(module, exports) {
52131 module.exports = [["8740","䏰䰲䘃䖦䕸𧉧䵷䖳𧲱䳢𧳅㮕䜶䝄䱇䱀𤊿𣘗𧍒𦺋𧃒䱗𪍑䝏䗚䲅𧱬䴇䪤䚡𦬣爥𥩔𡩣𣸆𣽡晍囻"],["8767","綕夝𨮹㷴霴𧯯寛𡵞媤㘥𩺰嫑宷峼杮薓𩥅瑡璝㡵𡵓𣚞𦀡㻬"],["87a1","𥣞㫵竼龗𤅡𨤍𣇪𠪊𣉞䌊蒄龖鐯䤰蘓墖靊鈘秐稲晠権袝瑌篅枂稬剏遆㓦珄𥶹瓆鿇垳䤯呌䄱𣚎堘穲𧭥讏䚮𦺈䆁𥶙箮𢒼鿈𢓁𢓉𢓌鿉蔄𣖻䂴鿊䓡𪷿拁灮鿋"],["8840","㇀",4,"𠄌㇅𠃑𠃍㇆㇇𠃋𡿨㇈𠃊㇉㇊㇋㇌𠄎㇍㇎ĀÁǍÀĒÉĚÈŌÓǑÒ࿿Ê̄Ế࿿Ê̌ỀÊāáǎàɑēéěèīíǐìōóǒòūúǔùǖǘǚ"],["88a1","ǜü࿿ê̄ế࿿ê̌ềêɡ⏚⏛"],["8940","𪎩𡅅"],["8943","攊"],["8946","丽滝鵎釟"],["894c","𧜵撑会伨侨兖兴农凤务动医华发变团声处备夲头学实実岚庆总斉柾栄桥济炼电纤纬纺织经统缆缷艺苏药视设询车轧轮"],["89a1","琑糼緍楆竉刧"],["89ab","醌碸酞肼"],["89b0","贋胶𠧧"],["89b5","肟黇䳍鷉鸌䰾𩷶𧀎鸊𪄳㗁"],["89c1","溚舾甙"],["89c5","䤑马骏龙禇𨑬𡷊𠗐𢫦两亁亀亇亿仫伷㑌侽㹈倃傈㑽㒓㒥円夅凛凼刅争剹劐匧㗇厩㕑厰㕓参吣㕭㕲㚁咓咣咴咹哐哯唘唣唨㖘唿㖥㖿嗗㗅"],["8a40","𧶄唥"],["8a43","𠱂𠴕𥄫喐𢳆㧬𠍁蹆𤶸𩓥䁓𨂾睺𢰸㨴䟕𨅝𦧲𤷪擝𠵼𠾴𠳕𡃴撍蹾𠺖𠰋𠽤𢲩𨉖𤓓"],["8a64","𠵆𩩍𨃩䟴𤺧𢳂骲㩧𩗴㿭㔆𥋇𩟔𧣈𢵄鵮頕"],["8a76","䏙𦂥撴哣𢵌𢯊𡁷㧻𡁯"],["8aa1","𦛚𦜖𧦠擪𥁒𠱃蹨𢆡𨭌𠜱"],["8aac","䠋𠆩㿺塳𢶍"],["8ab2","𤗈𠓼𦂗𠽌𠶖啹䂻䎺"],["8abb","䪴𢩦𡂝膪飵𠶜捹㧾𢝵跀嚡摼㹃"],["8ac9","𪘁𠸉𢫏𢳉"],["8ace","𡃈𣧂㦒㨆𨊛㕸𥹉𢃇噒𠼱𢲲𩜠㒼氽𤸻"],["8adf","𧕴𢺋𢈈𪙛𨳍𠹺𠰴𦠜羓𡃏𢠃𢤹㗻𥇣𠺌𠾍𠺪㾓𠼰𠵇𡅏𠹌"],["8af6","𠺫𠮩𠵈𡃀𡄽㿹𢚖搲𠾭"],["8b40","𣏴𧘹𢯎𠵾𠵿𢱑𢱕㨘𠺘𡃇𠼮𪘲𦭐𨳒𨶙𨳊閪哌苄喹"],["8b55","𩻃鰦骶𧝞𢷮煀腭胬尜𦕲脴㞗卟𨂽醶𠻺𠸏𠹷𠻻㗝𤷫㘉𠳖嚯𢞵𡃉𠸐𠹸𡁸𡅈𨈇𡑕𠹹𤹐𢶤婔𡀝𡀞𡃵𡃶垜𠸑"],["8ba1","𧚔𨋍𠾵𠹻𥅾㜃𠾶𡆀𥋘𪊽𤧚𡠺𤅷𨉼墙剨㘚𥜽箲孨䠀䬬鼧䧧鰟鮍𥭴𣄽嗻㗲嚉丨夂𡯁屮靑𠂆乛亻㔾尣彑忄㣺扌攵歺氵氺灬爫丬犭𤣩罒礻糹罓𦉪㓁"],["8bde","𦍋耂肀𦘒𦥑卝衤见𧢲讠贝钅镸长门𨸏韦页风飞饣𩠐鱼鸟黄歯龜丷𠂇阝户钢"],["8c40","倻淾𩱳龦㷉袏𤅎灷峵䬠𥇍㕙𥴰愢𨨲辧釶熑朙玺𣊁𪄇㲋𡦀䬐磤琂冮𨜏䀉橣𪊺䈣蘏𠩯稪𩥇𨫪靕灍匤𢁾鏴盙𨧣龧矝亣俰傼丯众龨吴綋墒壐𡶶庒庙忂𢜒斋"],["8ca1","𣏹椙橃𣱣泿"],["8ca7","爀𤔅玌㻛𤨓嬕璹讃𥲤𥚕窓篬糃繬苸薗龩袐龪躹龫迏蕟駠鈡龬𨶹𡐿䁱䊢娚"],["8cc9","顨杫䉶圽"],["8cce","藖𤥻芿𧄍䲁𦵴嵻𦬕𦾾龭龮宖龯曧繛湗秊㶈䓃𣉖𢞖䎚䔶"],["8ce6","峕𣬚諹屸㴒𣕑嵸龲煗䕘𤃬𡸣䱷㥸㑊𠆤𦱁諌侴𠈹妿腬顖𩣺弻"],["8d40","𠮟"],["8d42","𢇁𨥭䄂䚻𩁹㼇龳𪆵䃸㟖䛷𦱆䅼𨚲𧏿䕭㣔𥒚䕡䔛䶉䱻䵶䗪㿈𤬏㙡䓞䒽䇭崾嵈嵖㷼㠏嶤嶹㠠㠸幂庽弥徃㤈㤔㤿㥍惗愽峥㦉憷憹懏㦸戬抐拥挘㧸嚱"],["8da1","㨃揢揻搇摚㩋擀崕嘡龟㪗斆㪽旿晓㫲暒㬢朖㭂枤栀㭘桊梄㭲㭱㭻椉楃牜楤榟榅㮼槖㯝橥橴橱檂㯬檙㯲檫檵櫔櫶殁毁毪汵沪㳋洂洆洦涁㳯涤涱渕渘温溆𨧀溻滢滚齿滨滩漤漴㵆𣽁澁澾㵪㵵熷岙㶊瀬㶑灐灔灯灿炉𠌥䏁㗱𠻘"],["8e40","𣻗垾𦻓焾𥟠㙎榢𨯩孴穉𥣡𩓙穥穽𥦬窻窰竂竃燑𦒍䇊竚竝竪䇯咲𥰁笋筕笩𥌎𥳾箢筯莜𥮴𦱿篐萡箒箸𥴠㶭𥱥蒒篺簆簵𥳁籄粃𤢂粦晽𤕸糉糇糦籴糳糵糎"],["8ea1","繧䔝𦹄絝𦻖璍綉綫焵綳緒𤁗𦀩緤㴓緵𡟹緥𨍭縝𦄡𦅚繮纒䌫鑬縧罀罁罇礶𦋐駡羗𦍑羣𡙡𠁨䕜𣝦䔃𨌺翺𦒉者耈耝耨耯𪂇𦳃耻耼聡𢜔䦉𦘦𣷣𦛨朥肧𨩈脇脚墰𢛶汿𦒘𤾸擧𡒊舘𡡞橓𤩥𤪕䑺舩𠬍𦩒𣵾俹𡓽蓢荢𦬊𤦧𣔰𡝳𣷸芪椛芳䇛"],["8f40","蕋苐茚𠸖𡞴㛁𣅽𣕚艻苢茘𣺋𦶣𦬅𦮗𣗎㶿茝嗬莅䔋𦶥莬菁菓㑾𦻔橗蕚㒖𦹂𢻯葘𥯤葱㷓䓤檧葊𣲵祘蒨𦮖𦹷𦹃蓞萏莑䒠蒓蓤𥲑䉀𥳀䕃蔴嫲𦺙䔧蕳䔖枿蘖"],["8fa1","𨘥𨘻藁𧂈蘂𡖂𧃍䕫䕪蘨㙈𡢢号𧎚虾蝱𪃸蟮𢰧螱蟚蠏噡虬桖䘏衅衆𧗠𣶹𧗤衞袜䙛袴袵揁装睷𧜏覇覊覦覩覧覼𨨥觧𧤤𧪽誜瞓釾誐𧩙竩𧬺𣾏䜓𧬸煼謌謟𥐰𥕥謿譌譍誩𤩺讐讛誯𡛟䘕衏貛𧵔𧶏貫㜥𧵓賖𧶘𧶽贒贃𡤐賛灜贑𤳉㻐起"],["9040","趩𨀂𡀔𤦊㭼𨆼𧄌竧躭躶軃鋔輙輭𨍥𨐒辥錃𪊟𠩐辳䤪𨧞𨔽𣶻廸𣉢迹𪀔𨚼𨔁𢌥㦀𦻗逷𨔼𧪾遡𨕬𨘋邨𨜓郄𨛦邮都酧㫰醩釄粬𨤳𡺉鈎沟鉁鉢𥖹銹𨫆𣲛𨬌𥗛"],["90a1","𠴱錬鍫𨫡𨯫炏嫃𨫢𨫥䥥鉄𨯬𨰹𨯿鍳鑛躼閅閦鐦閠濶䊹𢙺𨛘𡉼𣸮䧟氜陻隖䅬隣𦻕懚隶磵𨫠隽双䦡𦲸𠉴𦐐𩂯𩃥𤫑𡤕𣌊霱虂霶䨏䔽䖅𤫩灵孁霛靜𩇕靗孊𩇫靟鐥僐𣂷𣂼鞉鞟鞱鞾韀韒韠𥑬韮琜𩐳響韵𩐝𧥺䫑頴頳顋顦㬎𧅵㵑𠘰𤅜"],["9140","𥜆飊颷飈飇䫿𦴧𡛓喰飡飦飬鍸餹𤨩䭲𩡗𩤅駵騌騻騐驘𥜥㛄𩂱𩯕髠髢𩬅髴䰎鬔鬭𨘀倴鬴𦦨㣃𣁽魐魀𩴾婅𡡣鮎𤉋鰂鯿鰌𩹨鷔𩾷𪆒𪆫𪃡𪄣𪇟鵾鶃𪄴鸎梈"],["91a1","鷄𢅛𪆓𪈠𡤻𪈳鴹𪂹𪊴麐麕麞麢䴴麪麯𤍤黁㭠㧥㴝伲㞾𨰫鼂鼈䮖鐤𦶢鼗鼖鼹嚟嚊齅馸𩂋韲葿齢齩竜龎爖䮾𤥵𤦻煷𤧸𤍈𤩑玞𨯚𡣺禟𨥾𨸶鍩鏳𨩄鋬鎁鏋𨥬𤒹爗㻫睲穃烐𤑳𤏸煾𡟯炣𡢾𣖙㻇𡢅𥐯𡟸㜢𡛻𡠹㛡𡝴𡣑𥽋㜣𡛀坛𤨥𡏾𡊨"],["9240","𡏆𡒶蔃𣚦蔃葕𤦔𧅥𣸱𥕜𣻻𧁒䓴𣛮𩦝𦼦柹㜳㰕㷧塬𡤢栐䁗𣜿𤃡𤂋𤄏𦰡哋嚞𦚱嚒𠿟𠮨𠸍鏆𨬓鎜仸儫㠙𤐶亼𠑥𠍿佋侊𥙑婨𠆫𠏋㦙𠌊𠐔㐵伩𠋀𨺳𠉵諚𠈌亘"],["92a1","働儍侢伃𤨎𣺊佂倮偬傁俌俥偘僼兙兛兝兞湶𣖕𣸹𣺿浲𡢄𣺉冨凃𠗠䓝𠒣𠒒𠒑赺𨪜𠜎剙劤𠡳勡鍮䙺熌𤎌𠰠𤦬𡃤槑𠸝瑹㻞璙琔瑖玘䮎𤪼𤂍叐㖄爏𤃉喴𠍅响𠯆圝鉝雴鍦埝垍坿㘾壋媙𨩆𡛺𡝯𡜐娬妸銏婾嫏娒𥥆𡧳𡡡𤊕㛵洅瑃娡𥺃"],["9340","媁𨯗𠐓鏠璌𡌃焅䥲鐈𨧻鎽㞠尞岞幞幈𡦖𡥼𣫮廍孏𡤃𡤄㜁𡢠㛝𡛾㛓脪𨩇𡶺𣑲𨦨弌弎𡤧𡞫婫𡜻孄蘔𧗽衠恾𢡠𢘫忛㺸𢖯𢖾𩂈𦽳懀𠀾𠁆𢘛憙憘恵𢲛𢴇𤛔𩅍"],["93a1","摱𤙥𢭪㨩𢬢𣑐𩣪𢹸挷𪑛撶挱揑𤧣𢵧护𢲡搻敫楲㯴𣂎𣊭𤦉𣊫唍𣋠𡣙𩐿曎𣊉𣆳㫠䆐𥖄𨬢𥖏𡛼𥕛𥐥磮𣄃𡠪𣈴㑤𣈏𣆂𤋉暎𦴤晫䮓昰𧡰𡷫晣𣋒𣋡昞𥡲㣑𣠺𣞼㮙𣞢𣏾瓐㮖枏𤘪梶栞㯄檾㡣𣟕𤒇樳橒櫉欅𡤒攑梘橌㯗橺歗𣿀𣲚鎠鋲𨯪𨫋"],["9440","銉𨀞𨧜鑧涥漋𤧬浧𣽿㶏渄𤀼娽渊塇洤硂焻𤌚𤉶烱牐犇犔𤞏𤜥兹𤪤𠗫瑺𣻸𣙟𤩊𤤗𥿡㼆㺱𤫟𨰣𣼵悧㻳瓌琼鎇琷䒟𦷪䕑疃㽣𤳙𤴆㽘畕癳𪗆㬙瑨𨫌𤦫𤦎㫻"],["94a1","㷍𤩎㻿𤧅𤣳釺圲鍂𨫣𡡤僟𥈡𥇧睸𣈲眎眏睻𤚗𣞁㩞𤣰琸璛㺿𤪺𤫇䃈𤪖𦆮錇𥖁砞碍碈磒珐祙𧝁𥛣䄎禛蒖禥樭𣻺稺秴䅮𡛦䄲鈵秱𠵌𤦌𠊙𣶺𡝮㖗啫㕰㚪𠇔𠰍竢婙𢛵𥪯𥪜娍𠉛磰娪𥯆竾䇹籝籭䈑𥮳𥺼𥺦糍𤧹𡞰粎籼粮檲緜縇緓罎𦉡"],["9540","𦅜𧭈綗𥺂䉪𦭵𠤖柖𠁎𣗏埄𦐒𦏸𤥢翝笧𠠬𥫩𥵃笌𥸎駦虅驣樜𣐿㧢𤧷𦖭騟𦖠蒀𧄧𦳑䓪脷䐂胆脉腂𦞴飃𦩂艢艥𦩑葓𦶧蘐𧈛媆䅿𡡀嬫𡢡嫤𡣘蚠蜨𣶏蠭𧐢娂"],["95a1","衮佅袇袿裦襥襍𥚃襔𧞅𧞄𨯵𨯙𨮜𨧹㺭蒣䛵䛏㟲訽訜𩑈彍鈫𤊄旔焩烄𡡅鵭貟賩𧷜妚矃姰䍮㛔踪躧𤰉輰轊䋴汘澻𢌡䢛潹溋𡟚鯩㚵𤤯邻邗啱䤆醻鐄𨩋䁢𨫼鐧𨰝𨰻蓥訫閙閧閗閖𨴴瑅㻂𤣿𤩂𤏪㻧𣈥随𨻧𨹦𨹥㻌𤧭𤩸𣿮琒瑫㻼靁𩂰"],["9640","桇䨝𩂓𥟟靝鍨𨦉𨰦𨬯𦎾銺嬑譩䤼珹𤈛鞛靱餸𠼦巁𨯅𤪲頟𩓚鋶𩗗釥䓀𨭐𤩧𨭤飜𨩅㼀鈪䤥萔餻饍𧬆㷽馛䭯馪驜𨭥𥣈檏騡嫾騯𩣱䮐𩥈馼䮽䮗鍽塲𡌂堢𤦸"],["96a1","𡓨硄𢜟𣶸棅㵽鑘㤧慐𢞁𢥫愇鱏鱓鱻鰵鰐魿鯏𩸭鮟𪇵𪃾鴡䲮𤄄鸘䲰鴌𪆴𪃭𪃳𩤯鶥蒽𦸒𦿟𦮂藼䔳𦶤𦺄𦷰萠藮𦸀𣟗𦁤秢𣖜𣙀䤭𤧞㵢鏛銾鍈𠊿碹鉷鑍俤㑀遤𥕝砽硔碶硋𡝗𣇉𤥁㚚佲濚濙瀞瀞吔𤆵垻壳垊鴖埗焴㒯𤆬燫𦱀𤾗嬨𡞵𨩉"],["9740","愌嫎娋䊼𤒈㜬䭻𨧼鎻鎸𡣖𠼝葲𦳀𡐓𤋺𢰦𤏁妔𣶷𦝁綨𦅛𦂤𤦹𤦋𨧺鋥珢㻩璴𨭣𡢟㻡𤪳櫘珳珻㻖𤨾𤪔𡟙𤩦𠎧𡐤𤧥瑈𤤖炥𤥶銄珦鍟𠓾錱𨫎𨨖鎆𨯧𥗕䤵𨪂煫"],["97a1","𤥃𠳿嚤𠘚𠯫𠲸唂秄𡟺緾𡛂𤩐𡡒䔮鐁㜊𨫀𤦭妰𡢿𡢃𧒄媡㛢𣵛㚰鉟婹𨪁𡡢鍴㳍𠪴䪖㦊僴㵩㵌𡎜煵䋻𨈘渏𩃤䓫浗𧹏灧沯㳖𣿭𣸭渂漌㵯𠏵畑㚼㓈䚀㻚䡱姄鉮䤾轁𨰜𦯀堒埈㛖𡑒烾𤍢𤩱𢿣𡊰𢎽梹楧𡎘𣓥𧯴𣛟𨪃𣟖𣏺𤲟樚𣚭𦲷萾䓟䓎"],["9840","𦴦𦵑𦲂𦿞漗𧄉茽𡜺菭𦲀𧁓𡟛妉媂𡞳婡婱𡤅𤇼㜭姯𡜼㛇熎鎐暚𤊥婮娫𤊓樫𣻹𧜶𤑛𤋊焝𤉙𨧡侰𦴨峂𤓎𧹍𤎽樌𤉖𡌄炦焳𤏩㶥泟勇𤩏繥姫崯㷳彜𤩝𡟟綤萦"],["98a1","咅𣫺𣌀𠈔坾𠣕𠘙㿥𡾞𪊶瀃𩅛嵰玏糓𨩙𩐠俈翧狍猐𧫴猸猹𥛶獁獈㺩𧬘遬燵𤣲珡臶㻊県㻑沢国琙琞琟㻢㻰㻴㻺瓓㼎㽓畂畭畲疍㽼痈痜㿀癍㿗癴㿜発𤽜熈嘣覀塩䀝睃䀹条䁅㗛瞘䁪䁯属瞾矋売砘点砜䂨砹硇硑硦葈𥔵礳栃礲䄃"],["9940","䄉禑禙辻稆込䅧窑䆲窼艹䇄竏竛䇏両筢筬筻簒簛䉠䉺类粜䊌粸䊔糭输烀𠳏総緔緐緽羮羴犟䎗耠耥笹耮耱联㷌垴炠肷胩䏭脌猪脎脒畠脔䐁㬹腖腙腚"],["99a1","䐓堺腼膄䐥膓䐭膥埯臁臤艔䒏芦艶苊苘苿䒰荗险榊萅烵葤惣蒈䔄蒾蓡蓸蔐蔸蕒䔻蕯蕰藠䕷虲蚒蚲蛯际螋䘆䘗袮裿褤襇覑𧥧訩訸誔誴豑賔賲贜䞘塟跃䟭仮踺嗘坔蹱嗵躰䠷軎転軤軭軲辷迁迊迌逳駄䢭飠鈓䤞鈨鉘鉫銱銮銿"],["9a40","鋣鋫鋳鋴鋽鍃鎄鎭䥅䥑麿鐗匁鐝鐭鐾䥪鑔鑹锭関䦧间阳䧥枠䨤靀䨵鞲韂噔䫤惨颹䬙飱塄餎餙冴餜餷饂饝饢䭰駅䮝騼鬏窃魩鮁鯝鯱鯴䱭鰠㝯𡯂鵉鰺"],["9aa1","黾噐鶓鶽鷀鷼银辶鹻麬麱麽黆铜黢黱黸竈齄𠂔𠊷𠎠椚铃妬𠓗塀铁㞹𠗕𠘕𠙶𡚺块煳𠫂𠫍𠮿呪吆𠯋咞𠯻𠰻𠱓𠱥𠱼惧𠲍噺𠲵𠳝𠳭𠵯𠶲𠷈楕鰯螥𠸄𠸎𠻗𠾐𠼭𠹳尠𠾼帋𡁜𡁏𡁶朞𡁻𡂈𡂖㙇𡂿𡃓𡄯𡄻卤蒭𡋣𡍵𡌶讁𡕷𡘙𡟃𡟇乸炻𡠭𡥪"],["9b40","𡨭𡩅𡰪𡱰𡲬𡻈拃𡻕𡼕熘桕𢁅槩㛈𢉼𢏗𢏺𢜪𢡱𢥏苽𢥧𢦓𢫕覥𢫨辠𢬎鞸𢬿顇骽𢱌"],["9b62","𢲈𢲷𥯨𢴈𢴒𢶷𢶕𢹂𢽴𢿌𣀳𣁦𣌟𣏞徱晈暿𧩹𣕧𣗳爁𤦺矗𣘚𣜖纇𠍆墵朎"],["9ba1","椘𣪧𧙗𥿢𣸑𣺹𧗾𢂚䣐䪸𤄙𨪚𤋮𤌍𤀻𤌴𤎖𤩅𠗊凒𠘑妟𡺨㮾𣳿𤐄𤓖垈𤙴㦛𤜯𨗨𩧉㝢𢇃譞𨭎駖𤠒𤣻𤨕爉𤫀𠱸奥𤺥𤾆𠝹軚𥀬劏圿煱𥊙𥐙𣽊𤪧喼𥑆𥑮𦭒釔㑳𥔿𧘲𥕞䜘𥕢𥕦𥟇𤤿𥡝偦㓻𣏌惞𥤃䝼𨥈𥪮𥮉𥰆𡶐垡煑澶𦄂𧰒遖𦆲𤾚譢𦐂𦑊"],["9c40","嵛𦯷輶𦒄𡤜諪𤧶𦒈𣿯𦔒䯀𦖿𦚵𢜛鑥𥟡憕娧晉侻嚹𤔡𦛼乪𤤴陖涏𦲽㘘襷𦞙𦡮𦐑𦡞營𦣇筂𩃀𠨑𦤦鄄𦤹穅鷰𦧺騦𦨭㙟𦑩𠀡禃𦨴𦭛崬𣔙菏𦮝䛐𦲤画补𦶮墶"],["9ca1","㜜𢖍𧁋𧇍㱔𧊀𧊅銁𢅺𧊋錰𧋦𤧐氹钟𧑐𠻸蠧裵𢤦𨑳𡞱溸𤨪𡠠㦤㚹尐秣䔿暶𩲭𩢤襃𧟌𧡘囖䃟𡘊㦡𣜯𨃨𡏅熭荦𧧝𩆨婧䲷𧂯𨦫𧧽𧨊𧬋𧵦𤅺筃祾𨀉澵𪋟樃𨌘厢𦸇鎿栶靝𨅯𨀣𦦵𡏭𣈯𨁈嶅𨰰𨂃圕頣𨥉嶫𤦈斾槕叒𤪥𣾁㰑朶𨂐𨃴𨄮𡾡𨅏"],["9d40","𨆉𨆯𨈚𨌆𨌯𨎊㗊𨑨𨚪䣺揦𨥖砈鉕𨦸䏲𨧧䏟𨧨𨭆𨯔姸𨰉輋𨿅𩃬筑𩄐𩄼㷷𩅞𤫊运犏嚋𩓧𩗩𩖰𩖸𩜲𩣑𩥉𩥪𩧃𩨨𩬎𩵚𩶛纟𩻸𩼣䲤镇𪊓熢𪋿䶑递𪗋䶜𠲜达嗁"],["9da1","辺𢒰边𤪓䔉繿潖檱仪㓤𨬬𧢝㜺躀𡟵𨀤𨭬𨮙𧨾𦚯㷫𧙕𣲷𥘵𥥖亚𥺁𦉘嚿𠹭踎孭𣺈𤲞揞拐𡟶𡡻攰嘭𥱊吚𥌑㷆𩶘䱽嘢嘞罉𥻘奵𣵀蝰东𠿪𠵉𣚺脗鵞贘瘻鱅癎瞹鍅吲腈苷嘥脲萘肽嗪祢噃吖𠺝㗎嘅嗱曱𨋢㘭甴嗰喺咗啲𠱁𠲖廐𥅈𠹶𢱢"],["9e40","𠺢麫絚嗞𡁵抝靭咔賍燶酶揼掹揾啩𢭃鱲𢺳冚㓟𠶧冧呍唞唓癦踭𦢊疱肶蠄螆裇膶萜𡃁䓬猄𤜆宐茋𦢓噻𢛴𧴯𤆣𧵳𦻐𧊶酰𡇙鈈𣳼𪚩𠺬𠻹牦𡲢䝎𤿂𧿹𠿫䃺"],["9ea1","鱝攟𢶠䣳𤟠𩵼𠿬𠸊恢𧖣𠿭"],["9ead","𦁈𡆇熣纎鵐业丄㕷嬍沲卧㚬㧜卽㚥𤘘墚𤭮舭呋垪𥪕𠥹"],["9ec5","㩒𢑥獴𩺬䴉鯭𣳾𩼰䱛𤾩𩖞𩿞葜𣶶𧊲𦞳𣜠挮紥𣻷𣸬㨪逈勌㹴㙺䗩𠒎癀嫰𠺶硺𧼮墧䂿噼鮋嵴癔𪐴麅䳡痹㟻愙𣃚𤏲"],["9ef5","噝𡊩垧𤥣𩸆刴𧂮㖭汊鵼"],["9f40","籖鬹埞𡝬屓擓𩓐𦌵𧅤蚭𠴨𦴢𤫢𠵱"],["9f4f","凾𡼏嶎霃𡷑麁遌笟鬂峑箣扨挵髿篏鬪籾鬮籂粆鰕篼鬉鼗鰛𤤾齚啳寃俽麘俲剠㸆勑坧偖妷帒韈鶫轜呩鞴饀鞺匬愰"],["9fa1","椬叚鰊鴂䰻陁榀傦畆𡝭駚剳"],["9fae","酙隁酜"],["9fb2","酑𨺗捿𦴣櫊嘑醎畺抅𠏼獏籰𥰡𣳽"],["9fc1","𤤙盖鮝个𠳔莾衂"],["9fc9","届槀僭坺刟巵从氱𠇲伹咜哚劚趂㗾弌㗳"],["9fdb","歒酼龥鮗頮颴骺麨麄煺笔"],["9fe7","毺蠘罸"],["9feb","嘠𪙊蹷齓"],["9ff0","跔蹏鸜踁抂𨍽踨蹵竓𤩷稾磘泪詧瘇"],["a040","𨩚鼦泎蟖痃𪊲硓咢贌狢獱謭猂瓱賫𤪻蘯徺袠䒷"],["a055","𡠻𦸅"],["a058","詾𢔛"],["a05b","惽癧髗鵄鍮鮏蟵"],["a063","蠏賷猬霡鮰㗖犲䰇籑饊𦅙慙䰄麖慽"],["a073","坟慯抦戹拎㩜懢厪𣏵捤栂㗒"],["a0a1","嵗𨯂迚𨸹"],["a0a6","僙𡵆礆匲阸𠼻䁥"],["a0ae","矾"],["a0b0","糂𥼚糚稭聦聣絍甅瓲覔舚朌聢𧒆聛瓰脃眤覉𦟌畓𦻑螩蟎臈螌詉貭譃眫瓸蓚㘵榲趦"],["a0d4","覩瑨涹蟁𤀑瓧㷛煶悤憜㳑煢恷"],["a0e2","罱𨬭牐惩䭾删㰘𣳇𥻗𧙖𥔱𡥄𡋾𩤃𦷜𧂭峁𦆭𨨏𣙷𠃮𦡆𤼎䕢嬟𦍌齐麦𦉫"],["a3c0","␀",31,"␡"],["c6a1","①",9,"⑴",9,"ⅰ",9,"丶丿亅亠冂冖冫勹匸卩厶夊宀巛⼳广廴彐彡攴无疒癶辵隶¨ˆヽヾゝゞ〃仝々〆〇ー[]✽ぁ",23],["c740","す",58,"ァアィイ"],["c7a1","ゥ",81,"А",5,"ЁЖ",4],["c840","Л",26,"ёж",25,"⇧↸↹㇏𠃌乚𠂊刂䒑"],["c8a1","龰冈龱𧘇"],["c8cd","¬¦'"㈱№℡゛゜⺀⺄⺆⺇⺈⺊⺌⺍⺕⺜⺝⺥⺧⺪⺬⺮⺶⺼⺾⻆⻊⻌⻍⻏⻖⻗⻞⻣"],["c8f5","ʃɐɛɔɵœøŋʊɪ"],["f9fe","■"],["fa40","𠕇鋛𠗟𣿅蕌䊵珯况㙉𤥂𨧤鍄𡧛苮𣳈砼杄拟𤤳𨦪𠊠𦮳𡌅侫𢓭倈𦴩𧪄𣘀𤪱𢔓倩𠍾徤𠎀𠍇滛𠐟偽儁㑺儎顬㝃萖𤦤𠒇兠𣎴兪𠯿𢃼𠋥𢔰𠖎𣈳𡦃宂蝽𠖳𣲙冲冸"],["faa1","鴴凉减凑㳜凓𤪦决凢卂凭菍椾𣜭彻刋刦刼劵剗劔効勅簕蕂勠蘍𦬓包𨫞啉滙𣾀𠥔𣿬匳卄𠯢泋𡜦栛珕恊㺪㣌𡛨燝䒢卭却𨚫卾卿𡖖𡘓矦厓𨪛厠厫厮玧𥝲㽙玜叁叅汉义埾叙㪫𠮏叠𣿫𢶣叶𠱷吓灹唫晗浛呭𦭓𠵴啝咏咤䞦𡜍𠻝㶴𠵍"],["fb40","𨦼𢚘啇䳭启琗喆喩嘅𡣗𤀺䕒𤐵暳𡂴嘷曍𣊊暤暭噍噏磱囱鞇叾圀囯园𨭦㘣𡉏坆𤆥汮炋坂㚱𦱾埦𡐖堃𡑔𤍣堦𤯵塜墪㕡壠壜𡈼壻寿坃𪅐𤉸鏓㖡够梦㛃湙"],["fba1","𡘾娤啓𡚒蔅姉𠵎𦲁𦴪𡟜姙𡟻𡞲𦶦浱𡠨𡛕姹𦹅媫婣㛦𤦩婷㜈媖瑥嫓𦾡𢕔㶅𡤑㜲𡚸広勐孶斈孼𧨎䀄䡝𠈄寕慠𡨴𥧌𠖥寳宝䴐尅𡭄尓珎尔𡲥𦬨屉䣝岅峩峯嶋𡷹𡸷崐崘嵆𡺤岺巗苼㠭𤤁𢁉𢅳芇㠶㯂帮檊幵幺𤒼𠳓厦亷廐厨𡝱帉廴𨒂"],["fc40","廹廻㢠廼栾鐛弍𠇁弢㫞䢮𡌺强𦢈𢏐彘𢑱彣鞽𦹮彲鍀𨨶徧嶶㵟𥉐𡽪𧃸𢙨釖𠊞𨨩怱暅𡡷㥣㷇㘹垐𢞴祱㹀悞悤悳𤦂𤦏𧩓璤僡媠慤萤慂慈𦻒憁凴𠙖憇宪𣾷"],["fca1","𢡟懓𨮝𩥝懐㤲𢦀𢣁怣慜攞掋𠄘担𡝰拕𢸍捬𤧟㨗搸揸𡎎𡟼撐澊𢸶頔𤂌𥜝擡擥鑻㩦携㩗敍漖𤨨𤨣斅敭敟𣁾斵𤥀䬷旑䃘𡠩无旣忟𣐀昘𣇷𣇸晄𣆤𣆥晋𠹵晧𥇦晳晴𡸽𣈱𨗴𣇈𥌓矅𢣷馤朂𤎜𤨡㬫槺𣟂杞杧杢𤇍𩃭柗䓩栢湐鈼栁𣏦𦶠桝"],["fd40","𣑯槡樋𨫟楳棃𣗍椁椀㴲㨁𣘼㮀枬楡𨩊䋼椶榘㮡𠏉荣傐槹𣙙𢄪橅𣜃檝㯳枱櫈𩆜㰍欝𠤣惞欵歴𢟍溵𣫛𠎵𡥘㝀吡𣭚毡𣻼毜氷𢒋𤣱𦭑汚舦汹𣶼䓅𣶽𤆤𤤌𤤀"],["fda1","𣳉㛥㳫𠴲鮃𣇹𢒑羏样𦴥𦶡𦷫涖浜湼漄𤥿𤂅𦹲蔳𦽴凇沜渝萮𨬡港𣸯瑓𣾂秌湏媑𣁋濸㜍澝𣸰滺𡒗𤀽䕕鏰潄潜㵎潴𩅰㴻澟𤅄濓𤂑𤅕𤀹𣿰𣾴𤄿凟𤅖𤅗𤅀𦇝灋灾炧炁烌烕烖烟䄄㷨熴熖𤉷焫煅媈煊煮岜𤍥煏鍢𤋁焬𤑚𤨧𤨢熺𨯨炽爎"],["fe40","鑂爕夑鑃爤鍁𥘅爮牀𤥴梽牕牗㹕𣁄栍漽犂猪猫𤠣𨠫䣭𨠄猨献珏玪𠰺𦨮珉瑉𤇢𡛧𤨤昣㛅𤦷𤦍𤧻珷琕椃𤨦琹𠗃㻗瑜𢢭瑠𨺲瑇珤瑶莹瑬㜰瑴鏱樬璂䥓𤪌"],["fea1","𤅟𤩹𨮏孆𨰃𡢞瓈𡦈甎瓩甞𨻙𡩋寗𨺬鎅畍畊畧畮𤾂㼄𤴓疎瑝疞疴瘂瘬癑癏癯癶𦏵皐臯㟸𦤑𦤎皡皥皷盌𦾟葢𥂝𥅽𡸜眞眦着撯𥈠睘𣊬瞯𨥤𨥨𡛁矴砉𡍶𤨒棊碯磇磓隥礮𥗠磗礴碱𧘌辸袄𨬫𦂃𢘜禆褀椂禀𥡗禝𧬹礼禩渪𧄦㺨秆𩄍秔"]]
52133 /***/ }),
52134 /* 185 */
52135 /***/ (function(module, exports, __webpack_require__) {
52137 "use strict";
52140 var Buffer = __webpack_require__(1).Buffer,
52141     Transform = __webpack_require__(15).Transform;
52144 // == Exports ==================================================================
52145 module.exports = function(iconv) {
52147     // Additional Public API.
52148     iconv.encodeStream = function encodeStream(encoding, options) {
52149         return new IconvLiteEncoderStream(iconv.getEncoder(encoding, options), options);
52150     }
52152     iconv.decodeStream = function decodeStream(encoding, options) {
52153         return new IconvLiteDecoderStream(iconv.getDecoder(encoding, options), options);
52154     }
52156     iconv.supportsStreams = true;
52159     // Not published yet.
52160     iconv.IconvLiteEncoderStream = IconvLiteEncoderStream;
52161     iconv.IconvLiteDecoderStream = IconvLiteDecoderStream;
52162     iconv._collect = IconvLiteDecoderStream.prototype.collect;
52166 // == Encoder stream =======================================================
52167 function IconvLiteEncoderStream(conv, options) {
52168     this.conv = conv;
52169     options = options || {};
52170     options.decodeStrings = false; // We accept only strings, so we don't need to decode them.
52171     Transform.call(this, options);
52174 IconvLiteEncoderStream.prototype = Object.create(Transform.prototype, {
52175     constructor: { value: IconvLiteEncoderStream }
52178 IconvLiteEncoderStream.prototype._transform = function(chunk, encoding, done) {
52179     if (typeof chunk != 'string')
52180         return done(new Error("Iconv encoding stream needs strings as its input."));
52181     try {
52182         var res = this.conv.write(chunk);
52183         if (res && res.length) this.push(res);
52184         done();
52185     }
52186     catch (e) {
52187         done(e);
52188     }
52191 IconvLiteEncoderStream.prototype._flush = function(done) {
52192     try {
52193         var res = this.conv.end();
52194         if (res && res.length) this.push(res);
52195         done();
52196     }
52197     catch (e) {
52198         done(e);
52199     }
52202 IconvLiteEncoderStream.prototype.collect = function(cb) {
52203     var chunks = [];
52204     this.on('error', cb);
52205     this.on('data', function(chunk) { chunks.push(chunk); });
52206     this.on('end', function() {
52207         cb(null, Buffer.concat(chunks));
52208     });
52209     return this;
52213 // == Decoder stream =======================================================
52214 function IconvLiteDecoderStream(conv, options) {
52215     this.conv = conv;
52216     options = options || {};
52217     options.encoding = this.encoding = 'utf8'; // We output strings.
52218     Transform.call(this, options);
52221 IconvLiteDecoderStream.prototype = Object.create(Transform.prototype, {
52222     constructor: { value: IconvLiteDecoderStream }
52225 IconvLiteDecoderStream.prototype._transform = function(chunk, encoding, done) {
52226     if (!Buffer.isBuffer(chunk))
52227         return done(new Error("Iconv decoding stream needs buffers as its input."));
52228     try {
52229         var res = this.conv.write(chunk);
52230         if (res && res.length) this.push(res, this.encoding);
52231         done();
52232     }
52233     catch (e) {
52234         done(e);
52235     }
52238 IconvLiteDecoderStream.prototype._flush = function(done) {
52239     try {
52240         var res = this.conv.end();
52241         if (res && res.length) this.push(res, this.encoding);
52242         done();
52243     }
52244     catch (e) {
52245         done(e);
52246     }
52249 IconvLiteDecoderStream.prototype.collect = function(cb) {
52250     var res = '';
52251     this.on('error', cb);
52252     this.on('data', function(chunk) { res += chunk; });
52253     this.on('end', function() {
52254         cb(null, res);
52255     });
52256     return this;
52261 /***/ }),
52262 /* 186 */
52263 /***/ (function(module, exports, __webpack_require__) {
52265 "use strict";
52267 var Buffer = __webpack_require__(1).Buffer;
52269 // == Extend Node primitives to use iconv-lite =================================
52271 module.exports = function (iconv) {
52272     var original = undefined; // Place to keep original methods.
52274     // Node authors rewrote Buffer internals to make it compatible with
52275     // Uint8Array and we cannot patch key functions since then.
52276     iconv.supportsNodeEncodingsExtension = !(new Buffer(0) instanceof Uint8Array);
52278     iconv.extendNodeEncodings = function extendNodeEncodings() {
52279         if (original) return;
52280         original = {};
52282         if (!iconv.supportsNodeEncodingsExtension) {
52283             console.error("ACTION NEEDED: require('iconv-lite').extendNodeEncodings() is not supported in your version of Node");
52284             console.error("See more info at https://github.com/ashtuchkin/iconv-lite/wiki/Node-v4-compatibility");
52285             return;
52286         }
52288         var nodeNativeEncodings = {
52289             'hex': true, 'utf8': true, 'utf-8': true, 'ascii': true, 'binary': true,
52290             'base64': true, 'ucs2': true, 'ucs-2': true, 'utf16le': true, 'utf-16le': true,
52291         };
52293         Buffer.isNativeEncoding = function(enc) {
52294             return enc && nodeNativeEncodings[enc.toLowerCase()];
52295         }
52297         // -- SlowBuffer -----------------------------------------------------------
52298         var SlowBuffer = __webpack_require__(1).SlowBuffer;
52300         original.SlowBufferToString = SlowBuffer.prototype.toString;
52301         SlowBuffer.prototype.toString = function(encoding, start, end) {
52302             encoding = String(encoding || 'utf8').toLowerCase();
52304             // Use native conversion when possible
52305             if (Buffer.isNativeEncoding(encoding))
52306                 return original.SlowBufferToString.call(this, encoding, start, end);
52308             // Otherwise, use our decoding method.
52309             if (typeof start == 'undefined') start = 0;
52310             if (typeof end == 'undefined') end = this.length;
52311             return iconv.decode(this.slice(start, end), encoding);
52312         }
52314         original.SlowBufferWrite = SlowBuffer.prototype.write;
52315         SlowBuffer.prototype.write = function(string, offset, length, encoding) {
52316             // Support both (string, offset, length, encoding)
52317             // and the legacy (string, encoding, offset, length)
52318             if (isFinite(offset)) {
52319                 if (!isFinite(length)) {
52320                     encoding = length;
52321                     length = undefined;
52322                 }
52323             } else {  // legacy
52324                 var swap = encoding;
52325                 encoding = offset;
52326                 offset = length;
52327                 length = swap;
52328             }
52330             offset = +offset || 0;
52331             var remaining = this.length - offset;
52332             if (!length) {
52333                 length = remaining;
52334             } else {
52335                 length = +length;
52336                 if (length > remaining) {
52337                     length = remaining;
52338                 }
52339             }
52340             encoding = String(encoding || 'utf8').toLowerCase();
52342             // Use native conversion when possible
52343             if (Buffer.isNativeEncoding(encoding))
52344                 return original.SlowBufferWrite.call(this, string, offset, length, encoding);
52346             if (string.length > 0 && (length < 0 || offset < 0))
52347                 throw new RangeError('attempt to write beyond buffer bounds');
52349             // Otherwise, use our encoding method.
52350             var buf = iconv.encode(string, encoding);
52351             if (buf.length < length) length = buf.length;
52352             buf.copy(this, offset, 0, length);
52353             return length;
52354         }
52356         // -- Buffer ---------------------------------------------------------------
52358         original.BufferIsEncoding = Buffer.isEncoding;
52359         Buffer.isEncoding = function(encoding) {
52360             return Buffer.isNativeEncoding(encoding) || iconv.encodingExists(encoding);
52361         }
52363         original.BufferByteLength = Buffer.byteLength;
52364         Buffer.byteLength = SlowBuffer.byteLength = function(str, encoding) {
52365             encoding = String(encoding || 'utf8').toLowerCase();
52367             // Use native conversion when possible
52368             if (Buffer.isNativeEncoding(encoding))
52369                 return original.BufferByteLength.call(this, str, encoding);
52371             // Slow, I know, but we don't have a better way yet.
52372             return iconv.encode(str, encoding).length;
52373         }
52375         original.BufferToString = Buffer.prototype.toString;
52376         Buffer.prototype.toString = function(encoding, start, end) {
52377             encoding = String(encoding || 'utf8').toLowerCase();
52379             // Use native conversion when possible
52380             if (Buffer.isNativeEncoding(encoding))
52381                 return original.BufferToString.call(this, encoding, start, end);
52383             // Otherwise, use our decoding method.
52384             if (typeof start == 'undefined') start = 0;
52385             if (typeof end == 'undefined') end = this.length;
52386             return iconv.decode(this.slice(start, end), encoding);
52387         }
52389         original.BufferWrite = Buffer.prototype.write;
52390         Buffer.prototype.write = function(string, offset, length, encoding) {
52391             var _offset = offset, _length = length, _encoding = encoding;
52392             // Support both (string, offset, length, encoding)
52393             // and the legacy (string, encoding, offset, length)
52394             if (isFinite(offset)) {
52395                 if (!isFinite(length)) {
52396                     encoding = length;
52397                     length = undefined;
52398                 }
52399             } else {  // legacy
52400                 var swap = encoding;
52401                 encoding = offset;
52402                 offset = length;
52403                 length = swap;
52404             }
52406             encoding = String(encoding || 'utf8').toLowerCase();
52408             // Use native conversion when possible
52409             if (Buffer.isNativeEncoding(encoding))
52410                 return original.BufferWrite.call(this, string, _offset, _length, _encoding);
52412             offset = +offset || 0;
52413             var remaining = this.length - offset;
52414             if (!length) {
52415                 length = remaining;
52416             } else {
52417                 length = +length;
52418                 if (length > remaining) {
52419                     length = remaining;
52420                 }
52421             }
52423             if (string.length > 0 && (length < 0 || offset < 0))
52424                 throw new RangeError('attempt to write beyond buffer bounds');
52426             // Otherwise, use our encoding method.
52427             var buf = iconv.encode(string, encoding);
52428             if (buf.length < length) length = buf.length;
52429             buf.copy(this, offset, 0, length);
52430             return length;
52432             // TODO: Set _charsWritten.
52433         }
52436         // -- Readable -------------------------------------------------------------
52437         if (iconv.supportsStreams) {
52438             var Readable = __webpack_require__(15).Readable;
52440             original.ReadableSetEncoding = Readable.prototype.setEncoding;
52441             Readable.prototype.setEncoding = function setEncoding(enc, options) {
52442                 // Use our own decoder, it has the same interface.
52443                 // We cannot use original function as it doesn't handle BOM-s.
52444                 this._readableState.decoder = iconv.getDecoder(enc, options);
52445                 this._readableState.encoding = enc;
52446             }
52448             Readable.prototype.collect = iconv._collect;
52449         }
52450     }
52452     // Remove iconv-lite Node primitive extensions.
52453     iconv.undoExtendNodeEncodings = function undoExtendNodeEncodings() {
52454         if (!iconv.supportsNodeEncodingsExtension)
52455             return;
52456         if (!original)
52457             throw new Error("require('iconv-lite').undoExtendNodeEncodings(): Nothing to undo; extendNodeEncodings() is not called.")
52459         delete Buffer.isNativeEncoding;
52461         var SlowBuffer = __webpack_require__(1).SlowBuffer;
52463         SlowBuffer.prototype.toString = original.SlowBufferToString;
52464         SlowBuffer.prototype.write = original.SlowBufferWrite;
52466         Buffer.isEncoding = original.BufferIsEncoding;
52467         Buffer.byteLength = original.BufferByteLength;
52468         Buffer.prototype.toString = original.BufferToString;
52469         Buffer.prototype.write = original.BufferWrite;
52471         if (iconv.supportsStreams) {
52472             var Readable = __webpack_require__(15).Readable;
52474             Readable.prototype.setEncoding = original.ReadableSetEncoding;
52475             delete Readable.prototype.collect;
52476         }
52478         original = undefined;
52479     }
52483 /***/ }),
52484 /* 187 */
52485 /***/ (function(module, exports, __webpack_require__) {
52487 // Generated by CoffeeScript 1.7.1
52488 (function() {
52489   var ArrayT, LazyArray, LazyArrayT, NumberT, inspect, utils,
52490     __hasProp = {}.hasOwnProperty,
52491     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
52493   ArrayT = __webpack_require__(93);
52495   NumberT = __webpack_require__(22).Number;
52497   utils = __webpack_require__(12);
52499   inspect = __webpack_require__(49).inspect;
52501   LazyArrayT = (function(_super) {
52502     __extends(LazyArrayT, _super);
52504     function LazyArrayT() {
52505       return LazyArrayT.__super__.constructor.apply(this, arguments);
52506     }
52508     LazyArrayT.prototype.decode = function(stream, parent) {
52509       var length, pos, res;
52510       pos = stream.pos;
52511       length = utils.resolveLength(this.length, stream, parent);
52512       if (this.length instanceof NumberT) {
52513         parent = {
52514           parent: parent,
52515           _startOffset: pos,
52516           _currentOffset: 0,
52517           _length: length
52518         };
52519       }
52520       res = new LazyArray(this.type, length, stream, parent);
52521       stream.pos += length * this.type.size(null, parent);
52522       return res;
52523     };
52525     LazyArrayT.prototype.size = function(val, ctx) {
52526       if (val instanceof LazyArray) {
52527         val = val.toArray();
52528       }
52529       return LazyArrayT.__super__.size.call(this, val, ctx);
52530     };
52532     LazyArrayT.prototype.encode = function(stream, val, ctx) {
52533       if (val instanceof LazyArray) {
52534         val = val.toArray();
52535       }
52536       return LazyArrayT.__super__.encode.call(this, stream, val, ctx);
52537     };
52539     return LazyArrayT;
52541   })(ArrayT);
52543   LazyArray = (function() {
52544     function LazyArray(type, length, stream, ctx) {
52545       this.type = type;
52546       this.length = length;
52547       this.stream = stream;
52548       this.ctx = ctx;
52549       this.base = this.stream.pos;
52550       this.items = [];
52551     }
52553     LazyArray.prototype.get = function(index) {
52554       var pos;
52555       if (index < 0 || index >= this.length) {
52556         return void 0;
52557       }
52558       if (this.items[index] == null) {
52559         pos = this.stream.pos;
52560         this.stream.pos = this.base + this.type.size(null, this.ctx) * index;
52561         this.items[index] = this.type.decode(this.stream, this.ctx);
52562         this.stream.pos = pos;
52563       }
52564       return this.items[index];
52565     };
52567     LazyArray.prototype.toArray = function() {
52568       var i, _i, _ref, _results;
52569       _results = [];
52570       for (i = _i = 0, _ref = this.length; _i < _ref; i = _i += 1) {
52571         _results.push(this.get(i));
52572       }
52573       return _results;
52574     };
52576     LazyArray.prototype.inspect = function() {
52577       return inspect(this.toArray());
52578     };
52580     return LazyArray;
52582   })();
52584   module.exports = LazyArrayT;
52586 }).call(this);
52589 /***/ }),
52590 /* 188 */
52591 /***/ (function(module, exports) {
52593 // Generated by CoffeeScript 1.7.1
52594 (function() {
52595   var Bitfield;
52597   Bitfield = (function() {
52598     function Bitfield(type, flags) {
52599       this.type = type;
52600       this.flags = flags != null ? flags : [];
52601     }
52603     Bitfield.prototype.decode = function(stream) {
52604       var flag, i, res, val, _i, _len, _ref;
52605       val = this.type.decode(stream);
52606       res = {};
52607       _ref = this.flags;
52608       for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
52609         flag = _ref[i];
52610         if (flag != null) {
52611           res[flag] = !!(val & (1 << i));
52612         }
52613       }
52614       return res;
52615     };
52617     Bitfield.prototype.size = function() {
52618       return this.type.size();
52619     };
52621     Bitfield.prototype.encode = function(stream, keys) {
52622       var flag, i, val, _i, _len, _ref;
52623       val = 0;
52624       _ref = this.flags;
52625       for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
52626         flag = _ref[i];
52627         if (flag != null) {
52628           if (keys[flag]) {
52629             val |= 1 << i;
52630           }
52631         }
52632       }
52633       return this.type.encode(stream, val);
52634     };
52636     return Bitfield;
52638   })();
52640   module.exports = Bitfield;
52642 }).call(this);
52645 /***/ }),
52646 /* 189 */
52647 /***/ (function(module, exports) {
52649 // Generated by CoffeeScript 1.7.1
52650 (function() {
52651   var BooleanT;
52653   BooleanT = (function() {
52654     function BooleanT(type) {
52655       this.type = type;
52656     }
52658     BooleanT.prototype.decode = function(stream, parent) {
52659       return !!this.type.decode(stream, parent);
52660     };
52662     BooleanT.prototype.size = function(val, parent) {
52663       return this.type.size(val, parent);
52664     };
52666     BooleanT.prototype.encode = function(stream, val, parent) {
52667       return this.type.encode(stream, +val, parent);
52668     };
52670     return BooleanT;
52672   })();
52674   module.exports = BooleanT;
52676 }).call(this);
52679 /***/ }),
52680 /* 190 */
52681 /***/ (function(module, exports, __webpack_require__) {
52683 // Generated by CoffeeScript 1.7.1
52684 (function() {
52685   var BufferT, NumberT, utils;
52687   utils = __webpack_require__(12);
52689   NumberT = __webpack_require__(22).Number;
52691   BufferT = (function() {
52692     function BufferT(length) {
52693       this.length = length;
52694     }
52696     BufferT.prototype.decode = function(stream, parent) {
52697       var length;
52698       length = utils.resolveLength(this.length, stream, parent);
52699       return stream.readBuffer(length);
52700     };
52702     BufferT.prototype.size = function(val, parent) {
52703       if (!val) {
52704         return utils.resolveLength(this.length, null, parent);
52705       }
52706       return val.length;
52707     };
52709     BufferT.prototype.encode = function(stream, buf, parent) {
52710       if (this.length instanceof NumberT) {
52711         this.length.encode(stream, buf.length);
52712       }
52713       return stream.writeBuffer(buf);
52714     };
52716     return BufferT;
52718   })();
52720   module.exports = BufferT;
52722 }).call(this);
52725 /***/ }),
52726 /* 191 */
52727 /***/ (function(module, exports) {
52729 // Generated by CoffeeScript 1.7.1
52730 (function() {
52731   var Enum;
52733   Enum = (function() {
52734     function Enum(type, options) {
52735       this.type = type;
52736       this.options = options != null ? options : [];
52737     }
52739     Enum.prototype.decode = function(stream) {
52740       var index;
52741       index = this.type.decode(stream);
52742       return this.options[index] || index;
52743     };
52745     Enum.prototype.size = function() {
52746       return this.type.size();
52747     };
52749     Enum.prototype.encode = function(stream, val) {
52750       var index;
52751       index = this.options.indexOf(val);
52752       if (index === -1) {
52753         throw new Error("Unknown option in enum: " + val);
52754       }
52755       return this.type.encode(stream, index);
52756     };
52758     return Enum;
52760   })();
52762   module.exports = Enum;
52764 }).call(this);
52767 /***/ }),
52768 /* 192 */
52769 /***/ (function(module, exports) {
52771 // Generated by CoffeeScript 1.7.1
52772 (function() {
52773   var Optional;
52775   Optional = (function() {
52776     function Optional(type, condition) {
52777       this.type = type;
52778       this.condition = condition != null ? condition : true;
52779     }
52781     Optional.prototype.decode = function(stream, parent) {
52782       var condition;
52783       condition = this.condition;
52784       if (typeof condition === 'function') {
52785         condition = condition.call(parent, parent);
52786       }
52787       if (condition) {
52788         return this.type.decode(stream, parent);
52789       }
52790     };
52792     Optional.prototype.size = function(val, parent) {
52793       var condition;
52794       condition = this.condition;
52795       if (typeof condition === 'function') {
52796         condition = condition.call(parent, parent);
52797       }
52798       if (condition) {
52799         return this.type.size(val, parent);
52800       } else {
52801         return 0;
52802       }
52803     };
52805     Optional.prototype.encode = function(stream, val, parent) {
52806       var condition;
52807       condition = this.condition;
52808       if (typeof condition === 'function') {
52809         condition = condition.call(parent, parent);
52810       }
52811       if (condition) {
52812         return this.type.encode(stream, val, parent);
52813       }
52814     };
52816     return Optional;
52818   })();
52820   module.exports = Optional;
52822 }).call(this);
52825 /***/ }),
52826 /* 193 */
52827 /***/ (function(module, exports, __webpack_require__) {
52829 // Generated by CoffeeScript 1.7.1
52830 (function() {
52831   var Reserved, utils;
52833   utils = __webpack_require__(12);
52835   Reserved = (function() {
52836     function Reserved(type, count) {
52837       this.type = type;
52838       this.count = count != null ? count : 1;
52839     }
52841     Reserved.prototype.decode = function(stream, parent) {
52842       stream.pos += this.size(null, parent);
52843       return void 0;
52844     };
52846     Reserved.prototype.size = function(data, parent) {
52847       var count;
52848       count = utils.resolveLength(this.count, null, parent);
52849       return this.type.size() * count;
52850     };
52852     Reserved.prototype.encode = function(stream, val, parent) {
52853       return stream.fill(0, this.size(val, parent));
52854     };
52856     return Reserved;
52858   })();
52860   module.exports = Reserved;
52862 }).call(this);
52865 /***/ }),
52866 /* 194 */
52867 /***/ (function(module, exports, __webpack_require__) {
52869 /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.7.1
52870 (function() {
52871   var NumberT, StringT, utils;
52873   NumberT = __webpack_require__(22).Number;
52875   utils = __webpack_require__(12);
52877   StringT = (function() {
52878     function StringT(length, encoding) {
52879       this.length = length;
52880       this.encoding = encoding != null ? encoding : 'ascii';
52881     }
52883     StringT.prototype.decode = function(stream, parent) {
52884       var buffer, encoding, length, pos, string;
52885       length = (function() {
52886         if (this.length != null) {
52887           return utils.resolveLength(this.length, stream, parent);
52888         } else {
52889           buffer = stream.buffer, length = stream.length, pos = stream.pos;
52890           while (pos < length && buffer[pos] !== 0x00) {
52891             ++pos;
52892           }
52893           return pos - stream.pos;
52894         }
52895       }).call(this);
52896       encoding = this.encoding;
52897       if (typeof encoding === 'function') {
52898         encoding = encoding.call(parent, parent) || 'ascii';
52899       }
52900       string = stream.readString(length, encoding);
52901       if ((this.length == null) && stream.pos < stream.length) {
52902         stream.pos++;
52903       }
52904       return string;
52905     };
52907     StringT.prototype.size = function(val, parent) {
52908       var encoding, size;
52909       if (!val) {
52910         return utils.resolveLength(this.length, null, parent);
52911       }
52912       encoding = this.encoding;
52913       if (typeof encoding === 'function') {
52914         encoding = encoding.call(parent != null ? parent.val : void 0, parent != null ? parent.val : void 0) || 'ascii';
52915       }
52916       if (encoding === 'utf16be') {
52917         encoding = 'utf16le';
52918       }
52919       size = Buffer.byteLength(val, encoding);
52920       if (this.length instanceof NumberT) {
52921         size += this.length.size();
52922       }
52923       if (this.length == null) {
52924         size++;
52925       }
52926       return size;
52927     };
52929     StringT.prototype.encode = function(stream, val, parent) {
52930       var encoding;
52931       encoding = this.encoding;
52932       if (typeof encoding === 'function') {
52933         encoding = encoding.call(parent != null ? parent.val : void 0, parent != null ? parent.val : void 0) || 'ascii';
52934       }
52935       if (this.length instanceof NumberT) {
52936         this.length.encode(stream, Buffer.byteLength(val, encoding));
52937       }
52938       stream.writeString(val, encoding);
52939       if (this.length == null) {
52940         return stream.writeUInt8(0x00);
52941       }
52942     };
52944     return StringT;
52946   })();
52948   module.exports = StringT;
52950 }).call(this);
52952 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
52954 /***/ }),
52955 /* 195 */
52956 /***/ (function(module, exports, __webpack_require__) {
52958 // Generated by CoffeeScript 1.7.1
52959 (function() {
52960   var Struct, VersionedStruct,
52961     __hasProp = {}.hasOwnProperty,
52962     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
52964   Struct = __webpack_require__(94);
52966   VersionedStruct = (function(_super) {
52967     __extends(VersionedStruct, _super);
52969     function VersionedStruct(type, versions) {
52970       this.type = type;
52971       this.versions = versions != null ? versions : {};
52972       if (typeof this.type === 'string') {
52973         this.versionGetter = new Function('parent', "return parent." + this.type);
52974         this.versionSetter = new Function('parent', 'version', "return parent." + this.type + " = version");
52975       }
52976     }
52978     VersionedStruct.prototype.decode = function(stream, parent, length) {
52979       var fields, res, _ref;
52980       if (length == null) {
52981         length = 0;
52982       }
52983       res = this._setup(stream, parent, length);
52984       if (typeof this.type === 'string') {
52985         res.version = this.versionGetter(parent);
52986       } else {
52987         res.version = this.type.decode(stream);
52988       }
52989       if (this.versions.header) {
52990         this._parseFields(stream, res, this.versions.header);
52991       }
52992       fields = this.versions[res.version];
52993       if (fields == null) {
52994         throw new Error("Unknown version " + res.version);
52995       }
52996       if (fields instanceof VersionedStruct) {
52997         return fields.decode(stream, parent);
52998       }
52999       this._parseFields(stream, res, fields);
53000       if ((_ref = this.process) != null) {
53001         _ref.call(res, stream);
53002       }
53003       return res;
53004     };
53006     VersionedStruct.prototype.size = function(val, parent, includePointers) {
53007       var ctx, fields, key, size, type, _ref;
53008       if (includePointers == null) {
53009         includePointers = true;
53010       }
53011       if (!val) {
53012         throw new Error('Not a fixed size');
53013       }
53014       ctx = {
53015         parent: parent,
53016         val: val,
53017         pointerSize: 0
53018       };
53019       size = 0;
53020       if (typeof this.type !== 'string') {
53021         size += this.type.size(val.version, ctx);
53022       }
53023       if (this.versions.header) {
53024         _ref = this.versions.header;
53025         for (key in _ref) {
53026           type = _ref[key];
53027           if (type.size != null) {
53028             size += type.size(val[key], ctx);
53029           }
53030         }
53031       }
53032       fields = this.versions[val.version];
53033       if (fields == null) {
53034         throw new Error("Unknown version " + val.version);
53035       }
53036       for (key in fields) {
53037         type = fields[key];
53038         if (type.size != null) {
53039           size += type.size(val[key], ctx);
53040         }
53041       }
53042       if (includePointers) {
53043         size += ctx.pointerSize;
53044       }
53045       return size;
53046     };
53048     VersionedStruct.prototype.encode = function(stream, val, parent) {
53049       var ctx, fields, i, key, ptr, type, _ref, _ref1;
53050       if ((_ref = this.preEncode) != null) {
53051         _ref.call(val, stream);
53052       }
53053       ctx = {
53054         pointers: [],
53055         startOffset: stream.pos,
53056         parent: parent,
53057         val: val,
53058         pointerSize: 0
53059       };
53060       ctx.pointerOffset = stream.pos + this.size(val, ctx, false);
53061       if (typeof this.type !== 'string') {
53062         this.type.encode(stream, val.version);
53063       }
53064       if (this.versions.header) {
53065         _ref1 = this.versions.header;
53066         for (key in _ref1) {
53067           type = _ref1[key];
53068           if (type.encode != null) {
53069             type.encode(stream, val[key], ctx);
53070           }
53071         }
53072       }
53073       fields = this.versions[val.version];
53074       for (key in fields) {
53075         type = fields[key];
53076         if (type.encode != null) {
53077           type.encode(stream, val[key], ctx);
53078         }
53079       }
53080       i = 0;
53081       while (i < ctx.pointers.length) {
53082         ptr = ctx.pointers[i++];
53083         ptr.type.encode(stream, ptr.val, ptr.parent);
53084       }
53085     };
53087     return VersionedStruct;
53089   })(Struct);
53091   module.exports = VersionedStruct;
53093 }).call(this);
53096 /***/ }),
53097 /* 196 */
53098 /***/ (function(module, exports, __webpack_require__) {
53100 // Generated by CoffeeScript 1.7.1
53101 (function() {
53102   var Pointer, VoidPointer, utils;
53104   utils = __webpack_require__(12);
53106   Pointer = (function() {
53107     function Pointer(offsetType, type, options) {
53108       var _base, _base1, _base2, _base3;
53109       this.offsetType = offsetType;
53110       this.type = type;
53111       this.options = options != null ? options : {};
53112       if (this.type === 'void') {
53113         this.type = null;
53114       }
53115       if ((_base = this.options).type == null) {
53116         _base.type = 'local';
53117       }
53118       if ((_base1 = this.options).allowNull == null) {
53119         _base1.allowNull = true;
53120       }
53121       if ((_base2 = this.options).nullValue == null) {
53122         _base2.nullValue = 0;
53123       }
53124       if ((_base3 = this.options).lazy == null) {
53125         _base3.lazy = false;
53126       }
53127       if (this.options.relativeTo) {
53128         this.relativeToGetter = new Function('ctx', "return ctx." + this.options.relativeTo);
53129       }
53130     }
53132     Pointer.prototype.decode = function(stream, ctx) {
53133       var c, decodeValue, offset, ptr, relative, val;
53134       offset = this.offsetType.decode(stream, ctx);
53135       if (offset === this.options.nullValue && this.options.allowNull) {
53136         return null;
53137       }
53138       relative = (function() {
53139         switch (this.options.type) {
53140           case 'local':
53141             return ctx._startOffset;
53142           case 'immediate':
53143             return stream.pos - this.offsetType.size();
53144           case 'parent':
53145             return ctx.parent._startOffset;
53146           default:
53147             c = ctx;
53148             while (c.parent) {
53149               c = c.parent;
53150             }
53151             return c._startOffset || 0;
53152         }
53153       }).call(this);
53154       if (this.options.relativeTo) {
53155         relative += this.relativeToGetter(ctx);
53156       }
53157       ptr = offset + relative;
53158       if (this.type != null) {
53159         val = null;
53160         decodeValue = (function(_this) {
53161           return function() {
53162             var pos;
53163             if (val != null) {
53164               return val;
53165             }
53166             pos = stream.pos;
53167             stream.pos = ptr;
53168             val = _this.type.decode(stream, ctx);
53169             stream.pos = pos;
53170             return val;
53171           };
53172         })(this);
53173         if (this.options.lazy) {
53174           return new utils.PropertyDescriptor({
53175             get: decodeValue
53176           });
53177         }
53178         return decodeValue();
53179       } else {
53180         return ptr;
53181       }
53182     };
53184     Pointer.prototype.size = function(val, ctx) {
53185       var parent, type;
53186       parent = ctx;
53187       switch (this.options.type) {
53188         case 'local':
53189         case 'immediate':
53190           break;
53191         case 'parent':
53192           ctx = ctx.parent;
53193           break;
53194         default:
53195           while (ctx.parent) {
53196             ctx = ctx.parent;
53197           }
53198       }
53199       type = this.type;
53200       if (type == null) {
53201         if (!(val instanceof VoidPointer)) {
53202           throw new Error("Must be a VoidPointer");
53203         }
53204         type = val.type;
53205         val = val.value;
53206       }
53207       if (val && ctx) {
53208         ctx.pointerSize += type.size(val, parent);
53209       }
53210       return this.offsetType.size();
53211     };
53213     Pointer.prototype.encode = function(stream, val, ctx) {
53214       var parent, relative, type;
53215       parent = ctx;
53216       if (val == null) {
53217         this.offsetType.encode(stream, this.options.nullValue);
53218         return;
53219       }
53220       switch (this.options.type) {
53221         case 'local':
53222           relative = ctx.startOffset;
53223           break;
53224         case 'immediate':
53225           relative = stream.pos + this.offsetType.size(val, parent);
53226           break;
53227         case 'parent':
53228           ctx = ctx.parent;
53229           relative = ctx.startOffset;
53230           break;
53231         default:
53232           relative = 0;
53233           while (ctx.parent) {
53234             ctx = ctx.parent;
53235           }
53236       }
53237       if (this.options.relativeTo) {
53238         relative += this.relativeToGetter(parent.val);
53239       }
53240       this.offsetType.encode(stream, ctx.pointerOffset - relative);
53241       type = this.type;
53242       if (type == null) {
53243         if (!(val instanceof VoidPointer)) {
53244           throw new Error("Must be a VoidPointer");
53245         }
53246         type = val.type;
53247         val = val.value;
53248       }
53249       ctx.pointers.push({
53250         type: type,
53251         val: val,
53252         parent: parent
53253       });
53254       return ctx.pointerOffset += type.size(val, parent);
53255     };
53257     return Pointer;
53259   })();
53261   VoidPointer = (function() {
53262     function VoidPointer(type, value) {
53263       this.type = type;
53264       this.value = value;
53265     }
53267     return VoidPointer;
53269   })();
53271   exports.Pointer = Pointer;
53273   exports.VoidPointer = VoidPointer;
53275 }).call(this);
53278 /***/ }),
53279 /* 197 */
53280 /***/ (function(module, exports, __webpack_require__) {
53282 module.exports = { "default": __webpack_require__(198), __esModule: true };
53284 /***/ }),
53285 /* 198 */
53286 /***/ (function(module, exports, __webpack_require__) {
53288 __webpack_require__(199);
53289 var $Object = __webpack_require__(2).Object;
53290 module.exports = function getOwnPropertyDescriptor(it, key) {
53291   return $Object.getOwnPropertyDescriptor(it, key);
53295 /***/ }),
53296 /* 199 */
53297 /***/ (function(module, exports, __webpack_require__) {
53299 // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
53300 var toIObject = __webpack_require__(17);
53301 var $getOwnPropertyDescriptor = __webpack_require__(57).f;
53303 __webpack_require__(59)('getOwnPropertyDescriptor', function () {
53304   return function getOwnPropertyDescriptor(it, key) {
53305     return $getOwnPropertyDescriptor(toIObject(it), key);
53306   };
53310 /***/ }),
53311 /* 200 */
53312 /***/ (function(module, exports, __webpack_require__) {
53314 __webpack_require__(28);
53315 __webpack_require__(24);
53316 module.exports = __webpack_require__(208);
53319 /***/ }),
53320 /* 201 */
53321 /***/ (function(module, exports, __webpack_require__) {
53323 "use strict";
53325 var addToUnscopables = __webpack_require__(202);
53326 var step = __webpack_require__(98);
53327 var Iterators = __webpack_require__(23);
53328 var toIObject = __webpack_require__(17);
53330 // 22.1.3.4 Array.prototype.entries()
53331 // 22.1.3.13 Array.prototype.keys()
53332 // 22.1.3.29 Array.prototype.values()
53333 // 22.1.3.30 Array.prototype[@@iterator]()
53334 module.exports = __webpack_require__(61)(Array, 'Array', function (iterated, kind) {
53335   this._t = toIObject(iterated); // target
53336   this._i = 0;                   // next index
53337   this._k = kind;                // kind
53338 // 22.1.5.2.1 %ArrayIteratorPrototype%.next()
53339 }, function () {
53340   var O = this._t;
53341   var kind = this._k;
53342   var index = this._i++;
53343   if (!O || index >= O.length) {
53344     this._t = undefined;
53345     return step(1);
53346   }
53347   if (kind == 'keys') return step(0, index);
53348   if (kind == 'values') return step(0, O[index]);
53349   return step(0, [index, O[index]]);
53350 }, 'values');
53352 // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
53353 Iterators.Arguments = Iterators.Array;
53355 addToUnscopables('keys');
53356 addToUnscopables('values');
53357 addToUnscopables('entries');
53360 /***/ }),
53361 /* 202 */
53362 /***/ (function(module, exports) {
53364 module.exports = function () { /* empty */ };
53367 /***/ }),
53368 /* 203 */
53369 /***/ (function(module, exports, __webpack_require__) {
53371 "use strict";
53373 var create = __webpack_require__(36);
53374 var descriptor = __webpack_require__(27);
53375 var setToStringTag = __webpack_require__(39);
53376 var IteratorPrototype = {};
53378 // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
53379 __webpack_require__(13)(IteratorPrototype, __webpack_require__(4)('iterator'), function () { return this; });
53381 module.exports = function (Constructor, NAME, next) {
53382   Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
53383   setToStringTag(Constructor, NAME + ' Iterator');
53387 /***/ }),
53388 /* 204 */
53389 /***/ (function(module, exports, __webpack_require__) {
53391 // false -> Array#indexOf
53392 // true  -> Array#includes
53393 var toIObject = __webpack_require__(17);
53394 var toLength = __webpack_require__(37);
53395 var toAbsoluteIndex = __webpack_require__(102);
53396 module.exports = function (IS_INCLUDES) {
53397   return function ($this, el, fromIndex) {
53398     var O = toIObject($this);
53399     var length = toLength(O.length);
53400     var index = toAbsoluteIndex(fromIndex, length);
53401     var value;
53402     // Array#includes uses SameValueZero equality algorithm
53403     // eslint-disable-next-line no-self-compare
53404     if (IS_INCLUDES && el != el) while (length > index) {
53405       value = O[index++];
53406       // eslint-disable-next-line no-self-compare
53407       if (value != value) return true;
53408     // Array#indexOf ignores holes, Array#includes - not
53409     } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
53410       if (O[index] === el) return IS_INCLUDES || index || 0;
53411     } return !IS_INCLUDES && -1;
53412   };
53416 /***/ }),
53417 /* 205 */
53418 /***/ (function(module, exports, __webpack_require__) {
53420 var document = __webpack_require__(10).document;
53421 module.exports = document && document.documentElement;
53424 /***/ }),
53425 /* 206 */
53426 /***/ (function(module, exports, __webpack_require__) {
53428 // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
53429 var has = __webpack_require__(18);
53430 var toObject = __webpack_require__(30);
53431 var IE_PROTO = __webpack_require__(64)('IE_PROTO');
53432 var ObjectProto = Object.prototype;
53434 module.exports = Object.getPrototypeOf || function (O) {
53435   O = toObject(O);
53436   if (has(O, IE_PROTO)) return O[IE_PROTO];
53437   if (typeof O.constructor == 'function' && O instanceof O.constructor) {
53438     return O.constructor.prototype;
53439   } return O instanceof Object ? ObjectProto : null;
53443 /***/ }),
53444 /* 207 */
53445 /***/ (function(module, exports, __webpack_require__) {
53447 var toInteger = __webpack_require__(63);
53448 var defined = __webpack_require__(56);
53449 // true  -> String#at
53450 // false -> String#codePointAt
53451 module.exports = function (TO_STRING) {
53452   return function (that, pos) {
53453     var s = String(defined(that));
53454     var i = toInteger(pos);
53455     var l = s.length;
53456     var a, b;
53457     if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
53458     a = s.charCodeAt(i);
53459     return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
53460       ? TO_STRING ? s.charAt(i) : a
53461       : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
53462   };
53466 /***/ }),
53467 /* 208 */
53468 /***/ (function(module, exports, __webpack_require__) {
53470 var anObject = __webpack_require__(14);
53471 var get = __webpack_require__(67);
53472 module.exports = __webpack_require__(2).getIterator = function (it) {
53473   var iterFn = get(it);
53474   if (typeof iterFn != 'function') throw TypeError(it + ' is not iterable!');
53475   return anObject(iterFn.call(it));
53479 /***/ }),
53480 /* 209 */
53481 /***/ (function(module, exports, __webpack_require__) {
53483 module.exports = { "default": __webpack_require__(210), __esModule: true };
53485 /***/ }),
53486 /* 210 */
53487 /***/ (function(module, exports, __webpack_require__) {
53489 __webpack_require__(211);
53490 module.exports = __webpack_require__(2).Object.freeze;
53493 /***/ }),
53494 /* 211 */
53495 /***/ (function(module, exports, __webpack_require__) {
53497 // 19.1.2.5 Object.freeze(O)
53498 var isObject = __webpack_require__(9);
53499 var meta = __webpack_require__(40).onFreeze;
53501 __webpack_require__(59)('freeze', function ($freeze) {
53502   return function freeze(it) {
53503     return $freeze && isObject(it) ? $freeze(meta(it)) : it;
53504   };
53508 /***/ }),
53509 /* 212 */
53510 /***/ (function(module, exports, __webpack_require__) {
53512 module.exports = { "default": __webpack_require__(213), __esModule: true };
53514 /***/ }),
53515 /* 213 */
53516 /***/ (function(module, exports, __webpack_require__) {
53518 __webpack_require__(214);
53519 module.exports = __webpack_require__(2).Object.keys;
53522 /***/ }),
53523 /* 214 */
53524 /***/ (function(module, exports, __webpack_require__) {
53526 // 19.1.2.14 Object.keys(O)
53527 var toObject = __webpack_require__(30);
53528 var $keys = __webpack_require__(29);
53530 __webpack_require__(59)('keys', function () {
53531   return function keys(it) {
53532     return $keys(toObject(it));
53533   };
53537 /***/ }),
53538 /* 215 */
53539 /***/ (function(module, exports, __webpack_require__) {
53541 __webpack_require__(24);
53542 __webpack_require__(28);
53543 module.exports = __webpack_require__(70).f('iterator');
53546 /***/ }),
53547 /* 216 */
53548 /***/ (function(module, exports, __webpack_require__) {
53550 module.exports = { "default": __webpack_require__(217), __esModule: true };
53552 /***/ }),
53553 /* 217 */
53554 /***/ (function(module, exports, __webpack_require__) {
53556 __webpack_require__(218);
53557 __webpack_require__(73);
53558 __webpack_require__(221);
53559 __webpack_require__(222);
53560 module.exports = __webpack_require__(2).Symbol;
53563 /***/ }),
53564 /* 218 */
53565 /***/ (function(module, exports, __webpack_require__) {
53567 "use strict";
53569 // ECMAScript 6 symbols shim
53570 var global = __webpack_require__(10);
53571 var has = __webpack_require__(18);
53572 var DESCRIPTORS = __webpack_require__(5);
53573 var $export = __webpack_require__(3);
53574 var redefine = __webpack_require__(99);
53575 var META = __webpack_require__(40).KEY;
53576 var $fails = __webpack_require__(19);
53577 var shared = __webpack_require__(65);
53578 var setToStringTag = __webpack_require__(39);
53579 var uid = __webpack_require__(38);
53580 var wks = __webpack_require__(4);
53581 var wksExt = __webpack_require__(70);
53582 var wksDefine = __webpack_require__(71);
53583 var enumKeys = __webpack_require__(219);
53584 var isArray = __webpack_require__(104);
53585 var anObject = __webpack_require__(14);
53586 var isObject = __webpack_require__(9);
53587 var toIObject = __webpack_require__(17);
53588 var toPrimitive = __webpack_require__(58);
53589 var createDesc = __webpack_require__(27);
53590 var _create = __webpack_require__(36);
53591 var gOPNExt = __webpack_require__(220);
53592 var $GOPD = __webpack_require__(57);
53593 var $DP = __webpack_require__(6);
53594 var $keys = __webpack_require__(29);
53595 var gOPD = $GOPD.f;
53596 var dP = $DP.f;
53597 var gOPN = gOPNExt.f;
53598 var $Symbol = global.Symbol;
53599 var $JSON = global.JSON;
53600 var _stringify = $JSON && $JSON.stringify;
53601 var PROTOTYPE = 'prototype';
53602 var HIDDEN = wks('_hidden');
53603 var TO_PRIMITIVE = wks('toPrimitive');
53604 var isEnum = {}.propertyIsEnumerable;
53605 var SymbolRegistry = shared('symbol-registry');
53606 var AllSymbols = shared('symbols');
53607 var OPSymbols = shared('op-symbols');
53608 var ObjectProto = Object[PROTOTYPE];
53609 var USE_NATIVE = typeof $Symbol == 'function';
53610 var QObject = global.QObject;
53611 // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
53612 var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
53614 // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
53615 var setSymbolDesc = DESCRIPTORS && $fails(function () {
53616   return _create(dP({}, 'a', {
53617     get: function () { return dP(this, 'a', { value: 7 }).a; }
53618   })).a != 7;
53619 }) ? function (it, key, D) {
53620   var protoDesc = gOPD(ObjectProto, key);
53621   if (protoDesc) delete ObjectProto[key];
53622   dP(it, key, D);
53623   if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
53624 } : dP;
53626 var wrap = function (tag) {
53627   var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
53628   sym._k = tag;
53629   return sym;
53632 var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
53633   return typeof it == 'symbol';
53634 } : function (it) {
53635   return it instanceof $Symbol;
53638 var $defineProperty = function defineProperty(it, key, D) {
53639   if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
53640   anObject(it);
53641   key = toPrimitive(key, true);
53642   anObject(D);
53643   if (has(AllSymbols, key)) {
53644     if (!D.enumerable) {
53645       if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
53646       it[HIDDEN][key] = true;
53647     } else {
53648       if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
53649       D = _create(D, { enumerable: createDesc(0, false) });
53650     } return setSymbolDesc(it, key, D);
53651   } return dP(it, key, D);
53653 var $defineProperties = function defineProperties(it, P) {
53654   anObject(it);
53655   var keys = enumKeys(P = toIObject(P));
53656   var i = 0;
53657   var l = keys.length;
53658   var key;
53659   while (l > i) $defineProperty(it, key = keys[i++], P[key]);
53660   return it;
53662 var $create = function create(it, P) {
53663   return P === undefined ? _create(it) : $defineProperties(_create(it), P);
53665 var $propertyIsEnumerable = function propertyIsEnumerable(key) {
53666   var E = isEnum.call(this, key = toPrimitive(key, true));
53667   if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
53668   return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
53670 var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
53671   it = toIObject(it);
53672   key = toPrimitive(key, true);
53673   if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
53674   var D = gOPD(it, key);
53675   if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
53676   return D;
53678 var $getOwnPropertyNames = function getOwnPropertyNames(it) {
53679   var names = gOPN(toIObject(it));
53680   var result = [];
53681   var i = 0;
53682   var key;
53683   while (names.length > i) {
53684     if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
53685   } return result;
53687 var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
53688   var IS_OP = it === ObjectProto;
53689   var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
53690   var result = [];
53691   var i = 0;
53692   var key;
53693   while (names.length > i) {
53694     if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
53695   } return result;
53698 // 19.4.1.1 Symbol([description])
53699 if (!USE_NATIVE) {
53700   $Symbol = function Symbol() {
53701     if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
53702     var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
53703     var $set = function (value) {
53704       if (this === ObjectProto) $set.call(OPSymbols, value);
53705       if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
53706       setSymbolDesc(this, tag, createDesc(1, value));
53707     };
53708     if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
53709     return wrap(tag);
53710   };
53711   redefine($Symbol[PROTOTYPE], 'toString', function toString() {
53712     return this._k;
53713   });
53715   $GOPD.f = $getOwnPropertyDescriptor;
53716   $DP.f = $defineProperty;
53717   __webpack_require__(105).f = gOPNExt.f = $getOwnPropertyNames;
53718   __webpack_require__(35).f = $propertyIsEnumerable;
53719   __webpack_require__(72).f = $getOwnPropertySymbols;
53721   if (DESCRIPTORS && !__webpack_require__(62)) {
53722     redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
53723   }
53725   wksExt.f = function (name) {
53726     return wrap(wks(name));
53727   };
53730 $export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
53732 for (var es6Symbols = (
53733   // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
53734   'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
53735 ).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);
53737 for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);
53739 $export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
53740   // 19.4.2.1 Symbol.for(key)
53741   'for': function (key) {
53742     return has(SymbolRegistry, key += '')
53743       ? SymbolRegistry[key]
53744       : SymbolRegistry[key] = $Symbol(key);
53745   },
53746   // 19.4.2.5 Symbol.keyFor(sym)
53747   keyFor: function keyFor(sym) {
53748     if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
53749     for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
53750   },
53751   useSetter: function () { setter = true; },
53752   useSimple: function () { setter = false; }
53755 $export($export.S + $export.F * !USE_NATIVE, 'Object', {
53756   // 19.1.2.2 Object.create(O [, Properties])
53757   create: $create,
53758   // 19.1.2.4 Object.defineProperty(O, P, Attributes)
53759   defineProperty: $defineProperty,
53760   // 19.1.2.3 Object.defineProperties(O, Properties)
53761   defineProperties: $defineProperties,
53762   // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
53763   getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
53764   // 19.1.2.7 Object.getOwnPropertyNames(O)
53765   getOwnPropertyNames: $getOwnPropertyNames,
53766   // 19.1.2.8 Object.getOwnPropertySymbols(O)
53767   getOwnPropertySymbols: $getOwnPropertySymbols
53770 // 24.3.2 JSON.stringify(value [, replacer [, space]])
53771 $JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
53772   var S = $Symbol();
53773   // MS Edge converts symbol values to JSON as {}
53774   // WebKit converts symbol values to JSON as null
53775   // V8 throws on boxed symbols
53776   return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
53777 })), 'JSON', {
53778   stringify: function stringify(it) {
53779     var args = [it];
53780     var i = 1;
53781     var replacer, $replacer;
53782     while (arguments.length > i) args.push(arguments[i++]);
53783     $replacer = replacer = args[1];
53784     if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
53785     if (!isArray(replacer)) replacer = function (key, value) {
53786       if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
53787       if (!isSymbol(value)) return value;
53788     };
53789     args[1] = replacer;
53790     return _stringify.apply($JSON, args);
53791   }
53794 // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
53795 $Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(13)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
53796 // 19.4.3.5 Symbol.prototype[@@toStringTag]
53797 setToStringTag($Symbol, 'Symbol');
53798 // 20.2.1.9 Math[@@toStringTag]
53799 setToStringTag(Math, 'Math', true);
53800 // 24.3.3 JSON[@@toStringTag]
53801 setToStringTag(global.JSON, 'JSON', true);
53804 /***/ }),
53805 /* 219 */
53806 /***/ (function(module, exports, __webpack_require__) {
53808 // all enumerable object keys, includes symbols
53809 var getKeys = __webpack_require__(29);
53810 var gOPS = __webpack_require__(72);
53811 var pIE = __webpack_require__(35);
53812 module.exports = function (it) {
53813   var result = getKeys(it);
53814   var getSymbols = gOPS.f;
53815   if (getSymbols) {
53816     var symbols = getSymbols(it);
53817     var isEnum = pIE.f;
53818     var i = 0;
53819     var key;
53820     while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
53821   } return result;
53825 /***/ }),
53826 /* 220 */
53827 /***/ (function(module, exports, __webpack_require__) {
53829 // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
53830 var toIObject = __webpack_require__(17);
53831 var gOPN = __webpack_require__(105).f;
53832 var toString = {}.toString;
53834 var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
53835   ? Object.getOwnPropertyNames(window) : [];
53837 var getWindowNames = function (it) {
53838   try {
53839     return gOPN(it);
53840   } catch (e) {
53841     return windowNames.slice();
53842   }
53845 module.exports.f = function getOwnPropertyNames(it) {
53846   return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
53850 /***/ }),
53851 /* 221 */
53852 /***/ (function(module, exports, __webpack_require__) {
53854 __webpack_require__(71)('asyncIterator');
53857 /***/ }),
53858 /* 222 */
53859 /***/ (function(module, exports, __webpack_require__) {
53861 __webpack_require__(71)('observable');
53864 /***/ }),
53865 /* 223 */
53866 /***/ (function(module, exports, __webpack_require__) {
53868 __webpack_require__(224);
53869 var $Object = __webpack_require__(2).Object;
53870 module.exports = function defineProperty(it, key, desc) {
53871   return $Object.defineProperty(it, key, desc);
53875 /***/ }),
53876 /* 224 */
53877 /***/ (function(module, exports, __webpack_require__) {
53879 var $export = __webpack_require__(3);
53880 // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
53881 $export($export.S + $export.F * !__webpack_require__(5), 'Object', { defineProperty: __webpack_require__(6).f });
53884 /***/ }),
53885 /* 225 */
53886 /***/ (function(module, exports, __webpack_require__) {
53888 module.exports = { "default": __webpack_require__(226), __esModule: true };
53890 /***/ }),
53891 /* 226 */
53892 /***/ (function(module, exports, __webpack_require__) {
53894 __webpack_require__(73);
53895 __webpack_require__(24);
53896 __webpack_require__(28);
53897 __webpack_require__(227);
53898 __webpack_require__(232);
53899 __webpack_require__(234);
53900 __webpack_require__(235);
53901 module.exports = __webpack_require__(2).Map;
53904 /***/ }),
53905 /* 227 */
53906 /***/ (function(module, exports, __webpack_require__) {
53908 "use strict";
53910 var strong = __webpack_require__(108);
53911 var validate = __webpack_require__(75);
53912 var MAP = 'Map';
53914 // 23.1 Map Objects
53915 module.exports = __webpack_require__(113)(MAP, function (get) {
53916   return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
53917 }, {
53918   // 23.1.3.6 Map.prototype.get(key)
53919   get: function get(key) {
53920     var entry = strong.getEntry(validate(this, MAP), key);
53921     return entry && entry.v;
53922   },
53923   // 23.1.3.9 Map.prototype.set(key, value)
53924   set: function set(key, value) {
53925     return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);
53926   }
53927 }, strong, true);
53930 /***/ }),
53931 /* 228 */
53932 /***/ (function(module, exports, __webpack_require__) {
53934 "use strict";
53936 var global = __webpack_require__(10);
53937 var core = __webpack_require__(2);
53938 var dP = __webpack_require__(6);
53939 var DESCRIPTORS = __webpack_require__(5);
53940 var SPECIES = __webpack_require__(4)('species');
53942 module.exports = function (KEY) {
53943   var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY];
53944   if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {
53945     configurable: true,
53946     get: function () { return this; }
53947   });
53951 /***/ }),
53952 /* 229 */
53953 /***/ (function(module, exports, __webpack_require__) {
53955 // 0 -> Array#forEach
53956 // 1 -> Array#map
53957 // 2 -> Array#filter
53958 // 3 -> Array#some
53959 // 4 -> Array#every
53960 // 5 -> Array#find
53961 // 6 -> Array#findIndex
53962 var ctx = __webpack_require__(20);
53963 var IObject = __webpack_require__(54);
53964 var toObject = __webpack_require__(30);
53965 var toLength = __webpack_require__(37);
53966 var asc = __webpack_require__(230);
53967 module.exports = function (TYPE, $create) {
53968   var IS_MAP = TYPE == 1;
53969   var IS_FILTER = TYPE == 2;
53970   var IS_SOME = TYPE == 3;
53971   var IS_EVERY = TYPE == 4;
53972   var IS_FIND_INDEX = TYPE == 6;
53973   var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
53974   var create = $create || asc;
53975   return function ($this, callbackfn, that) {
53976     var O = toObject($this);
53977     var self = IObject(O);
53978     var f = ctx(callbackfn, that, 3);
53979     var length = toLength(self.length);
53980     var index = 0;
53981     var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
53982     var val, res;
53983     for (;length > index; index++) if (NO_HOLES || index in self) {
53984       val = self[index];
53985       res = f(val, index, O);
53986       if (TYPE) {
53987         if (IS_MAP) result[index] = res;   // map
53988         else if (res) switch (TYPE) {
53989           case 3: return true;             // some
53990           case 5: return val;              // find
53991           case 6: return index;            // findIndex
53992           case 2: result.push(val);        // filter
53993         } else if (IS_EVERY) return false; // every
53994       }
53995     }
53996     return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
53997   };
54001 /***/ }),
54002 /* 230 */
54003 /***/ (function(module, exports, __webpack_require__) {
54005 // 9.4.2.3 ArraySpeciesCreate(originalArray, length)
54006 var speciesConstructor = __webpack_require__(231);
54008 module.exports = function (original, length) {
54009   return new (speciesConstructor(original))(length);
54013 /***/ }),
54014 /* 231 */
54015 /***/ (function(module, exports, __webpack_require__) {
54017 var isObject = __webpack_require__(9);
54018 var isArray = __webpack_require__(104);
54019 var SPECIES = __webpack_require__(4)('species');
54021 module.exports = function (original) {
54022   var C;
54023   if (isArray(original)) {
54024     C = original.constructor;
54025     // cross-realm fallback
54026     if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;
54027     if (isObject(C)) {
54028       C = C[SPECIES];
54029       if (C === null) C = undefined;
54030     }
54031   } return C === undefined ? Array : C;
54035 /***/ }),
54036 /* 232 */
54037 /***/ (function(module, exports, __webpack_require__) {
54039 // https://github.com/DavidBruant/Map-Set.prototype.toJSON
54040 var $export = __webpack_require__(3);
54042 $export($export.P + $export.R, 'Map', { toJSON: __webpack_require__(114)('Map') });
54045 /***/ }),
54046 /* 233 */
54047 /***/ (function(module, exports, __webpack_require__) {
54049 var forOf = __webpack_require__(41);
54051 module.exports = function (iter, ITERATOR) {
54052   var result = [];
54053   forOf(iter, false, result.push, result, ITERATOR);
54054   return result;
54058 /***/ }),
54059 /* 234 */
54060 /***/ (function(module, exports, __webpack_require__) {
54062 // https://tc39.github.io/proposal-setmap-offrom/#sec-map.of
54063 __webpack_require__(115)('Map');
54066 /***/ }),
54067 /* 235 */
54068 /***/ (function(module, exports, __webpack_require__) {
54070 // https://tc39.github.io/proposal-setmap-offrom/#sec-map.from
54071 __webpack_require__(116)('Map');
54074 /***/ }),
54075 /* 236 */
54076 /***/ (function(module, exports, __webpack_require__) {
54078 "use strict";
54081 exports.__esModule = true;
54083 var _typeof2 = __webpack_require__(69);
54085 var _typeof3 = _interopRequireDefault(_typeof2);
54087 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
54089 exports.default = function (self, call) {
54090   if (!self) {
54091     throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
54092   }
54094   return call && ((typeof call === "undefined" ? "undefined" : (0, _typeof3.default)(call)) === "object" || typeof call === "function") ? call : self;
54097 /***/ }),
54098 /* 237 */
54099 /***/ (function(module, exports, __webpack_require__) {
54101 "use strict";
54104 exports.__esModule = true;
54106 var _setPrototypeOf = __webpack_require__(238);
54108 var _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);
54110 var _create = __webpack_require__(242);
54112 var _create2 = _interopRequireDefault(_create);
54114 var _typeof2 = __webpack_require__(69);
54116 var _typeof3 = _interopRequireDefault(_typeof2);
54118 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
54120 exports.default = function (subClass, superClass) {
54121   if (typeof superClass !== "function" && superClass !== null) {
54122     throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : (0, _typeof3.default)(superClass)));
54123   }
54125   subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {
54126     constructor: {
54127       value: subClass,
54128       enumerable: false,
54129       writable: true,
54130       configurable: true
54131     }
54132   });
54133   if (superClass) _setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass;
54136 /***/ }),
54137 /* 238 */
54138 /***/ (function(module, exports, __webpack_require__) {
54140 module.exports = { "default": __webpack_require__(239), __esModule: true };
54142 /***/ }),
54143 /* 239 */
54144 /***/ (function(module, exports, __webpack_require__) {
54146 __webpack_require__(240);
54147 module.exports = __webpack_require__(2).Object.setPrototypeOf;
54150 /***/ }),
54151 /* 240 */
54152 /***/ (function(module, exports, __webpack_require__) {
54154 // 19.1.3.19 Object.setPrototypeOf(O, proto)
54155 var $export = __webpack_require__(3);
54156 $export($export.S, 'Object', { setPrototypeOf: __webpack_require__(241).set });
54159 /***/ }),
54160 /* 241 */
54161 /***/ (function(module, exports, __webpack_require__) {
54163 // Works with __proto__ only. Old v8 can't work with null proto objects.
54164 /* eslint-disable no-proto */
54165 var isObject = __webpack_require__(9);
54166 var anObject = __webpack_require__(14);
54167 var check = function (O, proto) {
54168   anObject(O);
54169   if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
54171 module.exports = {
54172   set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
54173     function (test, buggy, set) {
54174       try {
54175         set = __webpack_require__(20)(Function.call, __webpack_require__(57).f(Object.prototype, '__proto__').set, 2);
54176         set(test, []);
54177         buggy = !(test instanceof Array);
54178       } catch (e) { buggy = true; }
54179       return function setPrototypeOf(O, proto) {
54180         check(O, proto);
54181         if (buggy) O.__proto__ = proto;
54182         else set(O, proto);
54183         return O;
54184       };
54185     }({}, false) : undefined),
54186   check: check
54190 /***/ }),
54191 /* 242 */
54192 /***/ (function(module, exports, __webpack_require__) {
54194 module.exports = { "default": __webpack_require__(243), __esModule: true };
54196 /***/ }),
54197 /* 243 */
54198 /***/ (function(module, exports, __webpack_require__) {
54200 __webpack_require__(244);
54201 var $Object = __webpack_require__(2).Object;
54202 module.exports = function create(P, D) {
54203   return $Object.create(P, D);
54207 /***/ }),
54208 /* 244 */
54209 /***/ (function(module, exports, __webpack_require__) {
54211 var $export = __webpack_require__(3);
54212 // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
54213 $export($export.S, 'Object', { create: __webpack_require__(36) });
54216 /***/ }),
54217 /* 245 */
54218 /***/ (function(module, exports, __webpack_require__) {
54220 module.exports = { "default": __webpack_require__(246), __esModule: true };
54222 /***/ }),
54223 /* 246 */
54224 /***/ (function(module, exports, __webpack_require__) {
54226 __webpack_require__(247);
54227 var $Object = __webpack_require__(2).Object;
54228 module.exports = function defineProperties(T, D) {
54229   return $Object.defineProperties(T, D);
54233 /***/ }),
54234 /* 247 */
54235 /***/ (function(module, exports, __webpack_require__) {
54237 var $export = __webpack_require__(3);
54238 // 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)
54239 $export($export.S + $export.F * !__webpack_require__(5), 'Object', { defineProperties: __webpack_require__(100) });
54242 /***/ }),
54243 /* 248 */
54244 /***/ (function(module, exports, __webpack_require__) {
54246 var pSlice = Array.prototype.slice;
54247 var objectKeys = __webpack_require__(249);
54248 var isArguments = __webpack_require__(250);
54250 var deepEqual = module.exports = function (actual, expected, opts) {
54251   if (!opts) opts = {};
54252   // 7.1. All identical values are equivalent, as determined by ===.
54253   if (actual === expected) {
54254     return true;
54256   } else if (actual instanceof Date && expected instanceof Date) {
54257     return actual.getTime() === expected.getTime();
54259   // 7.3. Other pairs that do not both pass typeof value == 'object',
54260   // equivalence is determined by ==.
54261   } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {
54262     return opts.strict ? actual === expected : actual == expected;
54264   // 7.4. For all other Object pairs, including Array objects, equivalence is
54265   // determined by having the same number of owned properties (as verified
54266   // with Object.prototype.hasOwnProperty.call), the same set of keys
54267   // (although not necessarily the same order), equivalent values for every
54268   // corresponding key, and an identical 'prototype' property. Note: this
54269   // accounts for both named and indexed properties on Arrays.
54270   } else {
54271     return objEquiv(actual, expected, opts);
54272   }
54275 function isUndefinedOrNull(value) {
54276   return value === null || value === undefined;
54279 function isBuffer (x) {
54280   if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;
54281   if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {
54282     return false;
54283   }
54284   if (x.length > 0 && typeof x[0] !== 'number') return false;
54285   return true;
54288 function objEquiv(a, b, opts) {
54289   var i, key;
54290   if (isUndefinedOrNull(a) || isUndefinedOrNull(b))
54291     return false;
54292   // an identical 'prototype' property.
54293   if (a.prototype !== b.prototype) return false;
54294   //~~~I've managed to break Object.keys through screwy arguments passing.
54295   //   Converting to array solves the problem.
54296   if (isArguments(a)) {
54297     if (!isArguments(b)) {
54298       return false;
54299     }
54300     a = pSlice.call(a);
54301     b = pSlice.call(b);
54302     return deepEqual(a, b, opts);
54303   }
54304   if (isBuffer(a)) {
54305     if (!isBuffer(b)) {
54306       return false;
54307     }
54308     if (a.length !== b.length) return false;
54309     for (i = 0; i < a.length; i++) {
54310       if (a[i] !== b[i]) return false;
54311     }
54312     return true;
54313   }
54314   try {
54315     var ka = objectKeys(a),
54316         kb = objectKeys(b);
54317   } catch (e) {//happens when one is a string literal and the other isn't
54318     return false;
54319   }
54320   // having the same number of owned properties (keys incorporates
54321   // hasOwnProperty)
54322   if (ka.length != kb.length)
54323     return false;
54324   //the same set of keys (although not necessarily the same order),
54325   ka.sort();
54326   kb.sort();
54327   //~~~cheap key test
54328   for (i = ka.length - 1; i >= 0; i--) {
54329     if (ka[i] != kb[i])
54330       return false;
54331   }
54332   //equivalent values for every corresponding key, and
54333   //~~~possibly expensive deep test
54334   for (i = ka.length - 1; i >= 0; i--) {
54335     key = ka[i];
54336     if (!deepEqual(a[key], b[key], opts)) return false;
54337   }
54338   return typeof a === typeof b;
54342 /***/ }),
54343 /* 249 */
54344 /***/ (function(module, exports) {
54346 exports = module.exports = typeof Object.keys === 'function'
54347   ? Object.keys : shim;
54349 exports.shim = shim;
54350 function shim (obj) {
54351   var keys = [];
54352   for (var key in obj) keys.push(key);
54353   return keys;
54357 /***/ }),
54358 /* 250 */
54359 /***/ (function(module, exports) {
54361 var supportsArgumentsClass = (function(){
54362   return Object.prototype.toString.call(arguments)
54363 })() == '[object Arguments]';
54365 exports = module.exports = supportsArgumentsClass ? supported : unsupported;
54367 exports.supported = supported;
54368 function supported(object) {
54369   return Object.prototype.toString.call(object) == '[object Arguments]';
54372 exports.unsupported = unsupported;
54373 function unsupported(object){
54374   return object &&
54375     typeof object == 'object' &&
54376     typeof object.length == 'number' &&
54377     Object.prototype.hasOwnProperty.call(object, 'callee') &&
54378     !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||
54379     false;
54383 /***/ }),
54384 /* 251 */
54385 /***/ (function(module, exports, __webpack_require__) {
54387 module.exports = { "default": __webpack_require__(252), __esModule: true };
54389 /***/ }),
54390 /* 252 */
54391 /***/ (function(module, exports, __webpack_require__) {
54393 __webpack_require__(253);
54394 module.exports = __webpack_require__(2).Object.assign;
54397 /***/ }),
54398 /* 253 */
54399 /***/ (function(module, exports, __webpack_require__) {
54401 // 19.1.3.1 Object.assign(target, source)
54402 var $export = __webpack_require__(3);
54404 $export($export.S + $export.F, 'Object', { assign: __webpack_require__(254) });
54407 /***/ }),
54408 /* 254 */
54409 /***/ (function(module, exports, __webpack_require__) {
54411 "use strict";
54413 // 19.1.2.1 Object.assign(target, source, ...)
54414 var getKeys = __webpack_require__(29);
54415 var gOPS = __webpack_require__(72);
54416 var pIE = __webpack_require__(35);
54417 var toObject = __webpack_require__(30);
54418 var IObject = __webpack_require__(54);
54419 var $assign = Object.assign;
54421 // should work with symbols and should have deterministic property order (V8 bug)
54422 module.exports = !$assign || __webpack_require__(19)(function () {
54423   var A = {};
54424   var B = {};
54425   // eslint-disable-next-line no-undef
54426   var S = Symbol();
54427   var K = 'abcdefghijklmnopqrst';
54428   A[S] = 7;
54429   K.split('').forEach(function (k) { B[k] = k; });
54430   return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
54431 }) ? function assign(target, source) { // eslint-disable-line no-unused-vars
54432   var T = toObject(target);
54433   var aLen = arguments.length;
54434   var index = 1;
54435   var getSymbols = gOPS.f;
54436   var isEnum = pIE.f;
54437   while (aLen > index) {
54438     var S = IObject(arguments[index++]);
54439     var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);
54440     var length = keys.length;
54441     var j = 0;
54442     var key;
54443     while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
54444   } return T;
54445 } : $assign;
54448 /***/ }),
54449 /* 255 */
54450 /***/ (function(module, exports, __webpack_require__) {
54452 module.exports = { "default": __webpack_require__(256), __esModule: true };
54454 /***/ }),
54455 /* 256 */
54456 /***/ (function(module, exports, __webpack_require__) {
54458 __webpack_require__(257);
54459 module.exports = __webpack_require__(2).String.fromCodePoint;
54462 /***/ }),
54463 /* 257 */
54464 /***/ (function(module, exports, __webpack_require__) {
54466 var $export = __webpack_require__(3);
54467 var toAbsoluteIndex = __webpack_require__(102);
54468 var fromCharCode = String.fromCharCode;
54469 var $fromCodePoint = String.fromCodePoint;
54471 // length should be 1, old FF problem
54472 $export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
54473   // 21.1.2.2 String.fromCodePoint(...codePoints)
54474   fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars
54475     var res = [];
54476     var aLen = arguments.length;
54477     var i = 0;
54478     var code;
54479     while (aLen > i) {
54480       code = +arguments[i++];
54481       if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');
54482       res.push(code < 0x10000
54483         ? fromCharCode(code)
54484         : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)
54485       );
54486     } return res.join('');
54487   }
54491 /***/ }),
54492 /* 258 */
54493 /***/ (function(module, exports, __webpack_require__) {
54495 module.exports = { "default": __webpack_require__(259), __esModule: true };
54497 /***/ }),
54498 /* 259 */
54499 /***/ (function(module, exports, __webpack_require__) {
54501 __webpack_require__(24);
54502 __webpack_require__(260);
54503 module.exports = __webpack_require__(2).Array.from;
54506 /***/ }),
54507 /* 260 */
54508 /***/ (function(module, exports, __webpack_require__) {
54510 "use strict";
54512 var ctx = __webpack_require__(20);
54513 var $export = __webpack_require__(3);
54514 var toObject = __webpack_require__(30);
54515 var call = __webpack_require__(111);
54516 var isArrayIter = __webpack_require__(112);
54517 var toLength = __webpack_require__(37);
54518 var createProperty = __webpack_require__(261);
54519 var getIterFn = __webpack_require__(67);
54521 $export($export.S + $export.F * !__webpack_require__(262)(function (iter) { Array.from(iter); }), 'Array', {
54522   // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
54523   from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
54524     var O = toObject(arrayLike);
54525     var C = typeof this == 'function' ? this : Array;
54526     var aLen = arguments.length;
54527     var mapfn = aLen > 1 ? arguments[1] : undefined;
54528     var mapping = mapfn !== undefined;
54529     var index = 0;
54530     var iterFn = getIterFn(O);
54531     var length, result, step, iterator;
54532     if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);
54533     // if object isn't iterable or it's array with default iterator - use simple case
54534     if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {
54535       for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
54536         createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);
54537       }
54538     } else {
54539       length = toLength(O.length);
54540       for (result = new C(length); length > index; index++) {
54541         createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
54542       }
54543     }
54544     result.length = index;
54545     return result;
54546   }
54550 /***/ }),
54551 /* 261 */
54552 /***/ (function(module, exports, __webpack_require__) {
54554 "use strict";
54556 var $defineProperty = __webpack_require__(6);
54557 var createDesc = __webpack_require__(27);
54559 module.exports = function (object, index, value) {
54560   if (index in object) $defineProperty.f(object, index, createDesc(0, value));
54561   else object[index] = value;
54565 /***/ }),
54566 /* 262 */
54567 /***/ (function(module, exports, __webpack_require__) {
54569 var ITERATOR = __webpack_require__(4)('iterator');
54570 var SAFE_CLOSING = false;
54572 try {
54573   var riter = [7][ITERATOR]();
54574   riter['return'] = function () { SAFE_CLOSING = true; };
54575   // eslint-disable-next-line no-throw-literal
54576   Array.from(riter, function () { throw 2; });
54577 } catch (e) { /* empty */ }
54579 module.exports = function (exec, skipClosing) {
54580   if (!skipClosing && !SAFE_CLOSING) return false;
54581   var safe = false;
54582   try {
54583     var arr = [7];
54584     var iter = arr[ITERATOR]();
54585     iter.next = function () { return { done: safe = true }; };
54586     arr[ITERATOR] = function () { return iter; };
54587     exec(arr);
54588   } catch (e) { /* empty */ }
54589   return safe;
54593 /***/ }),
54594 /* 263 */
54595 /***/ (function(module, exports, __webpack_require__) {
54597 module.exports = { "default": __webpack_require__(264), __esModule: true };
54599 /***/ }),
54600 /* 264 */
54601 /***/ (function(module, exports, __webpack_require__) {
54603 __webpack_require__(73);
54604 __webpack_require__(24);
54605 __webpack_require__(28);
54606 __webpack_require__(265);
54607 __webpack_require__(266);
54608 __webpack_require__(267);
54609 __webpack_require__(268);
54610 module.exports = __webpack_require__(2).Set;
54613 /***/ }),
54614 /* 265 */
54615 /***/ (function(module, exports, __webpack_require__) {
54617 "use strict";
54619 var strong = __webpack_require__(108);
54620 var validate = __webpack_require__(75);
54621 var SET = 'Set';
54623 // 23.2 Set Objects
54624 module.exports = __webpack_require__(113)(SET, function (get) {
54625   return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
54626 }, {
54627   // 23.2.3.1 Set.prototype.add(value)
54628   add: function add(value) {
54629     return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);
54630   }
54631 }, strong);
54634 /***/ }),
54635 /* 266 */
54636 /***/ (function(module, exports, __webpack_require__) {
54638 // https://github.com/DavidBruant/Map-Set.prototype.toJSON
54639 var $export = __webpack_require__(3);
54641 $export($export.P + $export.R, 'Set', { toJSON: __webpack_require__(114)('Set') });
54644 /***/ }),
54645 /* 267 */
54646 /***/ (function(module, exports, __webpack_require__) {
54648 // https://tc39.github.io/proposal-setmap-offrom/#sec-set.of
54649 __webpack_require__(115)('Set');
54652 /***/ }),
54653 /* 268 */
54654 /***/ (function(module, exports, __webpack_require__) {
54656 // https://tc39.github.io/proposal-setmap-offrom/#sec-set.from
54657 __webpack_require__(116)('Set');
54660 /***/ }),
54661 /* 269 */
54662 /***/ (function(module, exports, __webpack_require__) {
54664 /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.9.1
54665 var CATEGORY_BITS, CATEGORY_MASK, CATEGORY_SHIFT, COMBINING_BITS, COMBINING_MASK, COMBINING_SHIFT, EAW_BITS, EAW_MASK, EAW_SHIFT, NUMBER_BITS, NUMBER_MASK, SCRIPT_BITS, SCRIPT_MASK, SCRIPT_SHIFT, UnicodeTrie, bits, data, fs, log2, trie;
54667 UnicodeTrie = __webpack_require__(43);
54669 data = __webpack_require__(270);
54673 trie = new UnicodeTrie(Buffer("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","base64"));
54675 log2 = Math.log2 || function(n) {
54676   return Math.log(n) / Math.LN2;
54679 bits = function(n) {
54680   return (log2(n) + 1) | 0;
54683 CATEGORY_BITS = bits(data.categories.length - 1);
54685 COMBINING_BITS = bits(data.combiningClasses.length - 1);
54687 SCRIPT_BITS = bits(data.scripts.length - 1);
54689 EAW_BITS = bits(data.eaw.length - 1);
54691 NUMBER_BITS = 10;
54693 CATEGORY_SHIFT = COMBINING_BITS + SCRIPT_BITS + EAW_BITS + NUMBER_BITS;
54695 COMBINING_SHIFT = SCRIPT_BITS + EAW_BITS + NUMBER_BITS;
54697 SCRIPT_SHIFT = EAW_BITS + NUMBER_BITS;
54699 EAW_SHIFT = NUMBER_BITS;
54701 CATEGORY_MASK = (1 << CATEGORY_BITS) - 1;
54703 COMBINING_MASK = (1 << COMBINING_BITS) - 1;
54705 SCRIPT_MASK = (1 << SCRIPT_BITS) - 1;
54707 EAW_MASK = (1 << EAW_BITS) - 1;
54709 NUMBER_MASK = (1 << NUMBER_BITS) - 1;
54711 exports.getCategory = function(codePoint) {
54712   var val;
54713   val = trie.get(codePoint);
54714   return data.categories[(val >> CATEGORY_SHIFT) & CATEGORY_MASK];
54717 exports.getCombiningClass = function(codePoint) {
54718   var val;
54719   val = trie.get(codePoint);
54720   return data.combiningClasses[(val >> COMBINING_SHIFT) & COMBINING_MASK];
54723 exports.getScript = function(codePoint) {
54724   var val;
54725   val = trie.get(codePoint);
54726   return data.scripts[(val >> SCRIPT_SHIFT) & SCRIPT_MASK];
54729 exports.getEastAsianWidth = function(codePoint) {
54730   var val;
54731   val = trie.get(codePoint);
54732   return data.eaw[(val >> EAW_SHIFT) & EAW_MASK];
54735 exports.getNumericValue = function(codePoint) {
54736   var denominator, exp, num, numerator, val;
54737   val = trie.get(codePoint);
54738   num = val & NUMBER_MASK;
54739   if (num === 0) {
54740     return null;
54741   } else if (num <= 50) {
54742     return num - 1;
54743   } else if (num < 0x1e0) {
54744     numerator = (num >> 4) - 12;
54745     denominator = (num & 0xf) + 1;
54746     return numerator / denominator;
54747   } else if (num < 0x300) {
54748     val = (num >> 5) - 14;
54749     exp = (num & 0x1f) + 2;
54750     while (exp > 0) {
54751       val *= 10;
54752       exp--;
54753     }
54754     return val;
54755   } else {
54756     val = (num >> 2) - 0xbf;
54757     exp = (num & 3) + 1;
54758     while (exp > 0) {
54759       val *= 60;
54760       exp--;
54761     }
54762     return val;
54763   }
54766 exports.isAlphabetic = function(codePoint) {
54767   var ref;
54768   return (ref = exports.getCategory(codePoint)) === 'Lu' || ref === 'Ll' || ref === 'Lt' || ref === 'Lm' || ref === 'Lo' || ref === 'Nl';
54771 exports.isDigit = function(codePoint) {
54772   return exports.getCategory(codePoint) === 'Nd';
54775 exports.isPunctuation = function(codePoint) {
54776   var ref;
54777   return (ref = exports.getCategory(codePoint)) === 'Pc' || ref === 'Pd' || ref === 'Pe' || ref === 'Pf' || ref === 'Pi' || ref === 'Po' || ref === 'Ps';
54780 exports.isLowerCase = function(codePoint) {
54781   return exports.getCategory(codePoint) === 'Ll';
54784 exports.isUpperCase = function(codePoint) {
54785   return exports.getCategory(codePoint) === 'Lu';
54788 exports.isTitleCase = function(codePoint) {
54789   return exports.getCategory(codePoint) === 'Lt';
54792 exports.isWhiteSpace = function(codePoint) {
54793   var ref;
54794   return (ref = exports.getCategory(codePoint)) === 'Zs' || ref === 'Zl' || ref === 'Zp';
54797 exports.isBaseForm = function(codePoint) {
54798   var ref;
54799   return (ref = exports.getCategory(codePoint)) === 'Nd' || ref === 'No' || ref === 'Nl' || ref === 'Lu' || ref === 'Ll' || ref === 'Lt' || ref === 'Lm' || ref === 'Lo' || ref === 'Me' || ref === 'Mc';
54802 exports.isMark = function(codePoint) {
54803   var ref;
54804   return (ref = exports.getCategory(codePoint)) === 'Mn' || ref === 'Me' || ref === 'Mc';
54807 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
54809 /***/ }),
54810 /* 270 */
54811 /***/ (function(module, exports) {
54813 module.exports = {"categories":["Cc","Zs","Po","Sc","Ps","Pe","Sm","Pd","Nd","Lu","Sk","Pc","Ll","So","Lo","Pi","Cf","No","Pf","Lt","Lm","Mn","Me","Mc","Nl","Zl","Zp","Cs","Co"],"combiningClasses":["Not_Reordered","Above","Above_Right","Below","Attached_Above_Right","Attached_Below","Overlay","Iota_Subscript","Double_Below","Double_Above","Below_Right","Above_Left","CCC10","CCC11","CCC12","CCC13","CCC14","CCC15","CCC16","CCC17","CCC18","CCC19","CCC20","CCC21","CCC22","CCC23","CCC24","CCC25","CCC30","CCC31","CCC32","CCC27","CCC28","CCC29","CCC33","CCC34","CCC35","CCC36","Nukta","Virama","CCC84","CCC91","CCC103","CCC107","CCC118","CCC122","CCC129","CCC130","CCC132","Attached_Above","Below_Left","Left","Kana_Voicing","CCC26","Right"],"scripts":["Common","Latin","Bopomofo","Inherited","Greek","Coptic","Cyrillic","Armenian","Hebrew","Arabic","Syriac","Thaana","Nko","Samaritan","Mandaic","Devanagari","Bengali","Gurmukhi","Gujarati","Oriya","Tamil","Telugu","Kannada","Malayalam","Sinhala","Thai","Lao","Tibetan","Myanmar","Georgian","Hangul","Ethiopic","Cherokee","Canadian_Aboriginal","Ogham","Runic","Tagalog","Hanunoo","Buhid","Tagbanwa","Khmer","Mongolian","Limbu","Tai_Le","New_Tai_Lue","Buginese","Tai_Tham","Balinese","Sundanese","Batak","Lepcha","Ol_Chiki","Braille","Glagolitic","Tifinagh","Han","Hiragana","Katakana","Yi","Lisu","Vai","Bamum","Syloti_Nagri","Phags_Pa","Saurashtra","Kayah_Li","Rejang","Javanese","Cham","Tai_Viet","Meetei_Mayek","null","Linear_B","Lycian","Carian","Old_Italic","Gothic","Old_Permic","Ugaritic","Old_Persian","Deseret","Shavian","Osmanya","Elbasan","Caucasian_Albanian","Linear_A","Cypriot","Imperial_Aramaic","Palmyrene","Nabataean","Hatran","Phoenician","Lydian","Meroitic_Hieroglyphs","Meroitic_Cursive","Kharoshthi","Old_South_Arabian","Old_North_Arabian","Manichaean","Avestan","Inscriptional_Parthian","Inscriptional_Pahlavi","Psalter_Pahlavi","Old_Turkic","Old_Hungarian","Brahmi","Kaithi","Sora_Sompeng","Chakma","Mahajani","Sharada","Khojki","Multani","Khudawadi","Grantha","Tirhuta","Siddham","Modi","Takri","Ahom","Warang_Citi","Pau_Cin_Hau","Cuneiform","Egyptian_Hieroglyphs","Anatolian_Hieroglyphs","Mro","Bassa_Vah","Pahawh_Hmong","Miao","Duployan","SignWriting","Mende_Kikakui"],"eaw":["N","Na","A","W","H","F"]}
54815 /***/ }),
54816 /* 271 */
54817 /***/ (function(module, exports, __webpack_require__) {
54819 "use strict";
54822 function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
54824 var _slicedToArray = _interopDefault(__webpack_require__(272));
54825 var _getIterator = _interopDefault(__webpack_require__(60));
54826 var _defineProperty = _interopDefault(__webpack_require__(276));
54827 var _regeneratorRuntime = _interopDefault(__webpack_require__(277));
54828 var _Symbol$iterator = _interopDefault(__webpack_require__(103));
54829 var _classCallCheck = _interopDefault(__webpack_require__(106));
54830 var _createClass = _interopDefault(__webpack_require__(107));
54832 var INITIAL_STATE = 1;
54833 var FAIL_STATE = 0;
54836  * A StateMachine represents a deterministic finite automaton.
54837  * It can perform matches over a sequence of values, similar to a regular expression.
54838  */
54840 var StateMachine = function () {
54841   function StateMachine(dfa) {
54842     _classCallCheck(this, StateMachine);
54844     this.stateTable = dfa.stateTable;
54845     this.accepting = dfa.accepting;
54846     this.tags = dfa.tags;
54847   }
54849   /**
54850    * Returns an iterable object that yields pattern matches over the input sequence.
54851    * Matches are of the form [startIndex, endIndex, tags].
54852    */
54855   _createClass(StateMachine, [{
54856     key: 'match',
54857     value: function match(str) {
54858       var self = this;
54859       return _defineProperty({}, _Symbol$iterator, _regeneratorRuntime.mark(function _callee() {
54860         var state, startRun, lastAccepting, lastState, p, c;
54861         return _regeneratorRuntime.wrap(function _callee$(_context) {
54862           while (1) {
54863             switch (_context.prev = _context.next) {
54864               case 0:
54865                 state = INITIAL_STATE;
54866                 startRun = null;
54867                 lastAccepting = null;
54868                 lastState = null;
54869                 p = 0;
54871               case 5:
54872                 if (!(p < str.length)) {
54873                   _context.next = 21;
54874                   break;
54875                 }
54877                 c = str[p];
54880                 lastState = state;
54881                 state = self.stateTable[state][c];
54883                 if (!(state === FAIL_STATE)) {
54884                   _context.next = 15;
54885                   break;
54886                 }
54888                 if (!(startRun != null && lastAccepting != null && lastAccepting >= startRun)) {
54889                   _context.next = 13;
54890                   break;
54891                 }
54893                 _context.next = 13;
54894                 return [startRun, lastAccepting, self.tags[lastState]];
54896               case 13:
54898                 // reset the state as if we started over from the initial state
54899                 state = self.stateTable[INITIAL_STATE][c];
54900                 startRun = null;
54902               case 15:
54904                 // start a run if not in the failure state
54905                 if (state !== FAIL_STATE && startRun == null) {
54906                   startRun = p;
54907                 }
54909                 // if accepting, mark the potential match end
54910                 if (self.accepting[state]) {
54911                   lastAccepting = p;
54912                 }
54914                 // reset the state to the initial state if we get into the failure state
54915                 if (state === FAIL_STATE) {
54916                   state = INITIAL_STATE;
54917                 }
54919               case 18:
54920                 p++;
54921                 _context.next = 5;
54922                 break;
54924               case 21:
54925                 if (!(startRun != null && lastAccepting != null && lastAccepting >= startRun)) {
54926                   _context.next = 24;
54927                   break;
54928                 }
54930                 _context.next = 24;
54931                 return [startRun, lastAccepting, self.tags[state]];
54933               case 24:
54934               case 'end':
54935                 return _context.stop();
54936             }
54937           }
54938         }, _callee, this);
54939       }));
54940     }
54942     /**
54943      * For each match over the input sequence, action functions matching
54944      * the tag definitions in the input pattern are called with the startIndex,
54945      * endIndex, and sub-match sequence.
54946      */
54948   }, {
54949     key: 'apply',
54950     value: function apply(str, actions) {
54951       var _iteratorNormalCompletion = true;
54952       var _didIteratorError = false;
54953       var _iteratorError = undefined;
54955       try {
54956         for (var _iterator = _getIterator(this.match(str)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
54957           var _step$value = _slicedToArray(_step.value, 3);
54959           var start = _step$value[0];
54960           var end = _step$value[1];
54961           var tags = _step$value[2];
54962           var _iteratorNormalCompletion2 = true;
54963           var _didIteratorError2 = false;
54964           var _iteratorError2 = undefined;
54966           try {
54967             for (var _iterator2 = _getIterator(tags), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
54968               var tag = _step2.value;
54970               if (typeof actions[tag] === 'function') {
54971                 actions[tag](start, end, str.slice(start, end + 1));
54972               }
54973             }
54974           } catch (err) {
54975             _didIteratorError2 = true;
54976             _iteratorError2 = err;
54977           } finally {
54978             try {
54979               if (!_iteratorNormalCompletion2 && _iterator2.return) {
54980                 _iterator2.return();
54981               }
54982             } finally {
54983               if (_didIteratorError2) {
54984                 throw _iteratorError2;
54985               }
54986             }
54987           }
54988         }
54989       } catch (err) {
54990         _didIteratorError = true;
54991         _iteratorError = err;
54992       } finally {
54993         try {
54994           if (!_iteratorNormalCompletion && _iterator.return) {
54995             _iterator.return();
54996           }
54997         } finally {
54998           if (_didIteratorError) {
54999             throw _iteratorError;
55000           }
55001         }
55002       }
55003     }
55004   }]);
55006   return StateMachine;
55007 }();
55009 module.exports = StateMachine;
55012 /***/ }),
55013 /* 272 */
55014 /***/ (function(module, exports, __webpack_require__) {
55016 "use strict";
55019 exports.__esModule = true;
55021 var _isIterable2 = __webpack_require__(273);
55023 var _isIterable3 = _interopRequireDefault(_isIterable2);
55025 var _getIterator2 = __webpack_require__(60);
55027 var _getIterator3 = _interopRequireDefault(_getIterator2);
55029 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
55031 exports.default = function () {
55032   function sliceIterator(arr, i) {
55033     var _arr = [];
55034     var _n = true;
55035     var _d = false;
55036     var _e = undefined;
55038     try {
55039       for (var _i = (0, _getIterator3.default)(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {
55040         _arr.push(_s.value);
55042         if (i && _arr.length === i) break;
55043       }
55044     } catch (err) {
55045       _d = true;
55046       _e = err;
55047     } finally {
55048       try {
55049         if (!_n && _i["return"]) _i["return"]();
55050       } finally {
55051         if (_d) throw _e;
55052       }
55053     }
55055     return _arr;
55056   }
55058   return function (arr, i) {
55059     if (Array.isArray(arr)) {
55060       return arr;
55061     } else if ((0, _isIterable3.default)(Object(arr))) {
55062       return sliceIterator(arr, i);
55063     } else {
55064       throw new TypeError("Invalid attempt to destructure non-iterable instance");
55065     }
55066   };
55067 }();
55069 /***/ }),
55070 /* 273 */
55071 /***/ (function(module, exports, __webpack_require__) {
55073 module.exports = { "default": __webpack_require__(274), __esModule: true };
55075 /***/ }),
55076 /* 274 */
55077 /***/ (function(module, exports, __webpack_require__) {
55079 __webpack_require__(28);
55080 __webpack_require__(24);
55081 module.exports = __webpack_require__(275);
55084 /***/ }),
55085 /* 275 */
55086 /***/ (function(module, exports, __webpack_require__) {
55088 var classof = __webpack_require__(68);
55089 var ITERATOR = __webpack_require__(4)('iterator');
55090 var Iterators = __webpack_require__(23);
55091 module.exports = __webpack_require__(2).isIterable = function (it) {
55092   var O = Object(it);
55093   return O[ITERATOR] !== undefined
55094     || '@@iterator' in O
55095     // eslint-disable-next-line no-prototype-builtins
55096     || Iterators.hasOwnProperty(classof(O));
55100 /***/ }),
55101 /* 276 */
55102 /***/ (function(module, exports, __webpack_require__) {
55104 "use strict";
55107 exports.__esModule = true;
55109 var _defineProperty = __webpack_require__(74);
55111 var _defineProperty2 = _interopRequireDefault(_defineProperty);
55113 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
55115 exports.default = function (obj, key, value) {
55116   if (key in obj) {
55117     (0, _defineProperty2.default)(obj, key, {
55118       value: value,
55119       enumerable: true,
55120       configurable: true,
55121       writable: true
55122     });
55123   } else {
55124     obj[key] = value;
55125   }
55127   return obj;
55130 /***/ }),
55131 /* 277 */
55132 /***/ (function(module, exports, __webpack_require__) {
55134 module.exports = __webpack_require__(278);
55137 /***/ }),
55138 /* 278 */
55139 /***/ (function(module, exports, __webpack_require__) {
55142  * Copyright (c) 2014-present, Facebook, Inc.
55144  * This source code is licensed under the MIT license found in the
55145  * LICENSE file in the root directory of this source tree.
55146  */
55148 // This method of obtaining a reference to the global object needs to be
55149 // kept identical to the way it is obtained in runtime.js
55150 var g = (function() { return this })() || Function("return this")();
55152 // Use `getOwnPropertyNames` because not all browsers support calling
55153 // `hasOwnProperty` on the global `self` object in a worker. See #183.
55154 var hadRuntime = g.regeneratorRuntime &&
55155   Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
55157 // Save the old regeneratorRuntime in case it needs to be restored later.
55158 var oldRuntime = hadRuntime && g.regeneratorRuntime;
55160 // Force reevalutation of runtime.js.
55161 g.regeneratorRuntime = undefined;
55163 module.exports = __webpack_require__(279);
55165 if (hadRuntime) {
55166   // Restore the original runtime.
55167   g.regeneratorRuntime = oldRuntime;
55168 } else {
55169   // Remove the global property added by runtime.js.
55170   try {
55171     delete g.regeneratorRuntime;
55172   } catch(e) {
55173     g.regeneratorRuntime = undefined;
55174   }
55178 /***/ }),
55179 /* 279 */
55180 /***/ (function(module, exports) {
55183  * Copyright (c) 2014-present, Facebook, Inc.
55185  * This source code is licensed under the MIT license found in the
55186  * LICENSE file in the root directory of this source tree.
55187  */
55189 !(function(global) {
55190   "use strict";
55192   var Op = Object.prototype;
55193   var hasOwn = Op.hasOwnProperty;
55194   var undefined; // More compressible than void 0.
55195   var $Symbol = typeof Symbol === "function" ? Symbol : {};
55196   var iteratorSymbol = $Symbol.iterator || "@@iterator";
55197   var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
55198   var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
55200   var inModule = typeof module === "object";
55201   var runtime = global.regeneratorRuntime;
55202   if (runtime) {
55203     if (inModule) {
55204       // If regeneratorRuntime is defined globally and we're in a module,
55205       // make the exports object identical to regeneratorRuntime.
55206       module.exports = runtime;
55207     }
55208     // Don't bother evaluating the rest of this file if the runtime was
55209     // already defined globally.
55210     return;
55211   }
55213   // Define the runtime globally (as expected by generated code) as either
55214   // module.exports (if we're in a module) or a new, empty object.
55215   runtime = global.regeneratorRuntime = inModule ? module.exports : {};
55217   function wrap(innerFn, outerFn, self, tryLocsList) {
55218     // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
55219     var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
55220     var generator = Object.create(protoGenerator.prototype);
55221     var context = new Context(tryLocsList || []);
55223     // The ._invoke method unifies the implementations of the .next,
55224     // .throw, and .return methods.
55225     generator._invoke = makeInvokeMethod(innerFn, self, context);
55227     return generator;
55228   }
55229   runtime.wrap = wrap;
55231   // Try/catch helper to minimize deoptimizations. Returns a completion
55232   // record like context.tryEntries[i].completion. This interface could
55233   // have been (and was previously) designed to take a closure to be
55234   // invoked without arguments, but in all the cases we care about we
55235   // already have an existing method we want to call, so there's no need
55236   // to create a new function object. We can even get away with assuming
55237   // the method takes exactly one argument, since that happens to be true
55238   // in every case, so we don't have to touch the arguments object. The
55239   // only additional allocation required is the completion record, which
55240   // has a stable shape and so hopefully should be cheap to allocate.
55241   function tryCatch(fn, obj, arg) {
55242     try {
55243       return { type: "normal", arg: fn.call(obj, arg) };
55244     } catch (err) {
55245       return { type: "throw", arg: err };
55246     }
55247   }
55249   var GenStateSuspendedStart = "suspendedStart";
55250   var GenStateSuspendedYield = "suspendedYield";
55251   var GenStateExecuting = "executing";
55252   var GenStateCompleted = "completed";
55254   // Returning this object from the innerFn has the same effect as
55255   // breaking out of the dispatch switch statement.
55256   var ContinueSentinel = {};
55258   // Dummy constructor functions that we use as the .constructor and
55259   // .constructor.prototype properties for functions that return Generator
55260   // objects. For full spec compliance, you may wish to configure your
55261   // minifier not to mangle the names of these two functions.
55262   function Generator() {}
55263   function GeneratorFunction() {}
55264   function GeneratorFunctionPrototype() {}
55266   // This is a polyfill for %IteratorPrototype% for environments that
55267   // don't natively support it.
55268   var IteratorPrototype = {};
55269   IteratorPrototype[iteratorSymbol] = function () {
55270     return this;
55271   };
55273   var getProto = Object.getPrototypeOf;
55274   var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
55275   if (NativeIteratorPrototype &&
55276       NativeIteratorPrototype !== Op &&
55277       hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
55278     // This environment has a native %IteratorPrototype%; use it instead
55279     // of the polyfill.
55280     IteratorPrototype = NativeIteratorPrototype;
55281   }
55283   var Gp = GeneratorFunctionPrototype.prototype =
55284     Generator.prototype = Object.create(IteratorPrototype);
55285   GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
55286   GeneratorFunctionPrototype.constructor = GeneratorFunction;
55287   GeneratorFunctionPrototype[toStringTagSymbol] =
55288     GeneratorFunction.displayName = "GeneratorFunction";
55290   // Helper for defining the .next, .throw, and .return methods of the
55291   // Iterator interface in terms of a single ._invoke method.
55292   function defineIteratorMethods(prototype) {
55293     ["next", "throw", "return"].forEach(function(method) {
55294       prototype[method] = function(arg) {
55295         return this._invoke(method, arg);
55296       };
55297     });
55298   }
55300   runtime.isGeneratorFunction = function(genFun) {
55301     var ctor = typeof genFun === "function" && genFun.constructor;
55302     return ctor
55303       ? ctor === GeneratorFunction ||
55304         // For the native GeneratorFunction constructor, the best we can
55305         // do is to check its .name property.
55306         (ctor.displayName || ctor.name) === "GeneratorFunction"
55307       : false;
55308   };
55310   runtime.mark = function(genFun) {
55311     if (Object.setPrototypeOf) {
55312       Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
55313     } else {
55314       genFun.__proto__ = GeneratorFunctionPrototype;
55315       if (!(toStringTagSymbol in genFun)) {
55316         genFun[toStringTagSymbol] = "GeneratorFunction";
55317       }
55318     }
55319     genFun.prototype = Object.create(Gp);
55320     return genFun;
55321   };
55323   // Within the body of any async function, `await x` is transformed to
55324   // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
55325   // `hasOwn.call(value, "__await")` to determine if the yielded value is
55326   // meant to be awaited.
55327   runtime.awrap = function(arg) {
55328     return { __await: arg };
55329   };
55331   function AsyncIterator(generator) {
55332     function invoke(method, arg, resolve, reject) {
55333       var record = tryCatch(generator[method], generator, arg);
55334       if (record.type === "throw") {
55335         reject(record.arg);
55336       } else {
55337         var result = record.arg;
55338         var value = result.value;
55339         if (value &&
55340             typeof value === "object" &&
55341             hasOwn.call(value, "__await")) {
55342           return Promise.resolve(value.__await).then(function(value) {
55343             invoke("next", value, resolve, reject);
55344           }, function(err) {
55345             invoke("throw", err, resolve, reject);
55346           });
55347         }
55349         return Promise.resolve(value).then(function(unwrapped) {
55350           // When a yielded Promise is resolved, its final value becomes
55351           // the .value of the Promise<{value,done}> result for the
55352           // current iteration. If the Promise is rejected, however, the
55353           // result for this iteration will be rejected with the same
55354           // reason. Note that rejections of yielded Promises are not
55355           // thrown back into the generator function, as is the case
55356           // when an awaited Promise is rejected. This difference in
55357           // behavior between yield and await is important, because it
55358           // allows the consumer to decide what to do with the yielded
55359           // rejection (swallow it and continue, manually .throw it back
55360           // into the generator, abandon iteration, whatever). With
55361           // await, by contrast, there is no opportunity to examine the
55362           // rejection reason outside the generator function, so the
55363           // only option is to throw it from the await expression, and
55364           // let the generator function handle the exception.
55365           result.value = unwrapped;
55366           resolve(result);
55367         }, reject);
55368       }
55369     }
55371     var previousPromise;
55373     function enqueue(method, arg) {
55374       function callInvokeWithMethodAndArg() {
55375         return new Promise(function(resolve, reject) {
55376           invoke(method, arg, resolve, reject);
55377         });
55378       }
55380       return previousPromise =
55381         // If enqueue has been called before, then we want to wait until
55382         // all previous Promises have been resolved before calling invoke,
55383         // so that results are always delivered in the correct order. If
55384         // enqueue has not been called before, then it is important to
55385         // call invoke immediately, without waiting on a callback to fire,
55386         // so that the async generator function has the opportunity to do
55387         // any necessary setup in a predictable way. This predictability
55388         // is why the Promise constructor synchronously invokes its
55389         // executor callback, and why async functions synchronously
55390         // execute code before the first await. Since we implement simple
55391         // async functions in terms of async generators, it is especially
55392         // important to get this right, even though it requires care.
55393         previousPromise ? previousPromise.then(
55394           callInvokeWithMethodAndArg,
55395           // Avoid propagating failures to Promises returned by later
55396           // invocations of the iterator.
55397           callInvokeWithMethodAndArg
55398         ) : callInvokeWithMethodAndArg();
55399     }
55401     // Define the unified helper method that is used to implement .next,
55402     // .throw, and .return (see defineIteratorMethods).
55403     this._invoke = enqueue;
55404   }
55406   defineIteratorMethods(AsyncIterator.prototype);
55407   AsyncIterator.prototype[asyncIteratorSymbol] = function () {
55408     return this;
55409   };
55410   runtime.AsyncIterator = AsyncIterator;
55412   // Note that simple async functions are implemented on top of
55413   // AsyncIterator objects; they just return a Promise for the value of
55414   // the final result produced by the iterator.
55415   runtime.async = function(innerFn, outerFn, self, tryLocsList) {
55416     var iter = new AsyncIterator(
55417       wrap(innerFn, outerFn, self, tryLocsList)
55418     );
55420     return runtime.isGeneratorFunction(outerFn)
55421       ? iter // If outerFn is a generator, return the full iterator.
55422       : iter.next().then(function(result) {
55423           return result.done ? result.value : iter.next();
55424         });
55425   };
55427   function makeInvokeMethod(innerFn, self, context) {
55428     var state = GenStateSuspendedStart;
55430     return function invoke(method, arg) {
55431       if (state === GenStateExecuting) {
55432         throw new Error("Generator is already running");
55433       }
55435       if (state === GenStateCompleted) {
55436         if (method === "throw") {
55437           throw arg;
55438         }
55440         // Be forgiving, per 25.3.3.3.3 of the spec:
55441         // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
55442         return doneResult();
55443       }
55445       context.method = method;
55446       context.arg = arg;
55448       while (true) {
55449         var delegate = context.delegate;
55450         if (delegate) {
55451           var delegateResult = maybeInvokeDelegate(delegate, context);
55452           if (delegateResult) {
55453             if (delegateResult === ContinueSentinel) continue;
55454             return delegateResult;
55455           }
55456         }
55458         if (context.method === "next") {
55459           // Setting context._sent for legacy support of Babel's
55460           // function.sent implementation.
55461           context.sent = context._sent = context.arg;
55463         } else if (context.method === "throw") {
55464           if (state === GenStateSuspendedStart) {
55465             state = GenStateCompleted;
55466             throw context.arg;
55467           }
55469           context.dispatchException(context.arg);
55471         } else if (context.method === "return") {
55472           context.abrupt("return", context.arg);
55473         }
55475         state = GenStateExecuting;
55477         var record = tryCatch(innerFn, self, context);
55478         if (record.type === "normal") {
55479           // If an exception is thrown from innerFn, we leave state ===
55480           // GenStateExecuting and loop back for another invocation.
55481           state = context.done
55482             ? GenStateCompleted
55483             : GenStateSuspendedYield;
55485           if (record.arg === ContinueSentinel) {
55486             continue;
55487           }
55489           return {
55490             value: record.arg,
55491             done: context.done
55492           };
55494         } else if (record.type === "throw") {
55495           state = GenStateCompleted;
55496           // Dispatch the exception by looping back around to the
55497           // context.dispatchException(context.arg) call above.
55498           context.method = "throw";
55499           context.arg = record.arg;
55500         }
55501       }
55502     };
55503   }
55505   // Call delegate.iterator[context.method](context.arg) and handle the
55506   // result, either by returning a { value, done } result from the
55507   // delegate iterator, or by modifying context.method and context.arg,
55508   // setting context.delegate to null, and returning the ContinueSentinel.
55509   function maybeInvokeDelegate(delegate, context) {
55510     var method = delegate.iterator[context.method];
55511     if (method === undefined) {
55512       // A .throw or .return when the delegate iterator has no .throw
55513       // method always terminates the yield* loop.
55514       context.delegate = null;
55516       if (context.method === "throw") {
55517         if (delegate.iterator.return) {
55518           // If the delegate iterator has a return method, give it a
55519           // chance to clean up.
55520           context.method = "return";
55521           context.arg = undefined;
55522           maybeInvokeDelegate(delegate, context);
55524           if (context.method === "throw") {
55525             // If maybeInvokeDelegate(context) changed context.method from
55526             // "return" to "throw", let that override the TypeError below.
55527             return ContinueSentinel;
55528           }
55529         }
55531         context.method = "throw";
55532         context.arg = new TypeError(
55533           "The iterator does not provide a 'throw' method");
55534       }
55536       return ContinueSentinel;
55537     }
55539     var record = tryCatch(method, delegate.iterator, context.arg);
55541     if (record.type === "throw") {
55542       context.method = "throw";
55543       context.arg = record.arg;
55544       context.delegate = null;
55545       return ContinueSentinel;
55546     }
55548     var info = record.arg;
55550     if (! info) {
55551       context.method = "throw";
55552       context.arg = new TypeError("iterator result is not an object");
55553       context.delegate = null;
55554       return ContinueSentinel;
55555     }
55557     if (info.done) {
55558       // Assign the result of the finished delegate to the temporary
55559       // variable specified by delegate.resultName (see delegateYield).
55560       context[delegate.resultName] = info.value;
55562       // Resume execution at the desired location (see delegateYield).
55563       context.next = delegate.nextLoc;
55565       // If context.method was "throw" but the delegate handled the
55566       // exception, let the outer generator proceed normally. If
55567       // context.method was "next", forget context.arg since it has been
55568       // "consumed" by the delegate iterator. If context.method was
55569       // "return", allow the original .return call to continue in the
55570       // outer generator.
55571       if (context.method !== "return") {
55572         context.method = "next";
55573         context.arg = undefined;
55574       }
55576     } else {
55577       // Re-yield the result returned by the delegate method.
55578       return info;
55579     }
55581     // The delegate iterator is finished, so forget it and continue with
55582     // the outer generator.
55583     context.delegate = null;
55584     return ContinueSentinel;
55585   }
55587   // Define Generator.prototype.{next,throw,return} in terms of the
55588   // unified ._invoke helper method.
55589   defineIteratorMethods(Gp);
55591   Gp[toStringTagSymbol] = "Generator";
55593   // A Generator should always return itself as the iterator object when the
55594   // @@iterator function is called on it. Some browsers' implementations of the
55595   // iterator prototype chain incorrectly implement this, causing the Generator
55596   // object to not be returned from this call. This ensures that doesn't happen.
55597   // See https://github.com/facebook/regenerator/issues/274 for more details.
55598   Gp[iteratorSymbol] = function() {
55599     return this;
55600   };
55602   Gp.toString = function() {
55603     return "[object Generator]";
55604   };
55606   function pushTryEntry(locs) {
55607     var entry = { tryLoc: locs[0] };
55609     if (1 in locs) {
55610       entry.catchLoc = locs[1];
55611     }
55613     if (2 in locs) {
55614       entry.finallyLoc = locs[2];
55615       entry.afterLoc = locs[3];
55616     }
55618     this.tryEntries.push(entry);
55619   }
55621   function resetTryEntry(entry) {
55622     var record = entry.completion || {};
55623     record.type = "normal";
55624     delete record.arg;
55625     entry.completion = record;
55626   }
55628   function Context(tryLocsList) {
55629     // The root entry object (effectively a try statement without a catch
55630     // or a finally block) gives us a place to store values thrown from
55631     // locations where there is no enclosing try statement.
55632     this.tryEntries = [{ tryLoc: "root" }];
55633     tryLocsList.forEach(pushTryEntry, this);
55634     this.reset(true);
55635   }
55637   runtime.keys = function(object) {
55638     var keys = [];
55639     for (var key in object) {
55640       keys.push(key);
55641     }
55642     keys.reverse();
55644     // Rather than returning an object with a next method, we keep
55645     // things simple and return the next function itself.
55646     return function next() {
55647       while (keys.length) {
55648         var key = keys.pop();
55649         if (key in object) {
55650           next.value = key;
55651           next.done = false;
55652           return next;
55653         }
55654       }
55656       // To avoid creating an additional object, we just hang the .value
55657       // and .done properties off the next function object itself. This
55658       // also ensures that the minifier will not anonymize the function.
55659       next.done = true;
55660       return next;
55661     };
55662   };
55664   function values(iterable) {
55665     if (iterable) {
55666       var iteratorMethod = iterable[iteratorSymbol];
55667       if (iteratorMethod) {
55668         return iteratorMethod.call(iterable);
55669       }
55671       if (typeof iterable.next === "function") {
55672         return iterable;
55673       }
55675       if (!isNaN(iterable.length)) {
55676         var i = -1, next = function next() {
55677           while (++i < iterable.length) {
55678             if (hasOwn.call(iterable, i)) {
55679               next.value = iterable[i];
55680               next.done = false;
55681               return next;
55682             }
55683           }
55685           next.value = undefined;
55686           next.done = true;
55688           return next;
55689         };
55691         return next.next = next;
55692       }
55693     }
55695     // Return an iterator with no values.
55696     return { next: doneResult };
55697   }
55698   runtime.values = values;
55700   function doneResult() {
55701     return { value: undefined, done: true };
55702   }
55704   Context.prototype = {
55705     constructor: Context,
55707     reset: function(skipTempReset) {
55708       this.prev = 0;
55709       this.next = 0;
55710       // Resetting context._sent for legacy support of Babel's
55711       // function.sent implementation.
55712       this.sent = this._sent = undefined;
55713       this.done = false;
55714       this.delegate = null;
55716       this.method = "next";
55717       this.arg = undefined;
55719       this.tryEntries.forEach(resetTryEntry);
55721       if (!skipTempReset) {
55722         for (var name in this) {
55723           // Not sure about the optimal order of these conditions:
55724           if (name.charAt(0) === "t" &&
55725               hasOwn.call(this, name) &&
55726               !isNaN(+name.slice(1))) {
55727             this[name] = undefined;
55728           }
55729         }
55730       }
55731     },
55733     stop: function() {
55734       this.done = true;
55736       var rootEntry = this.tryEntries[0];
55737       var rootRecord = rootEntry.completion;
55738       if (rootRecord.type === "throw") {
55739         throw rootRecord.arg;
55740       }
55742       return this.rval;
55743     },
55745     dispatchException: function(exception) {
55746       if (this.done) {
55747         throw exception;
55748       }
55750       var context = this;
55751       function handle(loc, caught) {
55752         record.type = "throw";
55753         record.arg = exception;
55754         context.next = loc;
55756         if (caught) {
55757           // If the dispatched exception was caught by a catch block,
55758           // then let that catch block handle the exception normally.
55759           context.method = "next";
55760           context.arg = undefined;
55761         }
55763         return !! caught;
55764       }
55766       for (var i = this.tryEntries.length - 1; i >= 0; --i) {
55767         var entry = this.tryEntries[i];
55768         var record = entry.completion;
55770         if (entry.tryLoc === "root") {
55771           // Exception thrown outside of any try block that could handle
55772           // it, so set the completion value of the entire function to
55773           // throw the exception.
55774           return handle("end");
55775         }
55777         if (entry.tryLoc <= this.prev) {
55778           var hasCatch = hasOwn.call(entry, "catchLoc");
55779           var hasFinally = hasOwn.call(entry, "finallyLoc");
55781           if (hasCatch && hasFinally) {
55782             if (this.prev < entry.catchLoc) {
55783               return handle(entry.catchLoc, true);
55784             } else if (this.prev < entry.finallyLoc) {
55785               return handle(entry.finallyLoc);
55786             }
55788           } else if (hasCatch) {
55789             if (this.prev < entry.catchLoc) {
55790               return handle(entry.catchLoc, true);
55791             }
55793           } else if (hasFinally) {
55794             if (this.prev < entry.finallyLoc) {
55795               return handle(entry.finallyLoc);
55796             }
55798           } else {
55799             throw new Error("try statement without catch or finally");
55800           }
55801         }
55802       }
55803     },
55805     abrupt: function(type, arg) {
55806       for (var i = this.tryEntries.length - 1; i >= 0; --i) {
55807         var entry = this.tryEntries[i];
55808         if (entry.tryLoc <= this.prev &&
55809             hasOwn.call(entry, "finallyLoc") &&
55810             this.prev < entry.finallyLoc) {
55811           var finallyEntry = entry;
55812           break;
55813         }
55814       }
55816       if (finallyEntry &&
55817           (type === "break" ||
55818            type === "continue") &&
55819           finallyEntry.tryLoc <= arg &&
55820           arg <= finallyEntry.finallyLoc) {
55821         // Ignore the finally entry if control is not jumping to a
55822         // location outside the try/catch block.
55823         finallyEntry = null;
55824       }
55826       var record = finallyEntry ? finallyEntry.completion : {};
55827       record.type = type;
55828       record.arg = arg;
55830       if (finallyEntry) {
55831         this.method = "next";
55832         this.next = finallyEntry.finallyLoc;
55833         return ContinueSentinel;
55834       }
55836       return this.complete(record);
55837     },
55839     complete: function(record, afterLoc) {
55840       if (record.type === "throw") {
55841         throw record.arg;
55842       }
55844       if (record.type === "break" ||
55845           record.type === "continue") {
55846         this.next = record.arg;
55847       } else if (record.type === "return") {
55848         this.rval = this.arg = record.arg;
55849         this.method = "return";
55850         this.next = "end";
55851       } else if (record.type === "normal" && afterLoc) {
55852         this.next = afterLoc;
55853       }
55855       return ContinueSentinel;
55856     },
55858     finish: function(finallyLoc) {
55859       for (var i = this.tryEntries.length - 1; i >= 0; --i) {
55860         var entry = this.tryEntries[i];
55861         if (entry.finallyLoc === finallyLoc) {
55862           this.complete(entry.completion, entry.afterLoc);
55863           resetTryEntry(entry);
55864           return ContinueSentinel;
55865         }
55866       }
55867     },
55869     "catch": function(tryLoc) {
55870       for (var i = this.tryEntries.length - 1; i >= 0; --i) {
55871         var entry = this.tryEntries[i];
55872         if (entry.tryLoc === tryLoc) {
55873           var record = entry.completion;
55874           if (record.type === "throw") {
55875             var thrown = record.arg;
55876             resetTryEntry(entry);
55877           }
55878           return thrown;
55879         }
55880       }
55882       // The context.catch method must only be called with a location
55883       // argument that corresponds to a known catch block.
55884       throw new Error("illegal catch attempt");
55885     },
55887     delegateYield: function(iterable, resultName, nextLoc) {
55888       this.delegate = {
55889         iterator: values(iterable),
55890         resultName: resultName,
55891         nextLoc: nextLoc
55892       };
55894       if (this.method === "next") {
55895         // Deliberately forget the last sent value so that we don't
55896         // accidentally pass it on to the delegate.
55897         this.arg = undefined;
55898       }
55900       return ContinueSentinel;
55901     }
55902   };
55904   // In sloppy mode, unbound `this` refers to the global object, fallback to
55905   // Function constructor if we're in global strict mode. That is sadly a form
55906   // of indirect eval which violates Content Security Policy.
55907   (function() { return this })() || Function("return this")()
55911 /***/ }),
55912 /* 280 */
55913 /***/ (function(module, exports, __webpack_require__) {
55915 module.exports = { "default": __webpack_require__(281), __esModule: true };
55917 /***/ }),
55918 /* 281 */
55919 /***/ (function(module, exports, __webpack_require__) {
55921 __webpack_require__(282);
55922 module.exports = Math.pow(2, -52);
55925 /***/ }),
55926 /* 282 */
55927 /***/ (function(module, exports, __webpack_require__) {
55929 // 20.1.2.1 Number.EPSILON
55930 var $export = __webpack_require__(3);
55932 $export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });
55935 /***/ }),
55936 /* 283 */
55937 /***/ (function(module, exports, __webpack_require__) {
55939 /* WEBPACK VAR INJECTION */(function(Buffer) {var clone = (function() {
55940 'use strict';
55943  * Clones (copies) an Object using deep copying.
55945  * This function supports circular references by default, but if you are certain
55946  * there are no circular references in your object, you can save some CPU time
55947  * by calling clone(obj, false).
55949  * Caution: if `circular` is false and `parent` contains circular references,
55950  * your program may enter an infinite loop and crash.
55952  * @param `parent` - the object to be cloned
55953  * @param `circular` - set to true if the object to be cloned may contain
55954  *    circular references. (optional - true by default)
55955  * @param `depth` - set to a number if the object is only to be cloned to
55956  *    a particular depth. (optional - defaults to Infinity)
55957  * @param `prototype` - sets the prototype to be used when cloning an object.
55958  *    (optional - defaults to parent prototype).
55960 function clone(parent, circular, depth, prototype) {
55961   var filter;
55962   if (typeof circular === 'object') {
55963     depth = circular.depth;
55964     prototype = circular.prototype;
55965     filter = circular.filter;
55966     circular = circular.circular
55967   }
55968   // maintain two arrays for circular references, where corresponding parents
55969   // and children have the same index
55970   var allParents = [];
55971   var allChildren = [];
55973   var useBuffer = typeof Buffer != 'undefined';
55975   if (typeof circular == 'undefined')
55976     circular = true;
55978   if (typeof depth == 'undefined')
55979     depth = Infinity;
55981   // recurse this function so we don't reset allParents and allChildren
55982   function _clone(parent, depth) {
55983     // cloning null always returns null
55984     if (parent === null)
55985       return null;
55987     if (depth == 0)
55988       return parent;
55990     var child;
55991     var proto;
55992     if (typeof parent != 'object') {
55993       return parent;
55994     }
55996     if (clone.__isArray(parent)) {
55997       child = [];
55998     } else if (clone.__isRegExp(parent)) {
55999       child = new RegExp(parent.source, __getRegExpFlags(parent));
56000       if (parent.lastIndex) child.lastIndex = parent.lastIndex;
56001     } else if (clone.__isDate(parent)) {
56002       child = new Date(parent.getTime());
56003     } else if (useBuffer && Buffer.isBuffer(parent)) {
56004       child = new Buffer(parent.length);
56005       parent.copy(child);
56006       return child;
56007     } else {
56008       if (typeof prototype == 'undefined') {
56009         proto = Object.getPrototypeOf(parent);
56010         child = Object.create(proto);
56011       }
56012       else {
56013         child = Object.create(prototype);
56014         proto = prototype;
56015       }
56016     }
56018     if (circular) {
56019       var index = allParents.indexOf(parent);
56021       if (index != -1) {
56022         return allChildren[index];
56023       }
56024       allParents.push(parent);
56025       allChildren.push(child);
56026     }
56028     for (var i in parent) {
56029       var attrs;
56030       if (proto) {
56031         attrs = Object.getOwnPropertyDescriptor(proto, i);
56032       }
56034       if (attrs && attrs.set == null) {
56035         continue;
56036       }
56037       child[i] = _clone(parent[i], depth - 1);
56038     }
56040     return child;
56041   }
56043   return _clone(parent, depth);
56047  * Simple flat clone using prototype, accepts only objects, usefull for property
56048  * override on FLAT configuration object (no nested props).
56050  * USE WITH CAUTION! This may not behave as you wish if you do not know how this
56051  * works.
56052  */
56053 clone.clonePrototype = function clonePrototype(parent) {
56054   if (parent === null)
56055     return null;
56057   var c = function () {};
56058   c.prototype = parent;
56059   return new c();
56062 // private utility functions
56064 function __objToStr(o) {
56065   return Object.prototype.toString.call(o);
56067 clone.__objToStr = __objToStr;
56069 function __isDate(o) {
56070   return typeof o === 'object' && __objToStr(o) === '[object Date]';
56072 clone.__isDate = __isDate;
56074 function __isArray(o) {
56075   return typeof o === 'object' && __objToStr(o) === '[object Array]';
56077 clone.__isArray = __isArray;
56079 function __isRegExp(o) {
56080   return typeof o === 'object' && __objToStr(o) === '[object RegExp]';
56082 clone.__isRegExp = __isRegExp;
56084 function __getRegExpFlags(re) {
56085   var flags = '';
56086   if (re.global) flags += 'g';
56087   if (re.ignoreCase) flags += 'i';
56088   if (re.multiline) flags += 'm';
56089   return flags;
56091 clone.__getRegExpFlags = __getRegExpFlags;
56093 return clone;
56094 })();
56096 if (typeof module === 'object' && module.exports) {
56097   module.exports = clone;
56100 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
56102 /***/ }),
56103 /* 284 */
56104 /***/ (function(module, exports, __webpack_require__) {
56106 module.exports = __webpack_require__(117).BrotliDecompressBuffer;
56109 /***/ }),
56110 /* 285 */
56111 /***/ (function(module, exports) {
56113 /* Copyright 2013 Google Inc. All Rights Reserved.
56115    Licensed under the Apache License, Version 2.0 (the "License");
56116    you may not use this file except in compliance with the License.
56117    You may obtain a copy of the License at
56119    http://www.apache.org/licenses/LICENSE-2.0
56121    Unless required by applicable law or agreed to in writing, software
56122    distributed under the License is distributed on an "AS IS" BASIS,
56123    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
56124    See the License for the specific language governing permissions and
56125    limitations under the License.
56127    Bit reading helpers
56130 var BROTLI_READ_SIZE = 4096;
56131 var BROTLI_IBUF_SIZE =  (2 * BROTLI_READ_SIZE + 32);
56132 var BROTLI_IBUF_MASK =  (2 * BROTLI_READ_SIZE - 1);
56134 var kBitMask = new Uint32Array([
56135   0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767,
56136   65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215
56139 /* Input byte buffer, consist of a ringbuffer and a "slack" region where */
56140 /* bytes from the start of the ringbuffer are copied. */
56141 function BrotliBitReader(input) {
56142   this.buf_ = new Uint8Array(BROTLI_IBUF_SIZE);
56143   this.input_ = input;    /* input callback */
56145   this.reset();
56148 BrotliBitReader.READ_SIZE = BROTLI_READ_SIZE;
56149 BrotliBitReader.IBUF_MASK = BROTLI_IBUF_MASK;
56151 BrotliBitReader.prototype.reset = function() {
56152   this.buf_ptr_ = 0;      /* next input will write here */
56153   this.val_ = 0;          /* pre-fetched bits */
56154   this.pos_ = 0;          /* byte position in stream */
56155   this.bit_pos_ = 0;      /* current bit-reading position in val_ */
56156   this.bit_end_pos_ = 0;  /* bit-reading end position from LSB of val_ */
56157   this.eos_ = 0;          /* input stream is finished */
56159   this.readMoreInput();
56160   for (var i = 0; i < 4; i++) {
56161     this.val_ |= this.buf_[this.pos_] << (8 * i);
56162     ++this.pos_;
56163   }
56165   return this.bit_end_pos_ > 0;
56168 /* Fills up the input ringbuffer by calling the input callback.
56170    Does nothing if there are at least 32 bytes present after current position.
56172    Returns 0 if either:
56173     - the input callback returned an error, or
56174     - there is no more input and the position is past the end of the stream.
56176    After encountering the end of the input stream, 32 additional zero bytes are
56177    copied to the ringbuffer, therefore it is safe to call this function after
56178    every 32 bytes of input is read.
56180 BrotliBitReader.prototype.readMoreInput = function() {
56181   if (this.bit_end_pos_ > 256) {
56182     return;
56183   } else if (this.eos_) {
56184     if (this.bit_pos_ > this.bit_end_pos_)
56185       throw new Error('Unexpected end of input ' + this.bit_pos_ + ' ' + this.bit_end_pos_);
56186   } else {
56187     var dst = this.buf_ptr_;
56188     var bytes_read = this.input_.read(this.buf_, dst, BROTLI_READ_SIZE);
56189     if (bytes_read < 0) {
56190       throw new Error('Unexpected end of input');
56191     }
56193     if (bytes_read < BROTLI_READ_SIZE) {
56194       this.eos_ = 1;
56195       /* Store 32 bytes of zero after the stream end. */
56196       for (var p = 0; p < 32; p++)
56197         this.buf_[dst + bytes_read + p] = 0;
56198     }
56200     if (dst === 0) {
56201       /* Copy the head of the ringbuffer to the slack region. */
56202       for (var p = 0; p < 32; p++)
56203         this.buf_[(BROTLI_READ_SIZE << 1) + p] = this.buf_[p];
56205       this.buf_ptr_ = BROTLI_READ_SIZE;
56206     } else {
56207       this.buf_ptr_ = 0;
56208     }
56210     this.bit_end_pos_ += bytes_read << 3;
56211   }
56214 /* Guarantees that there are at least 24 bits in the buffer. */
56215 BrotliBitReader.prototype.fillBitWindow = function() {
56216   while (this.bit_pos_ >= 8) {
56217     this.val_ >>>= 8;
56218     this.val_ |= this.buf_[this.pos_ & BROTLI_IBUF_MASK] << 24;
56219     ++this.pos_;
56220     this.bit_pos_ = this.bit_pos_ - 8 >>> 0;
56221     this.bit_end_pos_ = this.bit_end_pos_ - 8 >>> 0;
56222   }
56225 /* Reads the specified number of bits from Read Buffer. */
56226 BrotliBitReader.prototype.readBits = function(n_bits) {
56227   if (32 - this.bit_pos_ < n_bits) {
56228     this.fillBitWindow();
56229   }
56231   var val = ((this.val_ >>> this.bit_pos_) & kBitMask[n_bits]);
56232   this.bit_pos_ += n_bits;
56233   return val;
56236 module.exports = BrotliBitReader;
56239 /***/ }),
56240 /* 286 */
56241 /***/ (function(module, exports, __webpack_require__) {
56243 var base64 = __webpack_require__(287);
56244 var fs = __webpack_require__(8);
56247  * The normal dictionary-data.js is quite large, which makes it
56248  * unsuitable for browser usage. In order to make it smaller,
56249  * we read dictionary.bin, which is a compressed version of
56250  * the dictionary, and on initial load, Brotli decompresses
56251  * it's own dictionary. 😜
56252  */
56253 exports.init = function() {
56254   var BrotliDecompressBuffer = __webpack_require__(117).BrotliDecompressBuffer;
56255   var compressed = base64.toByteArray(__webpack_require__(288));
56256   return BrotliDecompressBuffer(compressed);
56260 /***/ }),
56261 /* 287 */
56262 /***/ (function(module, exports, __webpack_require__) {
56264 "use strict";
56267 exports.byteLength = byteLength
56268 exports.toByteArray = toByteArray
56269 exports.fromByteArray = fromByteArray
56271 var lookup = []
56272 var revLookup = []
56273 var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
56275 var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
56276 for (var i = 0, len = code.length; i < len; ++i) {
56277   lookup[i] = code[i]
56278   revLookup[code.charCodeAt(i)] = i
56281 // Support decoding URL-safe base64 strings, as Node.js does.
56282 // See: https://en.wikipedia.org/wiki/Base64#URL_applications
56283 revLookup['-'.charCodeAt(0)] = 62
56284 revLookup['_'.charCodeAt(0)] = 63
56286 function placeHoldersCount (b64) {
56287   var len = b64.length
56288   if (len % 4 > 0) {
56289     throw new Error('Invalid string. Length must be a multiple of 4')
56290   }
56292   // the number of equal signs (place holders)
56293   // if there are two placeholders, than the two characters before it
56294   // represent one byte
56295   // if there is only one, then the three characters before it represent 2 bytes
56296   // this is just a cheap hack to not do indexOf twice
56297   return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
56300 function byteLength (b64) {
56301   // base64 is 4/3 + up to two characters of the original data
56302   return (b64.length * 3 / 4) - placeHoldersCount(b64)
56305 function toByteArray (b64) {
56306   var i, l, tmp, placeHolders, arr
56307   var len = b64.length
56308   placeHolders = placeHoldersCount(b64)
56310   arr = new Arr((len * 3 / 4) - placeHolders)
56312   // if there are placeholders, only get up to the last complete 4 chars
56313   l = placeHolders > 0 ? len - 4 : len
56315   var L = 0
56317   for (i = 0; i < l; i += 4) {
56318     tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
56319     arr[L++] = (tmp >> 16) & 0xFF
56320     arr[L++] = (tmp >> 8) & 0xFF
56321     arr[L++] = tmp & 0xFF
56322   }
56324   if (placeHolders === 2) {
56325     tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
56326     arr[L++] = tmp & 0xFF
56327   } else if (placeHolders === 1) {
56328     tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
56329     arr[L++] = (tmp >> 8) & 0xFF
56330     arr[L++] = tmp & 0xFF
56331   }
56333   return arr
56336 function tripletToBase64 (num) {
56337   return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
56340 function encodeChunk (uint8, start, end) {
56341   var tmp
56342   var output = []
56343   for (var i = start; i < end; i += 3) {
56344     tmp = ((uint8[i] << 16) & 0xFF0000) + ((uint8[i + 1] << 8) & 0xFF00) + (uint8[i + 2] & 0xFF)
56345     output.push(tripletToBase64(tmp))
56346   }
56347   return output.join('')
56350 function fromByteArray (uint8) {
56351   var tmp
56352   var len = uint8.length
56353   var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
56354   var output = ''
56355   var parts = []
56356   var maxChunkLength = 16383 // must be multiple of 3
56358   // go through the array every three bytes, we'll deal with trailing stuff later
56359   for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
56360     parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
56361   }
56363   // pad the end with zeros, but make sure to not forget the extra bytes
56364   if (extraBytes === 1) {
56365     tmp = uint8[len - 1]
56366     output += lookup[tmp >> 2]
56367     output += lookup[(tmp << 4) & 0x3F]
56368     output += '=='
56369   } else if (extraBytes === 2) {
56370     tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
56371     output += lookup[tmp >> 10]
56372     output += lookup[(tmp >> 4) & 0x3F]
56373     output += lookup[(tmp << 2) & 0x3F]
56374     output += '='
56375   }
56377   parts.push(output)
56379   return parts.join('')
56383 /***/ }),
56384 /* 288 */
56385 /***/ (function(module, exports) {
56387 module.exports="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";
56390 /***/ }),
56391 /* 289 */
56392 /***/ (function(module, exports) {
56394 /* Copyright 2013 Google Inc. All Rights Reserved.
56396    Licensed under the Apache License, Version 2.0 (the "License");
56397    you may not use this file except in compliance with the License.
56398    You may obtain a copy of the License at
56400    http://www.apache.org/licenses/LICENSE-2.0
56402    Unless required by applicable law or agreed to in writing, software
56403    distributed under the License is distributed on an "AS IS" BASIS,
56404    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
56405    See the License for the specific language governing permissions and
56406    limitations under the License.
56408    Lookup table to map the previous two bytes to a context id.
56410    There are four different context modeling modes defined here:
56411      CONTEXT_LSB6: context id is the least significant 6 bits of the last byte,
56412      CONTEXT_MSB6: context id is the most significant 6 bits of the last byte,
56413      CONTEXT_UTF8: second-order context model tuned for UTF8-encoded text,
56414      CONTEXT_SIGNED: second-order context model tuned for signed integers.
56416    The context id for the UTF8 context model is calculated as follows. If p1
56417    and p2 are the previous two bytes, we calcualte the context as
56419      context = kContextLookup[p1] | kContextLookup[p2 + 256].
56421    If the previous two bytes are ASCII characters (i.e. < 128), this will be
56422    equivalent to
56424      context = 4 * context1(p1) + context2(p2),
56426    where context1 is based on the previous byte in the following way:
56428      0  : non-ASCII control
56429      1  : \t, \n, \r
56430      2  : space
56431      3  : other punctuation
56432      4  : " '
56433      5  : %
56434      6  : ( < [ {
56435      7  : ) > ] }
56436      8  : , ; :
56437      9  : .
56438      10 : =
56439      11 : number
56440      12 : upper-case vowel
56441      13 : upper-case consonant
56442      14 : lower-case vowel
56443      15 : lower-case consonant
56445    and context2 is based on the second last byte:
56447      0 : control, space
56448      1 : punctuation
56449      2 : upper-case letter, number
56450      3 : lower-case letter
56452    If the last byte is ASCII, and the second last byte is not (in a valid UTF8
56453    stream it will be a continuation byte, value between 128 and 191), the
56454    context is the same as if the second last byte was an ASCII control or space.
56456    If the last byte is a UTF8 lead byte (value >= 192), then the next byte will
56457    be a continuation byte and the context id is 2 or 3 depending on the LSB of
56458    the last byte and to a lesser extent on the second last byte if it is ASCII.
56460    If the last byte is a UTF8 continuation byte, the second last byte can be:
56461      - continuation byte: the next byte is probably ASCII or lead byte (assuming
56462        4-byte UTF8 characters are rare) and the context id is 0 or 1.
56463      - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1
56464      - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3
56466    The possible value combinations of the previous two bytes, the range of
56467    context ids and the type of the next byte is summarized in the table below:
56469    |--------\-----------------------------------------------------------------|
56470    |         \                         Last byte                              |
56471    | Second   \---------------------------------------------------------------|
56472    | last byte \    ASCII            |   cont. byte        |   lead byte      |
56473    |            \   (0-127)          |   (128-191)         |   (192-)         |
56474    |=============|===================|=====================|==================|
56475    |  ASCII      | next: ASCII/lead  |  not valid          |  next: cont.     |
56476    |  (0-127)    | context: 4 - 63   |                     |  context: 2 - 3  |
56477    |-------------|-------------------|---------------------|------------------|
56478    |  cont. byte | next: ASCII/lead  |  next: ASCII/lead   |  next: cont.     |
56479    |  (128-191)  | context: 4 - 63   |  context: 0 - 1     |  context: 2 - 3  |
56480    |-------------|-------------------|---------------------|------------------|
56481    |  lead byte  | not valid         |  next: ASCII/lead   |  not valid       |
56482    |  (192-207)  |                   |  context: 0 - 1     |                  |
56483    |-------------|-------------------|---------------------|------------------|
56484    |  lead byte  | not valid         |  next: cont.        |  not valid       |
56485    |  (208-)     |                   |  context: 2 - 3     |                  |
56486    |-------------|-------------------|---------------------|------------------|
56488    The context id for the signed context mode is calculated as:
56490      context = (kContextLookup[512 + p1] << 3) | kContextLookup[512 + p2].
56492    For any context modeling modes, the context ids can be calculated by |-ing
56493    together two lookups from one table using context model dependent offsets:
56495      context = kContextLookup[offset1 + p1] | kContextLookup[offset2 + p2].
56497    where offset1 and offset2 are dependent on the context mode.
56500 var CONTEXT_LSB6         = 0;
56501 var CONTEXT_MSB6         = 1;
56502 var CONTEXT_UTF8         = 2;
56503 var CONTEXT_SIGNED       = 3;
56505 /* Common context lookup table for all context modes. */
56506 exports.lookup = new Uint8Array([
56507   /* CONTEXT_UTF8, last byte. */
56508   /* ASCII range. */
56509    0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  4,  0,  0,
56510    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
56511    8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12,
56512   44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12,
56513   12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48,
56514   52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12,
56515   12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56,
56516   60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12,  0,
56517   /* UTF8 continuation byte range. */
56518   0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
56519   0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
56520   0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
56521   0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
56522   /* UTF8 lead byte range. */
56523   2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
56524   2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
56525   2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
56526   2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
56527   /* CONTEXT_UTF8 second last byte. */
56528   /* ASCII range. */
56529   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56530   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56531   0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
56532   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,
56533   1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
56534   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
56535   1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
56536   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0,
56537   /* UTF8 continuation byte range. */
56538   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56539   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56540   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56541   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56542   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56543   /* UTF8 lead byte range. */
56544   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56545   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
56546   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
56547   /* CONTEXT_SIGNED, second last byte. */
56548   0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
56549   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
56550   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
56551   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
56552   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
56553   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
56554   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
56555   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
56556   4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
56557   4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
56558   4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
56559   4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
56560   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
56561   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
56562   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
56563   6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,
56564   /* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */
56565    0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
56566   16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
56567   16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
56568   16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
56569   24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
56570   24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
56571   24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
56572   24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
56573   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
56574   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
56575   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
56576   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
56577   40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
56578   40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
56579   40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
56580   48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56,
56581   /* CONTEXT_LSB6, last byte. */
56582    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
56583   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
56584   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
56585   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
56586    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
56587   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
56588   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
56589   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
56590    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
56591   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
56592   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
56593   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
56594    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
56595   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
56596   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
56597   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
56598   /* CONTEXT_MSB6, last byte. */
56599    0,  0,  0,  0,  1,  1,  1,  1,  2,  2,  2,  2,  3,  3,  3,  3,
56600    4,  4,  4,  4,  5,  5,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,
56601    8,  8,  8,  8,  9,  9,  9,  9, 10, 10, 10, 10, 11, 11, 11, 11,
56602   12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,
56603   16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19,
56604   20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23,
56605   24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27,
56606   28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
56607   32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35,
56608   36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39,
56609   40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43,
56610   44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47,
56611   48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51,
56612   52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55,
56613   56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59,
56614   60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63,
56615   /* CONTEXT_{M,L}SB6, second last byte, */
56616   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56617   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56618   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56619   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56620   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56621   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56622   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56623   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56624   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56625   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56626   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56627   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56628   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56629   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56630   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56631   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56634 exports.lookupOffsets = new Uint16Array([
56635   /* CONTEXT_LSB6 */
56636   1024, 1536,
56637   /* CONTEXT_MSB6 */
56638   1280, 1536,
56639   /* CONTEXT_UTF8 */
56640   0, 256,
56641   /* CONTEXT_SIGNED */
56642   768, 512,
56646 /***/ }),
56647 /* 290 */
56648 /***/ (function(module, exports) {
56650 /* Copyright 2013 Google Inc. All Rights Reserved.
56652    Licensed under the Apache License, Version 2.0 (the "License");
56653    you may not use this file except in compliance with the License.
56654    You may obtain a copy of the License at
56656    http://www.apache.org/licenses/LICENSE-2.0
56658    Unless required by applicable law or agreed to in writing, software
56659    distributed under the License is distributed on an "AS IS" BASIS,
56660    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
56661    See the License for the specific language governing permissions and
56662    limitations under the License.
56664    Lookup tables to map prefix codes to value ranges. This is used during
56665    decoding of the block lengths, literal insertion lengths and copy lengths.
56668 /* Represents the range of values belonging to a prefix code: */
56669 /* [offset, offset + 2^nbits) */
56670 function PrefixCodeRange(offset, nbits) {
56671   this.offset = offset;
56672   this.nbits = nbits;
56675 exports.kBlockLengthPrefixCode = [
56676   new PrefixCodeRange(1, 2), new PrefixCodeRange(5, 2), new PrefixCodeRange(9, 2), new PrefixCodeRange(13, 2),
56677   new PrefixCodeRange(17, 3), new PrefixCodeRange(25, 3), new PrefixCodeRange(33, 3), new PrefixCodeRange(41, 3),
56678   new PrefixCodeRange(49, 4), new PrefixCodeRange(65, 4), new PrefixCodeRange(81, 4), new PrefixCodeRange(97, 4),
56679   new PrefixCodeRange(113, 5), new PrefixCodeRange(145, 5), new PrefixCodeRange(177, 5), new PrefixCodeRange(209, 5),
56680   new PrefixCodeRange(241, 6), new PrefixCodeRange(305, 6), new PrefixCodeRange(369, 7), new PrefixCodeRange(497, 8),
56681   new PrefixCodeRange(753, 9), new PrefixCodeRange(1265, 10), new PrefixCodeRange(2289, 11), new PrefixCodeRange(4337, 12),
56682   new PrefixCodeRange(8433, 13), new PrefixCodeRange(16625, 24)
56685 exports.kInsertLengthPrefixCode = [
56686   new PrefixCodeRange(0, 0), new PrefixCodeRange(1, 0), new PrefixCodeRange(2, 0), new PrefixCodeRange(3, 0),
56687   new PrefixCodeRange(4, 0), new PrefixCodeRange(5, 0), new PrefixCodeRange(6, 1), new PrefixCodeRange(8, 1),
56688   new PrefixCodeRange(10, 2), new PrefixCodeRange(14, 2), new PrefixCodeRange(18, 3), new PrefixCodeRange(26, 3),
56689   new PrefixCodeRange(34, 4), new PrefixCodeRange(50, 4), new PrefixCodeRange(66, 5), new PrefixCodeRange(98, 5),
56690   new PrefixCodeRange(130, 6), new PrefixCodeRange(194, 7), new PrefixCodeRange(322, 8), new PrefixCodeRange(578, 9),
56691   new PrefixCodeRange(1090, 10), new PrefixCodeRange(2114, 12), new PrefixCodeRange(6210, 14), new PrefixCodeRange(22594, 24),
56694 exports.kCopyLengthPrefixCode = [
56695   new PrefixCodeRange(2, 0), new PrefixCodeRange(3, 0), new PrefixCodeRange(4, 0), new PrefixCodeRange(5, 0),
56696   new PrefixCodeRange(6, 0), new PrefixCodeRange(7, 0), new PrefixCodeRange(8, 0), new PrefixCodeRange(9, 0),
56697   new PrefixCodeRange(10, 1), new PrefixCodeRange(12, 1), new PrefixCodeRange(14, 2), new PrefixCodeRange(18, 2),
56698   new PrefixCodeRange(22, 3), new PrefixCodeRange(30, 3), new PrefixCodeRange(38, 4), new PrefixCodeRange(54, 4),
56699   new PrefixCodeRange(70, 5), new PrefixCodeRange(102, 5), new PrefixCodeRange(134, 6), new PrefixCodeRange(198, 7),
56700   new PrefixCodeRange(326, 8), new PrefixCodeRange(582, 9), new PrefixCodeRange(1094, 10), new PrefixCodeRange(2118, 24),
56703 exports.kInsertRangeLut = [
56704   0, 0, 8, 8, 0, 16, 8, 16, 16,
56707 exports.kCopyRangeLut = [
56708   0, 8, 0, 8, 16, 0, 16, 8, 16,
56712 /***/ }),
56713 /* 291 */
56714 /***/ (function(module, exports, __webpack_require__) {
56716 /* Copyright 2013 Google Inc. All Rights Reserved.
56718    Licensed under the Apache License, Version 2.0 (the "License");
56719    you may not use this file except in compliance with the License.
56720    You may obtain a copy of the License at
56722    http://www.apache.org/licenses/LICENSE-2.0
56724    Unless required by applicable law or agreed to in writing, software
56725    distributed under the License is distributed on an "AS IS" BASIS,
56726    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
56727    See the License for the specific language governing permissions and
56728    limitations under the License.
56730    Transformations on dictionary words.
56733 var BrotliDictionary = __webpack_require__(119);
56735 var kIdentity       = 0;
56736 var kOmitLast1      = 1;
56737 var kOmitLast2      = 2;
56738 var kOmitLast3      = 3;
56739 var kOmitLast4      = 4;
56740 var kOmitLast5      = 5;
56741 var kOmitLast6      = 6;
56742 var kOmitLast7      = 7;
56743 var kOmitLast8      = 8;
56744 var kOmitLast9      = 9;
56745 var kUppercaseFirst = 10;
56746 var kUppercaseAll   = 11;
56747 var kOmitFirst1     = 12;
56748 var kOmitFirst2     = 13;
56749 var kOmitFirst3     = 14;
56750 var kOmitFirst4     = 15;
56751 var kOmitFirst5     = 16;
56752 var kOmitFirst6     = 17;
56753 var kOmitFirst7     = 18;
56754 var kOmitFirst8     = 19;
56755 var kOmitFirst9     = 20;
56757 function Transform(prefix, transform, suffix) {
56758   this.prefix = new Uint8Array(prefix.length);
56759   this.transform = transform;
56760   this.suffix = new Uint8Array(suffix.length);
56762   for (var i = 0; i < prefix.length; i++)
56763     this.prefix[i] = prefix.charCodeAt(i);
56765   for (var i = 0; i < suffix.length; i++)
56766     this.suffix[i] = suffix.charCodeAt(i);
56769 var kTransforms = [
56770      new Transform(         "", kIdentity,       ""           ),
56771      new Transform(         "", kIdentity,       " "          ),
56772      new Transform(        " ", kIdentity,       " "          ),
56773      new Transform(         "", kOmitFirst1,     ""           ),
56774      new Transform(         "", kUppercaseFirst, " "          ),
56775      new Transform(         "", kIdentity,       " the "      ),
56776      new Transform(        " ", kIdentity,       ""           ),
56777      new Transform(       "s ", kIdentity,       " "          ),
56778      new Transform(         "", kIdentity,       " of "       ),
56779      new Transform(         "", kUppercaseFirst, ""           ),
56780      new Transform(         "", kIdentity,       " and "      ),
56781      new Transform(         "", kOmitFirst2,     ""           ),
56782      new Transform(         "", kOmitLast1,      ""           ),
56783      new Transform(       ", ", kIdentity,       " "          ),
56784      new Transform(         "", kIdentity,       ", "         ),
56785      new Transform(        " ", kUppercaseFirst, " "          ),
56786      new Transform(         "", kIdentity,       " in "       ),
56787      new Transform(         "", kIdentity,       " to "       ),
56788      new Transform(       "e ", kIdentity,       " "          ),
56789      new Transform(         "", kIdentity,       "\""         ),
56790      new Transform(         "", kIdentity,       "."          ),
56791      new Transform(         "", kIdentity,       "\">"        ),
56792      new Transform(         "", kIdentity,       "\n"         ),
56793      new Transform(         "", kOmitLast3,      ""           ),
56794      new Transform(         "", kIdentity,       "]"          ),
56795      new Transform(         "", kIdentity,       " for "      ),
56796      new Transform(         "", kOmitFirst3,     ""           ),
56797      new Transform(         "", kOmitLast2,      ""           ),
56798      new Transform(         "", kIdentity,       " a "        ),
56799      new Transform(         "", kIdentity,       " that "     ),
56800      new Transform(        " ", kUppercaseFirst, ""           ),
56801      new Transform(         "", kIdentity,       ". "         ),
56802      new Transform(        ".", kIdentity,       ""           ),
56803      new Transform(        " ", kIdentity,       ", "         ),
56804      new Transform(         "", kOmitFirst4,     ""           ),
56805      new Transform(         "", kIdentity,       " with "     ),
56806      new Transform(         "", kIdentity,       "'"          ),
56807      new Transform(         "", kIdentity,       " from "     ),
56808      new Transform(         "", kIdentity,       " by "       ),
56809      new Transform(         "", kOmitFirst5,     ""           ),
56810      new Transform(         "", kOmitFirst6,     ""           ),
56811      new Transform(    " the ", kIdentity,       ""           ),
56812      new Transform(         "", kOmitLast4,      ""           ),
56813      new Transform(         "", kIdentity,       ". The "     ),
56814      new Transform(         "", kUppercaseAll,   ""           ),
56815      new Transform(         "", kIdentity,       " on "       ),
56816      new Transform(         "", kIdentity,       " as "       ),
56817      new Transform(         "", kIdentity,       " is "       ),
56818      new Transform(         "", kOmitLast7,      ""           ),
56819      new Transform(         "", kOmitLast1,      "ing "       ),
56820      new Transform(         "", kIdentity,       "\n\t"       ),
56821      new Transform(         "", kIdentity,       ":"          ),
56822      new Transform(        " ", kIdentity,       ". "         ),
56823      new Transform(         "", kIdentity,       "ed "        ),
56824      new Transform(         "", kOmitFirst9,     ""           ),
56825      new Transform(         "", kOmitFirst7,     ""           ),
56826      new Transform(         "", kOmitLast6,      ""           ),
56827      new Transform(         "", kIdentity,       "("          ),
56828      new Transform(         "", kUppercaseFirst, ", "         ),
56829      new Transform(         "", kOmitLast8,      ""           ),
56830      new Transform(         "", kIdentity,       " at "       ),
56831      new Transform(         "", kIdentity,       "ly "        ),
56832      new Transform(    " the ", kIdentity,       " of "       ),
56833      new Transform(         "", kOmitLast5,      ""           ),
56834      new Transform(         "", kOmitLast9,      ""           ),
56835      new Transform(        " ", kUppercaseFirst, ", "         ),
56836      new Transform(         "", kUppercaseFirst, "\""         ),
56837      new Transform(        ".", kIdentity,       "("          ),
56838      new Transform(         "", kUppercaseAll,   " "          ),
56839      new Transform(         "", kUppercaseFirst, "\">"        ),
56840      new Transform(         "", kIdentity,       "=\""        ),
56841      new Transform(        " ", kIdentity,       "."          ),
56842      new Transform(    ".com/", kIdentity,       ""           ),
56843      new Transform(    " the ", kIdentity,       " of the "   ),
56844      new Transform(         "", kUppercaseFirst, "'"          ),
56845      new Transform(         "", kIdentity,       ". This "    ),
56846      new Transform(         "", kIdentity,       ","          ),
56847      new Transform(        ".", kIdentity,       " "          ),
56848      new Transform(         "", kUppercaseFirst, "("          ),
56849      new Transform(         "", kUppercaseFirst, "."          ),
56850      new Transform(         "", kIdentity,       " not "      ),
56851      new Transform(        " ", kIdentity,       "=\""        ),
56852      new Transform(         "", kIdentity,       "er "        ),
56853      new Transform(        " ", kUppercaseAll,   " "          ),
56854      new Transform(         "", kIdentity,       "al "        ),
56855      new Transform(        " ", kUppercaseAll,   ""           ),
56856      new Transform(         "", kIdentity,       "='"         ),
56857      new Transform(         "", kUppercaseAll,   "\""         ),
56858      new Transform(         "", kUppercaseFirst, ". "         ),
56859      new Transform(        " ", kIdentity,       "("          ),
56860      new Transform(         "", kIdentity,       "ful "       ),
56861      new Transform(        " ", kUppercaseFirst, ". "         ),
56862      new Transform(         "", kIdentity,       "ive "       ),
56863      new Transform(         "", kIdentity,       "less "      ),
56864      new Transform(         "", kUppercaseAll,   "'"          ),
56865      new Transform(         "", kIdentity,       "est "       ),
56866      new Transform(        " ", kUppercaseFirst, "."          ),
56867      new Transform(         "", kUppercaseAll,   "\">"        ),
56868      new Transform(        " ", kIdentity,       "='"         ),
56869      new Transform(         "", kUppercaseFirst, ","          ),
56870      new Transform(         "", kIdentity,       "ize "       ),
56871      new Transform(         "", kUppercaseAll,   "."          ),
56872      new Transform( "\xc2\xa0", kIdentity,       ""           ),
56873      new Transform(        " ", kIdentity,       ","          ),
56874      new Transform(         "", kUppercaseFirst, "=\""        ),
56875      new Transform(         "", kUppercaseAll,   "=\""        ),
56876      new Transform(         "", kIdentity,       "ous "       ),
56877      new Transform(         "", kUppercaseAll,   ", "         ),
56878      new Transform(         "", kUppercaseFirst, "='"         ),
56879      new Transform(        " ", kUppercaseFirst, ","          ),
56880      new Transform(        " ", kUppercaseAll,   "=\""        ),
56881      new Transform(        " ", kUppercaseAll,   ", "         ),
56882      new Transform(         "", kUppercaseAll,   ","          ),
56883      new Transform(         "", kUppercaseAll,   "("          ),
56884      new Transform(         "", kUppercaseAll,   ". "         ),
56885      new Transform(        " ", kUppercaseAll,   "."          ),
56886      new Transform(         "", kUppercaseAll,   "='"         ),
56887      new Transform(        " ", kUppercaseAll,   ". "         ),
56888      new Transform(        " ", kUppercaseFirst, "=\""        ),
56889      new Transform(        " ", kUppercaseAll,   "='"         ),
56890      new Transform(        " ", kUppercaseFirst, "='"         )
56893 exports.kTransforms = kTransforms;
56894 exports.kNumTransforms = kTransforms.length;
56896 function ToUpperCase(p, i) {
56897   if (p[i] < 0xc0) {
56898     if (p[i] >= 97 && p[i] <= 122) {
56899       p[i] ^= 32;
56900     }
56901     return 1;
56902   }
56904   /* An overly simplified uppercasing model for utf-8. */
56905   if (p[i] < 0xe0) {
56906     p[i + 1] ^= 32;
56907     return 2;
56908   }
56910   /* An arbitrary transform for three byte characters. */
56911   p[i + 2] ^= 5;
56912   return 3;
56915 exports.transformDictionaryWord = function(dst, idx, word, len, transform) {
56916   var prefix = kTransforms[transform].prefix;
56917   var suffix = kTransforms[transform].suffix;
56918   var t = kTransforms[transform].transform;
56919   var skip = t < kOmitFirst1 ? 0 : t - (kOmitFirst1 - 1);
56920   var i = 0;
56921   var start_idx = idx;
56922   var uppercase;
56924   if (skip > len) {
56925     skip = len;
56926   }
56928   var prefix_pos = 0;
56929   while (prefix_pos < prefix.length) {
56930     dst[idx++] = prefix[prefix_pos++];
56931   }
56933   word += skip;
56934   len -= skip;
56936   if (t <= kOmitLast9) {
56937     len -= t;
56938   }
56940   for (i = 0; i < len; i++) {
56941     dst[idx++] = BrotliDictionary.dictionary[word + i];
56942   }
56944   uppercase = idx - len;
56946   if (t === kUppercaseFirst) {
56947     ToUpperCase(dst, uppercase);
56948   } else if (t === kUppercaseAll) {
56949     while (len > 0) {
56950       var step = ToUpperCase(dst, uppercase);
56951       uppercase += step;
56952       len -= step;
56953     }
56954   }
56956   var suffix_pos = 0;
56957   while (suffix_pos < suffix.length) {
56958     dst[idx++] = suffix[suffix_pos++];
56959   }
56961   return idx - start_idx;
56965 /***/ }),
56966 /* 292 */
56967 /***/ (function(module, exports, __webpack_require__) {
56969 /* WEBPACK VAR INJECTION */(function(__dirname) {// Generated by CoffeeScript 1.12.6
56970 (function() {
56971   var AFMFont, PDFFont, StandardFont, fs,
56972     extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
56973     hasProp = {}.hasOwnProperty;
56975   AFMFont = __webpack_require__(293);
56977   PDFFont = __webpack_require__(50);
56979   fs = __webpack_require__(8);
56981   StandardFont = (function(superClass) {
56982     var STANDARD_FONTS;
56984     extend(StandardFont, superClass);
56986     function StandardFont(document, name1, id) {
56987       var ref;
56988       this.document = document;
56989       this.name = name1;
56990       this.id = id;
56991       this.font = new AFMFont(STANDARD_FONTS[this.name]());
56992       ref = this.font, this.ascender = ref.ascender, this.descender = ref.descender, this.bbox = ref.bbox, this.lineGap = ref.lineGap;
56993     }
56995     StandardFont.prototype.embed = function() {
56996       this.dictionary.data = {
56997         Type: 'Font',
56998         BaseFont: this.name,
56999         Subtype: 'Type1',
57000         Encoding: 'WinAnsiEncoding'
57001       };
57002       return this.dictionary.end();
57003     };
57005     StandardFont.prototype.encode = function(text) {
57006       var advances, encoded, glyph, glyphs, i, j, len, positions;
57007       encoded = this.font.encodeText(text);
57008       glyphs = this.font.glyphsForString('' + text);
57009       advances = this.font.advancesForGlyphs(glyphs);
57010       positions = [];
57011       for (i = j = 0, len = glyphs.length; j < len; i = ++j) {
57012         glyph = glyphs[i];
57013         positions.push({
57014           xAdvance: advances[i],
57015           yAdvance: 0,
57016           xOffset: 0,
57017           yOffset: 0,
57018           advanceWidth: this.font.widthOfGlyph(glyph)
57019         });
57020       }
57021       return [encoded, positions];
57022     };
57024     StandardFont.prototype.widthOfString = function(string, size) {
57025       var advance, advances, glyphs, j, len, scale, width;
57026       glyphs = this.font.glyphsForString('' + string);
57027       advances = this.font.advancesForGlyphs(glyphs);
57028       width = 0;
57029       for (j = 0, len = advances.length; j < len; j++) {
57030         advance = advances[j];
57031         width += advance;
57032       }
57033       scale = size / 1000;
57034       return width * scale;
57035     };
57037     StandardFont.isStandardFont = function(name) {
57038       return name in STANDARD_FONTS;
57039     };
57041     STANDARD_FONTS = {
57042       "Courier": function() {
57043         return fs.readFileSync(__dirname + "/../font/data/Courier.afm", 'utf8');
57044       },
57045       "Courier-Bold": function() {
57046         return fs.readFileSync(__dirname + "/../font/data/Courier-Bold.afm", 'utf8');
57047       },
57048       "Courier-Oblique": function() {
57049         return fs.readFileSync(__dirname + "/../font/data/Courier-Oblique.afm", 'utf8');
57050       },
57051       "Courier-BoldOblique": function() {
57052         return fs.readFileSync(__dirname + "/../font/data/Courier-BoldOblique.afm", 'utf8');
57053       },
57054       "Helvetica": function() {
57055         return fs.readFileSync(__dirname + "/../font/data/Helvetica.afm", 'utf8');
57056       },
57057       "Helvetica-Bold": function() {
57058         return fs.readFileSync(__dirname + "/../font/data/Helvetica-Bold.afm", 'utf8');
57059       },
57060       "Helvetica-Oblique": function() {
57061         return fs.readFileSync(__dirname + "/../font/data/Helvetica-Oblique.afm", 'utf8');
57062       },
57063       "Helvetica-BoldOblique": function() {
57064         return fs.readFileSync(__dirname + "/../font/data/Helvetica-BoldOblique.afm", 'utf8');
57065       },
57066       "Times-Roman": function() {
57067         return fs.readFileSync(__dirname + "/../font/data/Times-Roman.afm", 'utf8');
57068       },
57069       "Times-Bold": function() {
57070         return fs.readFileSync(__dirname + "/../font/data/Times-Bold.afm", 'utf8');
57071       },
57072       "Times-Italic": function() {
57073         return fs.readFileSync(__dirname + "/../font/data/Times-Italic.afm", 'utf8');
57074       },
57075       "Times-BoldItalic": function() {
57076         return fs.readFileSync(__dirname + "/../font/data/Times-BoldItalic.afm", 'utf8');
57077       },
57078       "Symbol": function() {
57079         return fs.readFileSync(__dirname + "/../font/data/Symbol.afm", 'utf8');
57080       },
57081       "ZapfDingbats": function() {
57082         return fs.readFileSync(__dirname + "/../font/data/ZapfDingbats.afm", 'utf8');
57083       }
57084     };
57086     return StandardFont;
57088   })(PDFFont);
57090   module.exports = StandardFont;
57092 }).call(this);
57094 /* WEBPACK VAR INJECTION */}.call(exports, "/"))
57096 /***/ }),
57097 /* 293 */
57098 /***/ (function(module, exports, __webpack_require__) {
57100 // Generated by CoffeeScript 1.12.6
57101 (function() {
57102   var AFMFont, fs;
57104   fs = __webpack_require__(8);
57106   AFMFont = (function() {
57107     var WIN_ANSI_MAP, characters;
57109     AFMFont.open = function(filename) {
57110       return new AFMFont(fs.readFileSync(filename, 'utf8'));
57111     };
57113     function AFMFont(contents) {
57114       var e, i;
57115       this.contents = contents;
57116       this.attributes = {};
57117       this.glyphWidths = {};
57118       this.boundingBoxes = {};
57119       this.kernPairs = {};
57120       this.parse();
57121       this.charWidths = (function() {
57122         var j, results;
57123         results = [];
57124         for (i = j = 0; j <= 255; i = ++j) {
57125           results.push(this.glyphWidths[characters[i]]);
57126         }
57127         return results;
57128       }).call(this);
57129       this.bbox = (function() {
57130         var j, len, ref, results;
57131         ref = this.attributes['FontBBox'].split(/\s+/);
57132         results = [];
57133         for (j = 0, len = ref.length; j < len; j++) {
57134           e = ref[j];
57135           results.push(+e);
57136         }
57137         return results;
57138       }).call(this);
57139       this.ascender = +(this.attributes['Ascender'] || 0);
57140       this.descender = +(this.attributes['Descender'] || 0);
57141       this.lineGap = (this.bbox[3] - this.bbox[1]) - (this.ascender - this.descender);
57142     }
57144     AFMFont.prototype.parse = function() {
57145       var a, j, key, len, line, match, name, ref, section, value;
57146       section = '';
57147       ref = this.contents.split('\n');
57148       for (j = 0, len = ref.length; j < len; j++) {
57149         line = ref[j];
57150         if (match = line.match(/^Start(\w+)/)) {
57151           section = match[1];
57152           continue;
57153         } else if (match = line.match(/^End(\w+)/)) {
57154           section = '';
57155           continue;
57156         }
57157         switch (section) {
57158           case 'FontMetrics':
57159             match = line.match(/(^\w+)\s+(.*)/);
57160             key = match[1];
57161             value = match[2];
57162             if (a = this.attributes[key]) {
57163               if (!Array.isArray(a)) {
57164                 a = this.attributes[key] = [a];
57165               }
57166               a.push(value);
57167             } else {
57168               this.attributes[key] = value;
57169             }
57170             break;
57171           case 'CharMetrics':
57172             if (!/^CH?\s/.test(line)) {
57173               continue;
57174             }
57175             name = line.match(/\bN\s+(\.?\w+)\s*;/)[1];
57176             this.glyphWidths[name] = +line.match(/\bWX\s+(\d+)\s*;/)[1];
57177             break;
57178           case 'KernPairs':
57179             match = line.match(/^KPX\s+(\.?\w+)\s+(\.?\w+)\s+(-?\d+)/);
57180             if (match) {
57181               this.kernPairs[match[1] + '\0' + match[2]] = parseInt(match[3]);
57182             }
57183         }
57184       }
57185     };
57187     WIN_ANSI_MAP = {
57188       402: 131,
57189       8211: 150,
57190       8212: 151,
57191       8216: 145,
57192       8217: 146,
57193       8218: 130,
57194       8220: 147,
57195       8221: 148,
57196       8222: 132,
57197       8224: 134,
57198       8225: 135,
57199       8226: 149,
57200       8230: 133,
57201       8364: 128,
57202       8240: 137,
57203       8249: 139,
57204       8250: 155,
57205       710: 136,
57206       8482: 153,
57207       338: 140,
57208       339: 156,
57209       732: 152,
57210       352: 138,
57211       353: 154,
57212       376: 159,
57213       381: 142,
57214       382: 158
57215     };
57217     AFMFont.prototype.encodeText = function(text) {
57218       var char, i, j, ref, res;
57219       res = [];
57220       for (i = j = 0, ref = text.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
57221         char = text.charCodeAt(i);
57222         char = WIN_ANSI_MAP[char] || char;
57223         res.push(char.toString(16));
57224       }
57225       return res;
57226     };
57228     AFMFont.prototype.glyphsForString = function(string) {
57229       var charCode, glyphs, i, j, ref;
57230       glyphs = [];
57231       for (i = j = 0, ref = string.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
57232         charCode = string.charCodeAt(i);
57233         glyphs.push(this.characterToGlyph(charCode));
57234       }
57235       return glyphs;
57236     };
57238     AFMFont.prototype.characterToGlyph = function(character) {
57239       return characters[WIN_ANSI_MAP[character] || character] || '.notdef';
57240     };
57242     AFMFont.prototype.widthOfGlyph = function(glyph) {
57243       return this.glyphWidths[glyph] || 0;
57244     };
57246     AFMFont.prototype.getKernPair = function(left, right) {
57247       return this.kernPairs[left + '\0' + right] || 0;
57248     };
57250     AFMFont.prototype.advancesForGlyphs = function(glyphs) {
57251       var advances, index, j, left, len, right;
57252       advances = [];
57253       for (index = j = 0, len = glyphs.length; j < len; index = ++j) {
57254         left = glyphs[index];
57255         right = glyphs[index + 1];
57256         advances.push(this.widthOfGlyph(left) + this.getKernPair(left, right));
57257       }
57258       return advances;
57259     };
57261     characters = '.notdef       .notdef        .notdef        .notdef\n.notdef       .notdef        .notdef        .notdef\n.notdef       .notdef        .notdef        .notdef\n.notdef       .notdef        .notdef        .notdef\n.notdef       .notdef        .notdef        .notdef\n.notdef       .notdef        .notdef        .notdef\n.notdef       .notdef        .notdef        .notdef\n.notdef       .notdef        .notdef        .notdef\n\nspace         exclam         quotedbl       numbersign\ndollar        percent        ampersand      quotesingle\nparenleft     parenright     asterisk       plus\ncomma         hyphen         period         slash\nzero          one            two            three\nfour          five           six            seven\neight         nine           colon          semicolon\nless          equal          greater        question\n\nat            A              B              C\nD             E              F              G\nH             I              J              K\nL             M              N              O\nP             Q              R              S\nT             U              V              W\nX             Y              Z              bracketleft\nbackslash     bracketright   asciicircum    underscore\n\ngrave         a              b              c\nd             e              f              g\nh             i              j              k\nl             m              n              o\np             q              r              s\nt             u              v              w\nx             y              z              braceleft\nbar           braceright     asciitilde     .notdef\n\nEuro          .notdef        quotesinglbase florin\nquotedblbase  ellipsis       dagger         daggerdbl\ncircumflex    perthousand    Scaron         guilsinglleft\nOE            .notdef        Zcaron         .notdef\n.notdef       quoteleft      quoteright     quotedblleft\nquotedblright bullet         endash         emdash\ntilde         trademark      scaron         guilsinglright\noe            .notdef        zcaron         ydieresis\n\nspace         exclamdown     cent           sterling\ncurrency      yen            brokenbar      section\ndieresis      copyright      ordfeminine    guillemotleft\nlogicalnot    hyphen         registered     macron\ndegree        plusminus      twosuperior    threesuperior\nacute         mu             paragraph      periodcentered\ncedilla       onesuperior    ordmasculine   guillemotright\nonequarter    onehalf        threequarters  questiondown\n\nAgrave        Aacute         Acircumflex    Atilde\nAdieresis     Aring          AE             Ccedilla\nEgrave        Eacute         Ecircumflex    Edieresis\nIgrave        Iacute         Icircumflex    Idieresis\nEth           Ntilde         Ograve         Oacute\nOcircumflex   Otilde         Odieresis      multiply\nOslash        Ugrave         Uacute         Ucircumflex\nUdieresis     Yacute         Thorn          germandbls\n\nagrave        aacute         acircumflex    atilde\nadieresis     aring          ae             ccedilla\negrave        eacute         ecircumflex    edieresis\nigrave        iacute         icircumflex    idieresis\neth           ntilde         ograve         oacute\nocircumflex   otilde         odieresis      divide\noslash        ugrave         uacute         ucircumflex\nudieresis     yacute         thorn          ydieresis'.split(/\s+/);
57263     return AFMFont;
57265   })();
57267   module.exports = AFMFont;
57269 }).call(this);
57272 /***/ }),
57273 /* 294 */
57274 /***/ (function(module, exports, __webpack_require__) {
57276 // Generated by CoffeeScript 1.12.6
57277 (function() {
57278   var EmbeddedFont, PDFFont, PDFObject,
57279     extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
57280     hasProp = {}.hasOwnProperty,
57281     slice = [].slice;
57283   PDFFont = __webpack_require__(50);
57285   PDFObject = __webpack_require__(26);
57287   EmbeddedFont = (function(superClass) {
57288     var toHex;
57290     extend(EmbeddedFont, superClass);
57292     function EmbeddedFont(document, font, id) {
57293       this.document = document;
57294       this.font = font;
57295       this.id = id;
57296       this.subset = this.font.createSubset();
57297       this.unicode = [[0]];
57298       this.widths = [this.font.getGlyph(0).advanceWidth];
57299       this.name = this.font.postscriptName;
57300       this.scale = 1000 / this.font.unitsPerEm;
57301       this.ascender = this.font.ascent * this.scale;
57302       this.descender = this.font.descent * this.scale;
57303       this.lineGap = this.font.lineGap * this.scale;
57304       this.bbox = this.font.bbox;
57305       this.layoutCache = Object.create(null);
57306     }
57308     EmbeddedFont.prototype.layoutRun = function(text, features) {
57309       var i, j, key, len, position, ref, run;
57310       run = this.font.layout(text, features);
57311       ref = run.positions;
57312       for (i = j = 0, len = ref.length; j < len; i = ++j) {
57313         position = ref[i];
57314         for (key in position) {
57315           position[key] *= this.scale;
57316         }
57317         position.advanceWidth = run.glyphs[i].advanceWidth * this.scale;
57318       }
57319       return run;
57320     };
57322     EmbeddedFont.prototype.layoutCached = function(text) {
57323       var cached, run;
57324       if (cached = this.layoutCache[text]) {
57325         return cached;
57326       }
57327       run = this.layoutRun(text);
57328       this.layoutCache[text] = run;
57329       return run;
57330     };
57332     EmbeddedFont.prototype.layout = function(text, features, onlyWidth) {
57333       var advanceWidth, glyphs, index, last, positions, ref, run;
57334       if (onlyWidth == null) {
57335         onlyWidth = false;
57336       }
57337       if (features) {
57338         return this.layoutRun(text, features);
57339       }
57340       glyphs = onlyWidth ? null : [];
57341       positions = onlyWidth ? null : [];
57342       advanceWidth = 0;
57343       last = 0;
57344       index = 0;
57345       while (index <= text.length) {
57346         if ((index === text.length && last < index) || ((ref = text.charAt(index)) === ' ' || ref === '\t')) {
57347           run = this.layoutCached(text.slice(last, ++index));
57348           if (!onlyWidth) {
57349             glyphs.push.apply(glyphs, run.glyphs);
57350             positions.push.apply(positions, run.positions);
57351           }
57352           advanceWidth += run.advanceWidth;
57353           last = index;
57354         } else {
57355           index++;
57356         }
57357       }
57358       return {
57359         glyphs: glyphs,
57360         positions: positions,
57361         advanceWidth: advanceWidth
57362       };
57363     };
57365     EmbeddedFont.prototype.encode = function(text, features) {
57366       var base, base1, gid, glyph, glyphs, i, j, len, positions, ref, res;
57367       ref = this.layout(text, features), glyphs = ref.glyphs, positions = ref.positions;
57368       res = [];
57369       for (i = j = 0, len = glyphs.length; j < len; i = ++j) {
57370         glyph = glyphs[i];
57371         gid = this.subset.includeGlyph(glyph.id);
57372         res.push(('0000' + gid.toString(16)).slice(-4));
57373         if ((base = this.widths)[gid] == null) {
57374           base[gid] = glyph.advanceWidth * this.scale;
57375         }
57376         if ((base1 = this.unicode)[gid] == null) {
57377           base1[gid] = glyph.codePoints;
57378         }
57379       }
57380       return [res, positions];
57381     };
57383     EmbeddedFont.prototype.widthOfString = function(string, size, features) {
57384       var scale, width;
57385       width = this.layout(string, features, true).advanceWidth;
57386       scale = size / 1000;
57387       return width * scale;
57388     };
57390     EmbeddedFont.prototype.embed = function() {
57391       var bbox, descendantFont, descriptor, familyClass, flags, fontFile, i, isCFF, name, ref, tag;
57392       isCFF = this.subset.cff != null;
57393       fontFile = this.document.ref();
57394       if (isCFF) {
57395         fontFile.data.Subtype = 'CIDFontType0C';
57396       }
57397       this.subset.encodeStream().pipe(fontFile);
57398       familyClass = (((ref = this.font['OS/2']) != null ? ref.sFamilyClass : void 0) || 0) >> 8;
57399       flags = 0;
57400       if (this.font.post.isFixedPitch) {
57401         flags |= 1 << 0;
57402       }
57403       if ((1 <= familyClass && familyClass <= 7)) {
57404         flags |= 1 << 1;
57405       }
57406       flags |= 1 << 2;
57407       if (familyClass === 10) {
57408         flags |= 1 << 3;
57409       }
57410       if (this.font.head.macStyle.italic) {
57411         flags |= 1 << 6;
57412       }
57413       tag = ((function() {
57414         var j, results;
57415         results = [];
57416         for (i = j = 0; j < 6; i = ++j) {
57417           results.push(String.fromCharCode(Math.random() * 26 + 65));
57418         }
57419         return results;
57420       })()).join('');
57421       name = tag + '+' + this.font.postscriptName;
57422       bbox = this.font.bbox;
57423       descriptor = this.document.ref({
57424         Type: 'FontDescriptor',
57425         FontName: name,
57426         Flags: flags,
57427         FontBBox: [bbox.minX * this.scale, bbox.minY * this.scale, bbox.maxX * this.scale, bbox.maxY * this.scale],
57428         ItalicAngle: this.font.italicAngle,
57429         Ascent: this.ascender,
57430         Descent: this.descender,
57431         CapHeight: (this.font.capHeight || this.font.ascent) * this.scale,
57432         XHeight: (this.font.xHeight || 0) * this.scale,
57433         StemV: 0
57434       });
57435       if (isCFF) {
57436         descriptor.data.FontFile3 = fontFile;
57437       } else {
57438         descriptor.data.FontFile2 = fontFile;
57439       }
57440       descriptor.end();
57441       descendantFont = this.document.ref({
57442         Type: 'Font',
57443         Subtype: isCFF ? 'CIDFontType0' : 'CIDFontType2',
57444         BaseFont: name,
57445         CIDSystemInfo: {
57446           Registry: new String('Adobe'),
57447           Ordering: new String('Identity'),
57448           Supplement: 0
57449         },
57450         FontDescriptor: descriptor,
57451         W: [0, this.widths]
57452       });
57453       descendantFont.end();
57454       this.dictionary.data = {
57455         Type: 'Font',
57456         Subtype: 'Type0',
57457         BaseFont: name,
57458         Encoding: 'Identity-H',
57459         DescendantFonts: [descendantFont],
57460         ToUnicode: this.toUnicodeCmap()
57461       };
57462       return this.dictionary.end();
57463     };
57465     toHex = function() {
57466       var code, codePoints, codes;
57467       codePoints = 1 <= arguments.length ? slice.call(arguments, 0) : [];
57468       codes = (function() {
57469         var j, len, results;
57470         results = [];
57471         for (j = 0, len = codePoints.length; j < len; j++) {
57472           code = codePoints[j];
57473           results.push(('0000' + code.toString(16)).slice(-4));
57474         }
57475         return results;
57476       })();
57477       return codes.join('');
57478     };
57480     EmbeddedFont.prototype.toUnicodeCmap = function() {
57481       var cmap, codePoints, encoded, entries, j, k, len, len1, ref, value;
57482       cmap = this.document.ref();
57483       entries = [];
57484       ref = this.unicode;
57485       for (j = 0, len = ref.length; j < len; j++) {
57486         codePoints = ref[j];
57487         encoded = [];
57488         for (k = 0, len1 = codePoints.length; k < len1; k++) {
57489           value = codePoints[k];
57490           if (value > 0xffff) {
57491             value -= 0x10000;
57492             encoded.push(toHex(value >>> 10 & 0x3ff | 0xd800));
57493             value = 0xdc00 | value & 0x3ff;
57494           }
57495           encoded.push(toHex(value));
57496         }
57497         entries.push("<" + (encoded.join(' ')) + ">");
57498       }
57499       cmap.end("/CIDInit /ProcSet findresource begin\n12 dict begin\nbegincmap\n/CIDSystemInfo <<\n  /Registry (Adobe)\n  /Ordering (UCS)\n  /Supplement 0\n>> def\n/CMapName /Adobe-Identity-UCS def\n/CMapType 2 def\n1 begincodespacerange\n<0000><ffff>\nendcodespacerange\n1 beginbfrange\n<0000> <" + (toHex(entries.length - 1)) + "> [" + (entries.join(' ')) + "]\nendbfrange\nendcmap\nCMapName currentdict /CMap defineresource pop\nend\nend");
57500       return cmap;
57501     };
57503     return EmbeddedFont;
57505   })(PDFFont);
57507   module.exports = EmbeddedFont;
57509 }).call(this);
57512 /***/ }),
57513 /* 295 */
57514 /***/ (function(module, exports, __webpack_require__) {
57516 // Generated by CoffeeScript 1.12.6
57517 (function() {
57518   var LineWrapper, number;
57520   LineWrapper = __webpack_require__(296);
57522   number = __webpack_require__(26).number;
57524   module.exports = {
57525     initText: function() {
57526       this.x = 0;
57527       this.y = 0;
57528       return this._lineGap = 0;
57529     },
57530     lineGap: function(_lineGap) {
57531       this._lineGap = _lineGap;
57532       return this;
57533     },
57534     moveDown: function(lines) {
57535       if (lines == null) {
57536         lines = 1;
57537       }
57538       this.y += this.currentLineHeight(true) * lines + this._lineGap;
57539       return this;
57540     },
57541     moveUp: function(lines) {
57542       if (lines == null) {
57543         lines = 1;
57544       }
57545       this.y -= this.currentLineHeight(true) * lines + this._lineGap;
57546       return this;
57547     },
57548     _text: function(text, x, y, options, lineCallback) {
57549       var j, len, line, ref, wrapper;
57550       options = this._initOptions(x, y, options);
57551       text = text == null ? '' : '' + text;
57552       if (options.wordSpacing) {
57553         text = text.replace(/\s{2,}/g, ' ');
57554       }
57555       if (options.width) {
57556         wrapper = this._wrapper;
57557         if (!wrapper) {
57558           wrapper = new LineWrapper(this, options);
57559           wrapper.on('line', lineCallback);
57560         }
57561         this._wrapper = options.continued ? wrapper : null;
57562         this._textOptions = options.continued ? options : null;
57563         wrapper.wrap(text, options);
57564       } else {
57565         ref = text.split('\n');
57566         for (j = 0, len = ref.length; j < len; j++) {
57567           line = ref[j];
57568           lineCallback(line, options);
57569         }
57570       }
57571       return this;
57572     },
57573     text: function(text, x, y, options) {
57574       return this._text(text, x, y, options, this._line.bind(this));
57575     },
57576     widthOfString: function(string, options) {
57577       if (options == null) {
57578         options = {};
57579       }
57580       return this._font.widthOfString(string, this._fontSize, options.features) + (options.characterSpacing || 0) * (string.length - 1);
57581     },
57582     heightOfString: function(text, options) {
57583       var height, lineGap, ref, x, y;
57584       if (options == null) {
57585         options = {};
57586       }
57587       ref = this, x = ref.x, y = ref.y;
57588       options = this._initOptions(options);
57589       options.height = 2e308;
57590       lineGap = options.lineGap || this._lineGap || 0;
57591       this._text(text, this.x, this.y, options, (function(_this) {
57592         return function(line, options) {
57593           return _this.y += _this.currentLineHeight(true) + lineGap;
57594         };
57595       })(this));
57596       height = this.y - y;
57597       this.x = x;
57598       this.y = y;
57599       return height;
57600     },
57601     list: function(list, x, y, options, wrapper) {
57602       var flatten, i, indent, itemIndent, items, level, levels, midLine, r;
57603       options = this._initOptions(x, y, options);
57604       midLine = Math.round((this._font.ascender / 1000 * this._fontSize) / 2);
57605       r = options.bulletRadius || Math.round((this._font.ascender / 1000 * this._fontSize) / 3);
57606       indent = options.textIndent || r * 5;
57607       itemIndent = options.bulletIndent || r * 8;
57608       level = 1;
57609       items = [];
57610       levels = [];
57611       flatten = function(list) {
57612         var i, item, j, len, results;
57613         results = [];
57614         for (i = j = 0, len = list.length; j < len; i = ++j) {
57615           item = list[i];
57616           if (Array.isArray(item)) {
57617             level++;
57618             flatten(item);
57619             results.push(level--);
57620           } else {
57621             items.push(item);
57622             results.push(levels.push(level));
57623           }
57624         }
57625         return results;
57626       };
57627       flatten(list);
57628       wrapper = new LineWrapper(this, options);
57629       wrapper.on('line', this._line.bind(this));
57630       level = 1;
57631       i = 0;
57632       wrapper.on('firstLine', (function(_this) {
57633         return function() {
57634           var diff, l;
57635           if ((l = levels[i++]) !== level) {
57636             diff = itemIndent * (l - level);
57637             _this.x += diff;
57638             wrapper.lineWidth -= diff;
57639             level = l;
57640           }
57641           _this.circle(_this.x - indent + r, _this.y + midLine, r);
57642           return _this.fill();
57643         };
57644       })(this));
57645       wrapper.on('sectionStart', (function(_this) {
57646         return function() {
57647           var pos;
57648           pos = indent + itemIndent * (level - 1);
57649           _this.x += pos;
57650           return wrapper.lineWidth -= pos;
57651         };
57652       })(this));
57653       wrapper.on('sectionEnd', (function(_this) {
57654         return function() {
57655           var pos;
57656           pos = indent + itemIndent * (level - 1);
57657           _this.x -= pos;
57658           return wrapper.lineWidth += pos;
57659         };
57660       })(this));
57661       wrapper.wrap(items.join('\n'), options);
57662       return this;
57663     },
57664     _initOptions: function(x, y, options) {
57665       var key, ref, val;
57666       if (x == null) {
57667         x = {};
57668       }
57669       if (options == null) {
57670         options = {};
57671       }
57672       if (typeof x === 'object') {
57673         options = x;
57674         x = null;
57675       }
57676       options = (function() {
57677         var k, opts, v;
57678         opts = {};
57679         for (k in options) {
57680           v = options[k];
57681           opts[k] = v;
57682         }
57683         return opts;
57684       })();
57685       if (this._textOptions) {
57686         ref = this._textOptions;
57687         for (key in ref) {
57688           val = ref[key];
57689           if (key !== 'continued') {
57690             if (options[key] == null) {
57691               options[key] = val;
57692             }
57693           }
57694         }
57695       }
57696       if (x != null) {
57697         this.x = x;
57698       }
57699       if (y != null) {
57700         this.y = y;
57701       }
57702       if (options.lineBreak !== false) {
57703         if (options.width == null) {
57704           options.width = this.page.width - this.x - this.page.margins.right;
57705         }
57706       }
57707       options.columns || (options.columns = 0);
57708       if (options.columnGap == null) {
57709         options.columnGap = 18;
57710       }
57711       return options;
57712     },
57713     _line: function(text, options, wrapper) {
57714       var lineGap;
57715       if (options == null) {
57716         options = {};
57717       }
57718       this._fragment(text, this.x, this.y, options);
57719       lineGap = options.lineGap || this._lineGap || 0;
57720       if (!wrapper) {
57721         return this.x += this.widthOfString(text);
57722       } else {
57723         return this.y += this.currentLineHeight(true) + lineGap;
57724       }
57725     },
57726     _fragment: function(text, x, y, options) {
57727       var addSegment, align, base, characterSpacing, commands, d, encoded, encodedWord, flush, hadOffset, i, j, key, last, len, len1, lineWidth, lineY, m, mode, name, pos, positions, positionsWord, ref, ref1, ref2, renderedWidth, scale, space, spaceWidth, textWidth, val, word, wordSpacing, words;
57728       text = ('' + text).replace(/\n/g, '');
57729       if (text.length === 0) {
57730         return;
57731       }
57732       align = options.align || 'left';
57733       wordSpacing = options.wordSpacing || 0;
57734       characterSpacing = options.characterSpacing || 0;
57735       if (options.width) {
57736         switch (align) {
57737           case 'right':
57738             textWidth = this.widthOfString(text.replace(/\s+$/, ''), options);
57739             x += options.lineWidth - textWidth;
57740             break;
57741           case 'center':
57742             x += options.lineWidth / 2 - options.textWidth / 2;
57743             break;
57744           case 'justify':
57745             words = text.trim().split(/\s+/);
57746             textWidth = this.widthOfString(text.replace(/\s+/g, ''), options);
57747             spaceWidth = this.widthOfString(' ') + characterSpacing;
57748             wordSpacing = Math.max(0, (options.lineWidth - textWidth) / Math.max(1, words.length - 1) - spaceWidth);
57749         }
57750       }
57751       renderedWidth = options.textWidth + (wordSpacing * (options.wordCount - 1)) + (characterSpacing * (text.length - 1));
57752       if (options.link) {
57753         this.link(x, y, renderedWidth, this.currentLineHeight(), options.link);
57754       }
57755       if (options.underline || options.strike) {
57756         this.save();
57757         if (!options.stroke) {
57758           this.strokeColor.apply(this, this._fillColor);
57759         }
57760         lineWidth = this._fontSize < 10 ? 0.5 : Math.floor(this._fontSize / 10);
57761         this.lineWidth(lineWidth);
57762         d = options.underline ? 1 : 2;
57763         lineY = y + this.currentLineHeight() / d;
57764         if (options.underline) {
57765           lineY -= lineWidth;
57766         }
57767         this.moveTo(x, lineY);
57768         this.lineTo(x + renderedWidth, lineY);
57769         this.stroke();
57770         this.restore();
57771       }
57772       this.save();
57773       this.transform(1, 0, 0, -1, 0, this.page.height);
57774       y = this.page.height - y - (this._font.ascender / 1000 * this._fontSize);
57775       if ((base = this.page.fonts)[name = this._font.id] == null) {
57776         base[name] = this._font.ref();
57777       }
57778       this.addContent("BT");
57779       this.addContent("1 0 0 1 " + (number(x)) + " " + (number(y)) + " Tm");
57780       this.addContent("/" + this._font.id + " " + (number(this._fontSize)) + " Tf");
57781       mode = options.fill && options.stroke ? 2 : options.stroke ? 1 : 0;
57782       if (mode) {
57783         this.addContent(mode + " Tr");
57784       }
57785       if (characterSpacing) {
57786         this.addContent((number(characterSpacing)) + " Tc");
57787       }
57788       if (wordSpacing) {
57789         words = text.trim().split(/\s+/);
57790         wordSpacing += this.widthOfString(' ') + characterSpacing;
57791         wordSpacing *= 1000 / this._fontSize;
57792         encoded = [];
57793         positions = [];
57794         for (j = 0, len = words.length; j < len; j++) {
57795           word = words[j];
57796           ref = this._font.encode(word, options.features), encodedWord = ref[0], positionsWord = ref[1];
57797           encoded.push.apply(encoded, encodedWord);
57798           positions.push.apply(positions, positionsWord);
57799           space = {};
57800           ref1 = positions[positions.length - 1];
57801           for (key in ref1) {
57802             val = ref1[key];
57803             space[key] = val;
57804           }
57805           space.xAdvance += wordSpacing;
57806           positions[positions.length - 1] = space;
57807         }
57808       } else {
57809         ref2 = this._font.encode(text, options.features), encoded = ref2[0], positions = ref2[1];
57810       }
57811       scale = this._fontSize / 1000;
57812       commands = [];
57813       last = 0;
57814       hadOffset = false;
57815       addSegment = (function(_this) {
57816         return function(cur) {
57817           var advance, hex;
57818           if (last < cur) {
57819             hex = encoded.slice(last, cur).join('');
57820             advance = positions[cur - 1].xAdvance - positions[cur - 1].advanceWidth;
57821             commands.push("<" + hex + "> " + (number(-advance)));
57822           }
57823           return last = cur;
57824         };
57825       })(this);
57826       flush = (function(_this) {
57827         return function(i) {
57828           addSegment(i);
57829           if (commands.length > 0) {
57830             _this.addContent("[" + (commands.join(' ')) + "] TJ");
57831             return commands.length = 0;
57832           }
57833         };
57834       })(this);
57835       for (i = m = 0, len1 = positions.length; m < len1; i = ++m) {
57836         pos = positions[i];
57837         if (pos.xOffset || pos.yOffset) {
57838           flush(i);
57839           this.addContent("1 0 0 1 " + (number(x + pos.xOffset * scale)) + " " + (number(y + pos.yOffset * scale)) + " Tm");
57840           flush(i + 1);
57841           hadOffset = true;
57842         } else {
57843           if (hadOffset) {
57844             this.addContent("1 0 0 1 " + (number(x)) + " " + (number(y)) + " Tm");
57845             hadOffset = false;
57846           }
57847           if (pos.xAdvance - pos.advanceWidth !== 0) {
57848             addSegment(i + 1);
57849           }
57850         }
57851         x += pos.xAdvance * scale;
57852       }
57853       flush(i);
57854       this.addContent("ET");
57855       return this.restore();
57856     }
57857   };
57859 }).call(this);
57862 /***/ }),
57863 /* 296 */
57864 /***/ (function(module, exports, __webpack_require__) {
57866 // Generated by CoffeeScript 1.12.6
57867 (function() {
57868   var EventEmitter, LineBreaker, LineWrapper,
57869     extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
57870     hasProp = {}.hasOwnProperty;
57872   EventEmitter = __webpack_require__(31).EventEmitter;
57874   LineBreaker = __webpack_require__(78);
57876   LineWrapper = (function(superClass) {
57877     extend(LineWrapper, superClass);
57879     function LineWrapper(document, options) {
57880       var ref;
57881       this.document = document;
57882       this.indent = options.indent || 0;
57883       this.characterSpacing = options.characterSpacing || 0;
57884       this.wordSpacing = options.wordSpacing === 0;
57885       this.columns = options.columns || 1;
57886       this.columnGap = (ref = options.columnGap) != null ? ref : 18;
57887       this.lineWidth = (options.width - (this.columnGap * (this.columns - 1))) / this.columns;
57888       this.spaceLeft = this.lineWidth;
57889       this.startX = this.document.x;
57890       this.startY = this.document.y;
57891       this.column = 1;
57892       this.ellipsis = options.ellipsis;
57893       this.continuedX = 0;
57894       this.features = options.features;
57895       if (options.height != null) {
57896         this.height = options.height;
57897         this.maxY = this.startY + options.height;
57898       } else {
57899         this.maxY = this.document.page.maxY();
57900       }
57901       this.on('firstLine', (function(_this) {
57902         return function(options) {
57903           var indent;
57904           indent = _this.continuedX || _this.indent;
57905           _this.document.x += indent;
57906           _this.lineWidth -= indent;
57907           return _this.once('line', function() {
57908             _this.document.x -= indent;
57909             _this.lineWidth += indent;
57910             if (options.continued && !_this.continuedX) {
57911               _this.continuedX = _this.indent;
57912             }
57913             if (!options.continued) {
57914               return _this.continuedX = 0;
57915             }
57916           });
57917         };
57918       })(this));
57919       this.on('lastLine', (function(_this) {
57920         return function(options) {
57921           var align;
57922           align = options.align;
57923           if (align === 'justify') {
57924             options.align = 'left';
57925           }
57926           _this.lastLine = true;
57927           return _this.once('line', function() {
57928             _this.document.y += options.paragraphGap || 0;
57929             options.align = align;
57930             return _this.lastLine = false;
57931           });
57932         };
57933       })(this));
57934     }
57936     LineWrapper.prototype.wordWidth = function(word) {
57937       return this.document.widthOfString(word, this) + this.characterSpacing + this.wordSpacing;
57938     };
57940     LineWrapper.prototype.eachWord = function(text, fn) {
57941       var bk, breaker, fbk, l, last, lbk, shouldContinue, w, word, wordWidths;
57942       breaker = new LineBreaker(text);
57943       last = null;
57944       wordWidths = Object.create(null);
57945       while (bk = breaker.nextBreak()) {
57946         word = text.slice((last != null ? last.position : void 0) || 0, bk.position);
57947         w = wordWidths[word] != null ? wordWidths[word] : wordWidths[word] = this.wordWidth(word);
57948         if (w > this.lineWidth + this.continuedX) {
57949           lbk = last;
57950           fbk = {};
57951           while (word.length) {
57952             l = word.length;
57953             while (w > this.spaceLeft) {
57954               w = this.wordWidth(word.slice(0, --l));
57955             }
57956             fbk.required = l < word.length;
57957             shouldContinue = fn(word.slice(0, l), w, fbk, lbk);
57958             lbk = {
57959               required: false
57960             };
57961             word = word.slice(l);
57962             w = this.wordWidth(word);
57963             if (shouldContinue === false) {
57964               break;
57965             }
57966           }
57967         } else {
57968           shouldContinue = fn(word, w, bk, last);
57969         }
57970         if (shouldContinue === false) {
57971           break;
57972         }
57973         last = bk;
57974       }
57975     };
57977     LineWrapper.prototype.wrap = function(text, options) {
57978       var buffer, emitLine, lc, nextY, textWidth, wc, y;
57979       if (options.indent != null) {
57980         this.indent = options.indent;
57981       }
57982       if (options.characterSpacing != null) {
57983         this.characterSpacing = options.characterSpacing;
57984       }
57985       if (options.wordSpacing != null) {
57986         this.wordSpacing = options.wordSpacing;
57987       }
57988       if (options.ellipsis != null) {
57989         this.ellipsis = options.ellipsis;
57990       }
57991       nextY = this.document.y + this.document.currentLineHeight(true);
57992       if (this.document.y > this.maxY || nextY > this.maxY) {
57993         this.nextSection();
57994       }
57995       buffer = '';
57996       textWidth = 0;
57997       wc = 0;
57998       lc = 0;
57999       y = this.document.y;
58000       emitLine = (function(_this) {
58001         return function() {
58002           options.textWidth = textWidth + _this.wordSpacing * (wc - 1);
58003           options.wordCount = wc;
58004           options.lineWidth = _this.lineWidth;
58005           y = _this.document.y;
58006           _this.emit('line', buffer, options, _this);
58007           return lc++;
58008         };
58009       })(this);
58010       this.emit('sectionStart', options, this);
58011       this.eachWord(text, (function(_this) {
58012         return function(word, w, bk, last) {
58013           var lh, shouldContinue;
58014           if ((last == null) || last.required) {
58015             _this.emit('firstLine', options, _this);
58016             _this.spaceLeft = _this.lineWidth;
58017           }
58018           if (w <= _this.spaceLeft) {
58019             buffer += word;
58020             textWidth += w;
58021             wc++;
58022           }
58023           if (bk.required || w > _this.spaceLeft) {
58024             if (bk.required) {
58025               _this.emit('lastLine', options, _this);
58026             }
58027             lh = _this.document.currentLineHeight(true);
58028             if ((_this.height != null) && _this.ellipsis && _this.document.y + lh * 2 > _this.maxY && _this.column >= _this.columns) {
58029               if (_this.ellipsis === true) {
58030                 _this.ellipsis = '…';
58031               }
58032               buffer = buffer.replace(/\s+$/, '');
58033               textWidth = _this.wordWidth(buffer + _this.ellipsis);
58034               while (textWidth > _this.lineWidth) {
58035                 buffer = buffer.slice(0, -1).replace(/\s+$/, '');
58036                 textWidth = _this.wordWidth(buffer + _this.ellipsis);
58037               }
58038               buffer = buffer + _this.ellipsis;
58039             }
58040             if (bk.required && w > _this.spaceLeft) {
58041               buffer = word;
58042               textWidth = w;
58043               wc = 1;
58044             }
58045             emitLine();
58046             if (_this.document.y + lh > _this.maxY) {
58047               shouldContinue = _this.nextSection();
58048               if (!shouldContinue) {
58049                 wc = 0;
58050                 buffer = '';
58051                 return false;
58052               }
58053             }
58054             if (bk.required) {
58055               _this.spaceLeft = _this.lineWidth;
58056               buffer = '';
58057               textWidth = 0;
58058               return wc = 0;
58059             } else {
58060               _this.spaceLeft = _this.lineWidth - w;
58061               buffer = word;
58062               textWidth = w;
58063               return wc = 1;
58064             }
58065           } else {
58066             return _this.spaceLeft -= w;
58067           }
58068         };
58069       })(this));
58070       if (wc > 0) {
58071         this.emit('lastLine', options, this);
58072         emitLine();
58073       }
58074       this.emit('sectionEnd', options, this);
58075       if (options.continued === true) {
58076         if (lc > 1) {
58077           this.continuedX = 0;
58078         }
58079         this.continuedX += options.textWidth;
58080         return this.document.y = y;
58081       } else {
58082         return this.document.x = this.startX;
58083       }
58084     };
58086     LineWrapper.prototype.nextSection = function(options) {
58087       var ref;
58088       this.emit('sectionEnd', options, this);
58089       if (++this.column > this.columns) {
58090         if (this.height != null) {
58091           return false;
58092         }
58093         this.document.addPage();
58094         this.column = 1;
58095         this.startY = this.document.page.margins.top;
58096         this.maxY = this.document.page.maxY();
58097         this.document.x = this.startX;
58098         if (this.document._fillColor) {
58099           (ref = this.document).fillColor.apply(ref, this.document._fillColor);
58100         }
58101         this.emit('pageBreak', options, this);
58102       } else {
58103         this.document.x += this.lineWidth + this.columnGap;
58104         this.document.y = this.startY;
58105         this.emit('columnBreak', options, this);
58106       }
58107       this.emit('sectionStart', options, this);
58108       return true;
58109     };
58111     return LineWrapper;
58113   })(EventEmitter);
58115   module.exports = LineWrapper;
58117 }).call(this);
58120 /***/ }),
58121 /* 297 */
58122 /***/ (function(module, exports, __webpack_require__) {
58124 // Generated by CoffeeScript 1.12.6
58125 (function() {
58126   var PDFImage;
58128   PDFImage = __webpack_require__(121);
58130   module.exports = {
58131     initImages: function() {
58132       this._imageRegistry = {};
58133       return this._imageCount = 0;
58134     },
58135     image: function(src, x, y, options) {
58136       var base, bh, bp, bw, h, hp, image, ip, name, ref, ref1, ref2, ref3, w, wp;
58137       if (options == null) {
58138         options = {};
58139       }
58140       if (typeof x === 'object') {
58141         options = x;
58142         x = null;
58143       }
58144       x = (ref = x != null ? x : options.x) != null ? ref : this.x;
58145       y = (ref1 = y != null ? y : options.y) != null ? ref1 : this.y;
58146       if (typeof src === 'string') {
58147         image = this._imageRegistry[src];
58148       }
58149       if (!image) {
58150         if (src.width && src.height) {
58151           image = src;
58152         } else {
58153           image = this.openImage(src);
58154         }
58155       }
58156       if (!image.obj) {
58157         image.embed(this);
58158       }
58159       if ((base = this.page.xobjects)[name = image.label] == null) {
58160         base[name] = image.obj;
58161       }
58162       w = options.width || image.width;
58163       h = options.height || image.height;
58164       if (options.width && !options.height) {
58165         wp = w / image.width;
58166         w = image.width * wp;
58167         h = image.height * wp;
58168       } else if (options.height && !options.width) {
58169         hp = h / image.height;
58170         w = image.width * hp;
58171         h = image.height * hp;
58172       } else if (options.scale) {
58173         w = image.width * options.scale;
58174         h = image.height * options.scale;
58175       } else if (options.fit) {
58176         ref2 = options.fit, bw = ref2[0], bh = ref2[1];
58177         bp = bw / bh;
58178         ip = image.width / image.height;
58179         if (ip > bp) {
58180           w = bw;
58181           h = bw / ip;
58182         } else {
58183           h = bh;
58184           w = bh * ip;
58185         }
58186       } else if (options.cover) {
58187         ref3 = options.cover, bw = ref3[0], bh = ref3[1];
58188         bp = bw / bh;
58189         ip = image.width / image.height;
58190         if (ip > bp) {
58191           h = bh;
58192           w = bh * ip;
58193         } else {
58194           w = bw;
58195           h = bw / ip;
58196         }
58197       }
58198       if (options.fit || options.cover) {
58199         if (options.align === 'center') {
58200           x = x + bw / 2 - w / 2;
58201         } else if (options.align === 'right') {
58202           x = x + bw - w;
58203         }
58204         if (options.valign === 'center') {
58205           y = y + bh / 2 - h / 2;
58206         } else if (options.valign === 'bottom') {
58207           y = y + bh - h;
58208         }
58209       }
58210       if (this.y === y) {
58211         this.y += h;
58212       }
58213       this.save();
58214       this.transform(w, 0, 0, -h, x, y + h);
58215       this.addContent("/" + image.label + " Do");
58216       this.restore();
58217       return this;
58218     },
58219     openImage: function(src) {
58220       var image;
58221       if (typeof src === 'string') {
58222         image = this._imageRegistry[src];
58223       }
58224       if (!image) {
58225         image = PDFImage.open(src, 'I' + (++this._imageCount));
58226         if (typeof src === 'string') {
58227           this._imageRegistry[src] = image;
58228         }
58229       }
58230       return image;
58231     }
58232   };
58234 }).call(this);
58237 /***/ }),
58238 /* 298 */
58239 /***/ (function(module, exports) {
58241 // Generated by CoffeeScript 1.12.6
58242 (function() {
58243   var Data;
58245   Data = (function() {
58246     function Data(data) {
58247       this.data = data != null ? data : [];
58248       this.pos = 0;
58249       this.length = this.data.length;
58250     }
58252     Data.prototype.readByte = function() {
58253       return this.data[this.pos++];
58254     };
58256     Data.prototype.writeByte = function(byte) {
58257       return this.data[this.pos++] = byte;
58258     };
58260     Data.prototype.byteAt = function(index) {
58261       return this.data[index];
58262     };
58264     Data.prototype.readBool = function() {
58265       return !!this.readByte();
58266     };
58268     Data.prototype.writeBool = function(val) {
58269       return this.writeByte(val ? 1 : 0);
58270     };
58272     Data.prototype.readUInt32 = function() {
58273       var b1, b2, b3, b4;
58274       b1 = this.readByte() * 0x1000000;
58275       b2 = this.readByte() << 16;
58276       b3 = this.readByte() << 8;
58277       b4 = this.readByte();
58278       return b1 + b2 + b3 + b4;
58279     };
58281     Data.prototype.writeUInt32 = function(val) {
58282       this.writeByte((val >>> 24) & 0xff);
58283       this.writeByte((val >> 16) & 0xff);
58284       this.writeByte((val >> 8) & 0xff);
58285       return this.writeByte(val & 0xff);
58286     };
58288     Data.prototype.readInt32 = function() {
58289       var int;
58290       int = this.readUInt32();
58291       if (int >= 0x80000000) {
58292         return int - 0x100000000;
58293       } else {
58294         return int;
58295       }
58296     };
58298     Data.prototype.writeInt32 = function(val) {
58299       if (val < 0) {
58300         val += 0x100000000;
58301       }
58302       return this.writeUInt32(val);
58303     };
58305     Data.prototype.readUInt16 = function() {
58306       var b1, b2;
58307       b1 = this.readByte() << 8;
58308       b2 = this.readByte();
58309       return b1 | b2;
58310     };
58312     Data.prototype.writeUInt16 = function(val) {
58313       this.writeByte((val >> 8) & 0xff);
58314       return this.writeByte(val & 0xff);
58315     };
58317     Data.prototype.readInt16 = function() {
58318       var int;
58319       int = this.readUInt16();
58320       if (int >= 0x8000) {
58321         return int - 0x10000;
58322       } else {
58323         return int;
58324       }
58325     };
58327     Data.prototype.writeInt16 = function(val) {
58328       if (val < 0) {
58329         val += 0x10000;
58330       }
58331       return this.writeUInt16(val);
58332     };
58334     Data.prototype.readString = function(length) {
58335       var i, j, ref, ret;
58336       ret = [];
58337       for (i = j = 0, ref = length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
58338         ret[i] = String.fromCharCode(this.readByte());
58339       }
58340       return ret.join('');
58341     };
58343     Data.prototype.writeString = function(val) {
58344       var i, j, ref, results;
58345       results = [];
58346       for (i = j = 0, ref = val.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
58347         results.push(this.writeByte(val.charCodeAt(i)));
58348       }
58349       return results;
58350     };
58352     Data.prototype.stringAt = function(pos, length) {
58353       this.pos = pos;
58354       return this.readString(length);
58355     };
58357     Data.prototype.readShort = function() {
58358       return this.readInt16();
58359     };
58361     Data.prototype.writeShort = function(val) {
58362       return this.writeInt16(val);
58363     };
58365     Data.prototype.readLongLong = function() {
58366       var b1, b2, b3, b4, b5, b6, b7, b8;
58367       b1 = this.readByte();
58368       b2 = this.readByte();
58369       b3 = this.readByte();
58370       b4 = this.readByte();
58371       b5 = this.readByte();
58372       b6 = this.readByte();
58373       b7 = this.readByte();
58374       b8 = this.readByte();
58375       if (b1 & 0x80) {
58376         return ((b1 ^ 0xff) * 0x100000000000000 + (b2 ^ 0xff) * 0x1000000000000 + (b3 ^ 0xff) * 0x10000000000 + (b4 ^ 0xff) * 0x100000000 + (b5 ^ 0xff) * 0x1000000 + (b6 ^ 0xff) * 0x10000 + (b7 ^ 0xff) * 0x100 + (b8 ^ 0xff) + 1) * -1;
58377       }
58378       return b1 * 0x100000000000000 + b2 * 0x1000000000000 + b3 * 0x10000000000 + b4 * 0x100000000 + b5 * 0x1000000 + b6 * 0x10000 + b7 * 0x100 + b8;
58379     };
58381     Data.prototype.writeLongLong = function(val) {
58382       var high, low;
58383       high = Math.floor(val / 0x100000000);
58384       low = val & 0xffffffff;
58385       this.writeByte((high >> 24) & 0xff);
58386       this.writeByte((high >> 16) & 0xff);
58387       this.writeByte((high >> 8) & 0xff);
58388       this.writeByte(high & 0xff);
58389       this.writeByte((low >> 24) & 0xff);
58390       this.writeByte((low >> 16) & 0xff);
58391       this.writeByte((low >> 8) & 0xff);
58392       return this.writeByte(low & 0xff);
58393     };
58395     Data.prototype.readInt = function() {
58396       return this.readInt32();
58397     };
58399     Data.prototype.writeInt = function(val) {
58400       return this.writeInt32(val);
58401     };
58403     Data.prototype.slice = function(start, end) {
58404       return this.data.slice(start, end);
58405     };
58407     Data.prototype.read = function(bytes) {
58408       var buf, i, j, ref;
58409       buf = [];
58410       for (i = j = 0, ref = bytes; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
58411         buf.push(this.readByte());
58412       }
58413       return buf;
58414     };
58416     Data.prototype.write = function(bytes) {
58417       var byte, j, len, results;
58418       results = [];
58419       for (j = 0, len = bytes.length; j < len; j++) {
58420         byte = bytes[j];
58421         results.push(this.writeByte(byte));
58422       }
58423       return results;
58424     };
58426     return Data;
58428   })();
58430   module.exports = Data;
58432 }).call(this);
58435 /***/ }),
58436 /* 299 */
58437 /***/ (function(module, exports, __webpack_require__) {
58439 // Generated by CoffeeScript 1.12.6
58440 (function() {
58441   var JPEG, fs,
58442     indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
58444   fs = __webpack_require__(8);
58446   JPEG = (function() {
58447     var MARKERS;
58449     MARKERS = [0xFFC0, 0xFFC1, 0xFFC2, 0xFFC3, 0xFFC5, 0xFFC6, 0xFFC7, 0xFFC8, 0xFFC9, 0xFFCA, 0xFFCB, 0xFFCC, 0xFFCD, 0xFFCE, 0xFFCF];
58451     function JPEG(data, label) {
58452       var channels, marker, pos;
58453       this.data = data;
58454       this.label = label;
58455       if (this.data.readUInt16BE(0) !== 0xFFD8) {
58456         throw "SOI not found in JPEG";
58457       }
58458       pos = 2;
58459       while (pos < this.data.length) {
58460         marker = this.data.readUInt16BE(pos);
58461         pos += 2;
58462         if (indexOf.call(MARKERS, marker) >= 0) {
58463           break;
58464         }
58465         pos += this.data.readUInt16BE(pos);
58466       }
58467       if (indexOf.call(MARKERS, marker) < 0) {
58468         throw "Invalid JPEG.";
58469       }
58470       pos += 2;
58471       this.bits = this.data[pos++];
58472       this.height = this.data.readUInt16BE(pos);
58473       pos += 2;
58474       this.width = this.data.readUInt16BE(pos);
58475       pos += 2;
58476       channels = this.data[pos++];
58477       this.colorSpace = (function() {
58478         switch (channels) {
58479           case 1:
58480             return 'DeviceGray';
58481           case 3:
58482             return 'DeviceRGB';
58483           case 4:
58484             return 'DeviceCMYK';
58485         }
58486       })();
58487       this.obj = null;
58488     }
58490     JPEG.prototype.embed = function(document) {
58491       if (this.obj) {
58492         return;
58493       }
58494       this.obj = document.ref({
58495         Type: 'XObject',
58496         Subtype: 'Image',
58497         BitsPerComponent: this.bits,
58498         Width: this.width,
58499         Height: this.height,
58500         ColorSpace: this.colorSpace,
58501         Filter: 'DCTDecode'
58502       });
58503       if (this.colorSpace === 'DeviceCMYK') {
58504         this.obj.data['Decode'] = [1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0];
58505       }
58506       this.obj.end(this.data);
58507       return this.data = null;
58508     };
58510     return JPEG;
58512   })();
58514   module.exports = JPEG;
58516 }).call(this);
58519 /***/ }),
58520 /* 300 */
58521 /***/ (function(module, exports, __webpack_require__) {
58523 /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.12.6
58524 (function() {
58525   var PNG, PNGImage, zlib;
58527   zlib = __webpack_require__(48);
58529   PNG = __webpack_require__(301);
58531   PNGImage = (function() {
58532     function PNGImage(data, label) {
58533       this.label = label;
58534       this.image = new PNG(data);
58535       this.width = this.image.width;
58536       this.height = this.image.height;
58537       this.imgData = this.image.imgData;
58538       this.obj = null;
58539     }
58541     PNGImage.prototype.embed = function(document) {
58542       var k, len1, mask, palette, params, rgb, val, x;
58543       this.document = document;
58544       if (this.obj) {
58545         return;
58546       }
58547       this.obj = this.document.ref({
58548         Type: 'XObject',
58549         Subtype: 'Image',
58550         BitsPerComponent: this.image.bits,
58551         Width: this.width,
58552         Height: this.height,
58553         Filter: 'FlateDecode'
58554       });
58555       if (!this.image.hasAlphaChannel) {
58556         params = this.document.ref({
58557           Predictor: 15,
58558           Colors: this.image.colors,
58559           BitsPerComponent: this.image.bits,
58560           Columns: this.width
58561         });
58562         this.obj.data['DecodeParms'] = params;
58563         params.end();
58564       }
58565       if (this.image.palette.length === 0) {
58566         this.obj.data['ColorSpace'] = this.image.colorSpace;
58567       } else {
58568         palette = this.document.ref();
58569         palette.end(new Buffer(this.image.palette));
58570         this.obj.data['ColorSpace'] = ['Indexed', 'DeviceRGB', (this.image.palette.length / 3) - 1, palette];
58571       }
58572       if (this.image.transparency.grayscale) {
58573         val = this.image.transparency.greyscale;
58574         return this.obj.data['Mask'] = [val, val];
58575       } else if (this.image.transparency.rgb) {
58576         rgb = this.image.transparency.rgb;
58577         mask = [];
58578         for (k = 0, len1 = rgb.length; k < len1; k++) {
58579           x = rgb[k];
58580           mask.push(x, x);
58581         }
58582         return this.obj.data['Mask'] = mask;
58583       } else if (this.image.transparency.indexed) {
58584         return this.loadIndexedAlphaChannel();
58585       } else if (this.image.hasAlphaChannel) {
58586         return this.splitAlphaChannel();
58587       } else {
58588         return this.finalize();
58589       }
58590     };
58592     PNGImage.prototype.finalize = function() {
58593       var sMask;
58594       if (this.alphaChannel) {
58595         sMask = this.document.ref({
58596           Type: 'XObject',
58597           Subtype: 'Image',
58598           Height: this.height,
58599           Width: this.width,
58600           BitsPerComponent: 8,
58601           Filter: 'FlateDecode',
58602           ColorSpace: 'DeviceGray',
58603           Decode: [0, 1]
58604         });
58605         sMask.end(this.alphaChannel);
58606         this.obj.data['SMask'] = sMask;
58607       }
58608       this.obj.end(this.imgData);
58609       this.image = null;
58610       return this.imgData = null;
58611     };
58613     PNGImage.prototype.splitAlphaChannel = function() {
58614       return this.image.decodePixels((function(_this) {
58615         return function(pixels) {
58616           var a, alphaChannel, colorByteSize, done, i, imgData, len, p, pixelCount;
58617           colorByteSize = _this.image.colors * _this.image.bits / 8;
58618           pixelCount = _this.width * _this.height;
58619           imgData = new Buffer(pixelCount * colorByteSize);
58620           alphaChannel = new Buffer(pixelCount);
58621           i = p = a = 0;
58622           len = pixels.length;
58623           while (i < len) {
58624             imgData[p++] = pixels[i++];
58625             imgData[p++] = pixels[i++];
58626             imgData[p++] = pixels[i++];
58627             alphaChannel[a++] = pixels[i++];
58628           }
58629           done = 0;
58630           zlib.deflate(imgData, function(err, imgData1) {
58631             _this.imgData = imgData1;
58632             if (err) {
58633               throw err;
58634             }
58635             if (++done === 2) {
58636               return _this.finalize();
58637             }
58638           });
58639           return zlib.deflate(alphaChannel, function(err, alphaChannel1) {
58640             _this.alphaChannel = alphaChannel1;
58641             if (err) {
58642               throw err;
58643             }
58644             if (++done === 2) {
58645               return _this.finalize();
58646             }
58647           });
58648         };
58649       })(this));
58650     };
58652     PNGImage.prototype.loadIndexedAlphaChannel = function(fn) {
58653       var transparency;
58654       transparency = this.image.transparency.indexed;
58655       return this.image.decodePixels((function(_this) {
58656         return function(pixels) {
58657           var alphaChannel, i, j, k, ref;
58658           alphaChannel = new Buffer(_this.width * _this.height);
58659           i = 0;
58660           for (j = k = 0, ref = pixels.length; k < ref; j = k += 1) {
58661             alphaChannel[i++] = transparency[pixels[j]];
58662           }
58663           return zlib.deflate(alphaChannel, function(err, alphaChannel1) {
58664             _this.alphaChannel = alphaChannel1;
58665             if (err) {
58666               throw err;
58667             }
58668             return _this.finalize();
58669           });
58670         };
58671       })(this));
58672     };
58674     return PNGImage;
58676   })();
58678   module.exports = PNGImage;
58680 }).call(this);
58682 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
58684 /***/ }),
58685 /* 301 */
58686 /***/ (function(module, exports, __webpack_require__) {
58688 /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.4.0
58691 # MIT LICENSE
58692 # Copyright (c) 2011 Devon Govett
58694 # Permission is hereby granted, free of charge, to any person obtaining a copy of this
58695 # software and associated documentation files (the "Software"), to deal in the Software
58696 # without restriction, including without limitation the rights to use, copy, modify, merge,
58697 # publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
58698 # to whom the Software is furnished to do so, subject to the following conditions:
58700 # The above copyright notice and this permission notice shall be included in all copies or
58701 # substantial portions of the Software.
58703 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
58704 # BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
58705 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
58706 # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
58707 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
58711 (function() {
58712   var PNG, fs, zlib;
58714   fs = __webpack_require__(8);
58716   zlib = __webpack_require__(48);
58718   module.exports = PNG = (function() {
58720     PNG.decode = function(path, fn) {
58721       return fs.readFile(path, function(err, file) {
58722         var png;
58723         png = new PNG(file);
58724         return png.decode(function(pixels) {
58725           return fn(pixels);
58726         });
58727       });
58728     };
58730     PNG.load = function(path) {
58731       var file;
58732       file = fs.readFileSync(path);
58733       return new PNG(file);
58734     };
58736     function PNG(data) {
58737       var chunkSize, colors, i, index, key, section, short, text, _i, _j, _ref;
58738       this.data = data;
58739       this.pos = 8;
58740       this.palette = [];
58741       this.imgData = [];
58742       this.transparency = {};
58743       this.text = {};
58744       while (true) {
58745         chunkSize = this.readUInt32();
58746         section = ((function() {
58747           var _i, _results;
58748           _results = [];
58749           for (i = _i = 0; _i < 4; i = ++_i) {
58750             _results.push(String.fromCharCode(this.data[this.pos++]));
58751           }
58752           return _results;
58753         }).call(this)).join('');
58754         switch (section) {
58755           case 'IHDR':
58756             this.width = this.readUInt32();
58757             this.height = this.readUInt32();
58758             this.bits = this.data[this.pos++];
58759             this.colorType = this.data[this.pos++];
58760             this.compressionMethod = this.data[this.pos++];
58761             this.filterMethod = this.data[this.pos++];
58762             this.interlaceMethod = this.data[this.pos++];
58763             break;
58764           case 'PLTE':
58765             this.palette = this.read(chunkSize);
58766             break;
58767           case 'IDAT':
58768             for (i = _i = 0; _i < chunkSize; i = _i += 1) {
58769               this.imgData.push(this.data[this.pos++]);
58770             }
58771             break;
58772           case 'tRNS':
58773             this.transparency = {};
58774             switch (this.colorType) {
58775               case 3:
58776                 this.transparency.indexed = this.read(chunkSize);
58777                 short = 255 - this.transparency.indexed.length;
58778                 if (short > 0) {
58779                   for (i = _j = 0; 0 <= short ? _j < short : _j > short; i = 0 <= short ? ++_j : --_j) {
58780                     this.transparency.indexed.push(255);
58781                   }
58782                 }
58783                 break;
58784               case 0:
58785                 this.transparency.grayscale = this.read(chunkSize)[0];
58786                 break;
58787               case 2:
58788                 this.transparency.rgb = this.read(chunkSize);
58789             }
58790             break;
58791           case 'tEXt':
58792             text = this.read(chunkSize);
58793             index = text.indexOf(0);
58794             key = String.fromCharCode.apply(String, text.slice(0, index));
58795             this.text[key] = String.fromCharCode.apply(String, text.slice(index + 1));
58796             break;
58797           case 'IEND':
58798             this.colors = (function() {
58799               switch (this.colorType) {
58800                 case 0:
58801                 case 3:
58802                 case 4:
58803                   return 1;
58804                 case 2:
58805                 case 6:
58806                   return 3;
58807               }
58808             }).call(this);
58809             this.hasAlphaChannel = (_ref = this.colorType) === 4 || _ref === 6;
58810             colors = this.colors + (this.hasAlphaChannel ? 1 : 0);
58811             this.pixelBitlength = this.bits * colors;
58812             this.colorSpace = (function() {
58813               switch (this.colors) {
58814                 case 1:
58815                   return 'DeviceGray';
58816                 case 3:
58817                   return 'DeviceRGB';
58818               }
58819             }).call(this);
58820             this.imgData = new Buffer(this.imgData);
58821             return;
58822           default:
58823             this.pos += chunkSize;
58824         }
58825         this.pos += 4;
58826         if (this.pos > this.data.length) {
58827           throw new Error("Incomplete or corrupt PNG file");
58828         }
58829       }
58830       return;
58831     }
58833     PNG.prototype.read = function(bytes) {
58834       var i, _i, _results;
58835       _results = [];
58836       for (i = _i = 0; 0 <= bytes ? _i < bytes : _i > bytes; i = 0 <= bytes ? ++_i : --_i) {
58837         _results.push(this.data[this.pos++]);
58838       }
58839       return _results;
58840     };
58842     PNG.prototype.readUInt32 = function() {
58843       var b1, b2, b3, b4;
58844       b1 = this.data[this.pos++] << 24;
58845       b2 = this.data[this.pos++] << 16;
58846       b3 = this.data[this.pos++] << 8;
58847       b4 = this.data[this.pos++];
58848       return b1 | b2 | b3 | b4;
58849     };
58851     PNG.prototype.readUInt16 = function() {
58852       var b1, b2;
58853       b1 = this.data[this.pos++] << 8;
58854       b2 = this.data[this.pos++];
58855       return b1 | b2;
58856     };
58858     PNG.prototype.decodePixels = function(fn) {
58859       var _this = this;
58860       return zlib.inflate(this.imgData, function(err, data) {
58861         var byte, c, col, i, left, length, p, pa, paeth, pb, pc, pixelBytes, pixels, pos, row, scanlineLength, upper, upperLeft, _i, _j, _k, _l, _m;
58862         if (err) {
58863           throw err;
58864         }
58865         pixelBytes = _this.pixelBitlength / 8;
58866         scanlineLength = pixelBytes * _this.width;
58867         pixels = new Buffer(scanlineLength * _this.height);
58868         length = data.length;
58869         row = 0;
58870         pos = 0;
58871         c = 0;
58872         while (pos < length) {
58873           switch (data[pos++]) {
58874             case 0:
58875               for (i = _i = 0; _i < scanlineLength; i = _i += 1) {
58876                 pixels[c++] = data[pos++];
58877               }
58878               break;
58879             case 1:
58880               for (i = _j = 0; _j < scanlineLength; i = _j += 1) {
58881                 byte = data[pos++];
58882                 left = i < pixelBytes ? 0 : pixels[c - pixelBytes];
58883                 pixels[c++] = (byte + left) % 256;
58884               }
58885               break;
58886             case 2:
58887               for (i = _k = 0; _k < scanlineLength; i = _k += 1) {
58888                 byte = data[pos++];
58889                 col = (i - (i % pixelBytes)) / pixelBytes;
58890                 upper = row && pixels[(row - 1) * scanlineLength + col * pixelBytes + (i % pixelBytes)];
58891                 pixels[c++] = (upper + byte) % 256;
58892               }
58893               break;
58894             case 3:
58895               for (i = _l = 0; _l < scanlineLength; i = _l += 1) {
58896                 byte = data[pos++];
58897                 col = (i - (i % pixelBytes)) / pixelBytes;
58898                 left = i < pixelBytes ? 0 : pixels[c - pixelBytes];
58899                 upper = row && pixels[(row - 1) * scanlineLength + col * pixelBytes + (i % pixelBytes)];
58900                 pixels[c++] = (byte + Math.floor((left + upper) / 2)) % 256;
58901               }
58902               break;
58903             case 4:
58904               for (i = _m = 0; _m < scanlineLength; i = _m += 1) {
58905                 byte = data[pos++];
58906                 col = (i - (i % pixelBytes)) / pixelBytes;
58907                 left = i < pixelBytes ? 0 : pixels[c - pixelBytes];
58908                 if (row === 0) {
58909                   upper = upperLeft = 0;
58910                 } else {
58911                   upper = pixels[(row - 1) * scanlineLength + col * pixelBytes + (i % pixelBytes)];
58912                   upperLeft = col && pixels[(row - 1) * scanlineLength + (col - 1) * pixelBytes + (i % pixelBytes)];
58913                 }
58914                 p = left + upper - upperLeft;
58915                 pa = Math.abs(p - left);
58916                 pb = Math.abs(p - upper);
58917                 pc = Math.abs(p - upperLeft);
58918                 if (pa <= pb && pa <= pc) {
58919                   paeth = left;
58920                 } else if (pb <= pc) {
58921                   paeth = upper;
58922                 } else {
58923                   paeth = upperLeft;
58924                 }
58925                 pixels[c++] = (byte + paeth) % 256;
58926               }
58927               break;
58928             default:
58929               throw new Error("Invalid filter algorithm: " + data[pos - 1]);
58930           }
58931           row++;
58932         }
58933         return fn(pixels);
58934       });
58935     };
58937     PNG.prototype.decodePalette = function() {
58938       var c, i, length, palette, pos, ret, transparency, _i, _ref, _ref1;
58939       palette = this.palette;
58940       transparency = this.transparency.indexed || [];
58941       ret = new Buffer(transparency.length + palette.length);
58942       pos = 0;
58943       length = palette.length;
58944       c = 0;
58945       for (i = _i = 0, _ref = palette.length; _i < _ref; i = _i += 3) {
58946         ret[pos++] = palette[i];
58947         ret[pos++] = palette[i + 1];
58948         ret[pos++] = palette[i + 2];
58949         ret[pos++] = (_ref1 = transparency[c++]) != null ? _ref1 : 255;
58950       }
58951       return ret;
58952     };
58954     PNG.prototype.copyToImageData = function(imageData, pixels) {
58955       var alpha, colors, data, i, input, j, k, length, palette, v, _ref;
58956       colors = this.colors;
58957       palette = null;
58958       alpha = this.hasAlphaChannel;
58959       if (this.palette.length) {
58960         palette = (_ref = this._decodedPalette) != null ? _ref : this._decodedPalette = this.decodePalette();
58961         colors = 4;
58962         alpha = true;
58963       }
58964       data = (imageData != null ? imageData.data : void 0) || imageData;
58965       length = data.length;
58966       input = palette || pixels;
58967       i = j = 0;
58968       if (colors === 1) {
58969         while (i < length) {
58970           k = palette ? pixels[i / 4] * 4 : j;
58971           v = input[k++];
58972           data[i++] = v;
58973           data[i++] = v;
58974           data[i++] = v;
58975           data[i++] = alpha ? input[k++] : 255;
58976           j = k;
58977         }
58978       } else {
58979         while (i < length) {
58980           k = palette ? pixels[i / 4] * 4 : j;
58981           data[i++] = input[k++];
58982           data[i++] = input[k++];
58983           data[i++] = input[k++];
58984           data[i++] = alpha ? input[k++] : 255;
58985           j = k;
58986         }
58987       }
58988     };
58990     PNG.prototype.decode = function(fn) {
58991       var ret,
58992         _this = this;
58993       ret = new Buffer(this.width * this.height * 4);
58994       return this.decodePixels(function(pixels) {
58995         _this.copyToImageData(ret, pixels);
58996         return fn(ret);
58997       });
58998     };
59000     return PNG;
59002   })();
59004 }).call(this);
59006 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
59008 /***/ }),
59009 /* 302 */
59010 /***/ (function(module, exports) {
59012 // Generated by CoffeeScript 1.12.6
59013 (function() {
59014   module.exports = {
59015     annotate: function(x, y, w, h, options) {
59016       var key, ref, val;
59017       options.Type = 'Annot';
59018       options.Rect = this._convertRect(x, y, w, h);
59019       options.Border = [0, 0, 0];
59020       if (options.Subtype !== 'Link') {
59021         if (options.C == null) {
59022           options.C = this._normalizeColor(options.color || [0, 0, 0]);
59023         }
59024       }
59025       delete options.color;
59026       if (typeof options.Dest === 'string') {
59027         options.Dest = new String(options.Dest);
59028       }
59029       for (key in options) {
59030         val = options[key];
59031         options[key[0].toUpperCase() + key.slice(1)] = val;
59032       }
59033       ref = this.ref(options);
59034       this.page.annotations.push(ref);
59035       ref.end();
59036       return this;
59037     },
59038     note: function(x, y, w, h, contents, options) {
59039       if (options == null) {
59040         options = {};
59041       }
59042       options.Subtype = 'Text';
59043       options.Contents = new String(contents);
59044       options.Name = 'Comment';
59045       if (options.color == null) {
59046         options.color = [243, 223, 92];
59047       }
59048       return this.annotate(x, y, w, h, options);
59049     },
59050     link: function(x, y, w, h, url, options) {
59051       if (options == null) {
59052         options = {};
59053       }
59054       options.Subtype = 'Link';
59055       options.A = this.ref({
59056         S: 'URI',
59057         URI: new String(url)
59058       });
59059       options.A.end();
59060       return this.annotate(x, y, w, h, options);
59061     },
59062     _markup: function(x, y, w, h, options) {
59063       var ref1, x1, x2, y1, y2;
59064       if (options == null) {
59065         options = {};
59066       }
59067       ref1 = this._convertRect(x, y, w, h), x1 = ref1[0], y1 = ref1[1], x2 = ref1[2], y2 = ref1[3];
59068       options.QuadPoints = [x1, y2, x2, y2, x1, y1, x2, y1];
59069       options.Contents = new String;
59070       return this.annotate(x, y, w, h, options);
59071     },
59072     highlight: function(x, y, w, h, options) {
59073       if (options == null) {
59074         options = {};
59075       }
59076       options.Subtype = 'Highlight';
59077       if (options.color == null) {
59078         options.color = [241, 238, 148];
59079       }
59080       return this._markup(x, y, w, h, options);
59081     },
59082     underline: function(x, y, w, h, options) {
59083       if (options == null) {
59084         options = {};
59085       }
59086       options.Subtype = 'Underline';
59087       return this._markup(x, y, w, h, options);
59088     },
59089     strike: function(x, y, w, h, options) {
59090       if (options == null) {
59091         options = {};
59092       }
59093       options.Subtype = 'StrikeOut';
59094       return this._markup(x, y, w, h, options);
59095     },
59096     lineAnnotation: function(x1, y1, x2, y2, options) {
59097       if (options == null) {
59098         options = {};
59099       }
59100       options.Subtype = 'Line';
59101       options.Contents = new String;
59102       options.L = [x1, this.page.height - y1, x2, this.page.height - y2];
59103       return this.annotate(x1, y1, x2, y2, options);
59104     },
59105     rectAnnotation: function(x, y, w, h, options) {
59106       if (options == null) {
59107         options = {};
59108       }
59109       options.Subtype = 'Square';
59110       options.Contents = new String;
59111       return this.annotate(x, y, w, h, options);
59112     },
59113     ellipseAnnotation: function(x, y, w, h, options) {
59114       if (options == null) {
59115         options = {};
59116       }
59117       options.Subtype = 'Circle';
59118       options.Contents = new String;
59119       return this.annotate(x, y, w, h, options);
59120     },
59121     textAnnotation: function(x, y, w, h, text, options) {
59122       if (options == null) {
59123         options = {};
59124       }
59125       options.Subtype = 'FreeText';
59126       options.Contents = new String(text);
59127       options.DA = new String;
59128       return this.annotate(x, y, w, h, options);
59129     },
59130     _convertRect: function(x1, y1, w, h) {
59131       var m0, m1, m2, m3, m4, m5, ref1, x2, y2;
59132       y2 = y1;
59133       y1 += h;
59134       x2 = x1 + w;
59135       ref1 = this._ctm, m0 = ref1[0], m1 = ref1[1], m2 = ref1[2], m3 = ref1[3], m4 = ref1[4], m5 = ref1[5];
59136       x1 = m0 * x1 + m2 * y1 + m4;
59137       y1 = m1 * x1 + m3 * y1 + m5;
59138       x2 = m0 * x2 + m2 * y2 + m4;
59139       y2 = m1 * x2 + m3 * y2 + m5;
59140       return [x1, y1, x2, y2];
59141     }
59142   };
59144 }).call(this);
59147 /***/ }),
59148 /* 303 */
59149 /***/ (function(module, exports, __webpack_require__) {
59151 "use strict";
59154 module.exports = {
59155         '4A0': [4767.87, 6740.79],
59156         '2A0': [3370.39, 4767.87],
59157         A0: [2383.94, 3370.39],
59158         A1: [1683.78, 2383.94],
59159         A2: [1190.55, 1683.78],
59160         A3: [841.89, 1190.55],
59161         A4: [595.28, 841.89],
59162         A5: [419.53, 595.28],
59163         A6: [297.64, 419.53],
59164         A7: [209.76, 297.64],
59165         A8: [147.40, 209.76],
59166         A9: [104.88, 147.40],
59167         A10: [73.70, 104.88],
59168         B0: [2834.65, 4008.19],
59169         B1: [2004.09, 2834.65],
59170         B2: [1417.32, 2004.09],
59171         B3: [1000.63, 1417.32],
59172         B4: [708.66, 1000.63],
59173         B5: [498.90, 708.66],
59174         B6: [354.33, 498.90],
59175         B7: [249.45, 354.33],
59176         B8: [175.75, 249.45],
59177         B9: [124.72, 175.75],
59178         B10: [87.87, 124.72],
59179         C0: [2599.37, 3676.54],
59180         C1: [1836.85, 2599.37],
59181         C2: [1298.27, 1836.85],
59182         C3: [918.43, 1298.27],
59183         C4: [649.13, 918.43],
59184         C5: [459.21, 649.13],
59185         C6: [323.15, 459.21],
59186         C7: [229.61, 323.15],
59187         C8: [161.57, 229.61],
59188         C9: [113.39, 161.57],
59189         C10: [79.37, 113.39],
59190         RA0: [2437.80, 3458.27],
59191         RA1: [1729.13, 2437.80],
59192         RA2: [1218.90, 1729.13],
59193         RA3: [864.57, 1218.90],
59194         RA4: [609.45, 864.57],
59195         SRA0: [2551.18, 3628.35],
59196         SRA1: [1814.17, 2551.18],
59197         SRA2: [1275.59, 1814.17],
59198         SRA3: [907.09, 1275.59],
59199         SRA4: [637.80, 907.09],
59200         EXECUTIVE: [521.86, 756.00],
59201         FOLIO: [612.00, 936.00],
59202         LEGAL: [612.00, 1008.00],
59203         LETTER: [612.00, 792.00],
59204         TABLOID: [792.00, 1224.00]
59208 /***/ }),
59209 /* 304 */
59210 /***/ (function(module, exports, __webpack_require__) {
59212 "use strict";
59213 /* WEBPACK VAR INJECTION */(function(Buffer) {
59215 var PDFImage = __webpack_require__(121);
59217 function ImageMeasure(pdfKitDoc, imageDictionary) {
59218         this.pdfKitDoc = pdfKitDoc;
59219         this.imageDictionary = imageDictionary || {};
59222 ImageMeasure.prototype.measureImage = function (src) {
59223         var image, label;
59224         var that = this;
59226         if (!this.pdfKitDoc._imageRegistry[src]) {
59227                 label = 'I' + (++this.pdfKitDoc._imageCount);
59228                 try {
59229                         image = PDFImage.open(realImageSrc(src), label);
59230                 } catch (error) {
59231                         image = null;
59232                 }
59233                 if (image === null || image === undefined) {
59234                         throw 'invalid image, images dictionary should contain dataURL entries (or local file paths in node.js)';
59235                 }
59236                 image.embed(this.pdfKitDoc);
59237                 this.pdfKitDoc._imageRegistry[src] = image;
59238         } else {
59239                 image = this.pdfKitDoc._imageRegistry[src];
59240         }
59242         return {width: image.width, height: image.height};
59244         function realImageSrc(src) {
59245                 var img = that.imageDictionary[src];
59247                 if (!img) {
59248                         return src;
59249                 }
59251                 var index = img.indexOf('base64,');
59252                 if (index < 0) {
59253                         return that.imageDictionary[src];
59254                 }
59256                 return Buffer.from(img.substring(index + 7), 'base64');
59257         }
59260 module.exports = ImageMeasure;
59262 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1).Buffer))
59264 /***/ }),
59265 /* 305 */
59266 /***/ (function(module, exports, __webpack_require__) {
59268 "use strict";
59271 var isArray = __webpack_require__(0).isArray;
59273 function groupDecorations(line) {
59274         var groups = [], currentGroup = null;
59275         for (var i = 0, l = line.inlines.length; i < l; i++) {
59276                 var inline = line.inlines[i];
59277                 var decoration = inline.decoration;
59278                 if (!decoration) {
59279                         currentGroup = null;
59280                         continue;
59281                 }
59282                 if (!isArray(decoration)) {
59283                         decoration = [decoration];
59284                 }
59285                 var color = inline.decorationColor || inline.color || 'black';
59286                 var style = inline.decorationStyle || 'solid';
59287                 for (var ii = 0, ll = decoration.length; ii < ll; ii++) {
59288                         var decorationItem = decoration[ii];
59289                         if (!currentGroup || decorationItem !== currentGroup.decoration ||
59290                                 style !== currentGroup.decorationStyle || color !== currentGroup.decorationColor ||
59291                                 decorationItem === 'lineThrough') {
59293                                 currentGroup = {
59294                                         line: line,
59295                                         decoration: decorationItem,
59296                                         decorationColor: color,
59297                                         decorationStyle: style,
59298                                         inlines: [inline]
59299                                 };
59300                                 groups.push(currentGroup);
59301                         } else {
59302                                 currentGroup.inlines.push(inline);
59303                         }
59304                 }
59305         }
59307         return groups;
59310 function drawDecoration(group, x, y, pdfKitDoc) {
59311         function maxInline() {
59312                 var max = 0;
59313                 for (var i = 0, l = group.inlines.length; i < l; i++) {
59314                         var inline = group.inlines[i];
59315                         max = inline.fontSize > max ? i : max;
59316                 }
59317                 return group.inlines[max];
59318         }
59319         function width() {
59320                 var sum = 0;
59321                 for (var i = 0, l = group.inlines.length; i < l; i++) {
59322                         sum += group.inlines[i].width;
59323                 }
59324                 return sum;
59325         }
59326         var firstInline = group.inlines[0],
59327                 biggerInline = maxInline(),
59328                 totalWidth = width(),
59329                 lineAscent = group.line.getAscenderHeight(),
59330                 ascent = biggerInline.font.ascender / 1000 * biggerInline.fontSize,
59331                 height = biggerInline.height,
59332                 descent = height - ascent;
59334         var lw = 0.5 + Math.floor(Math.max(biggerInline.fontSize - 8, 0) / 2) * 0.12;
59336         switch (group.decoration) {
59337                 case 'underline':
59338                         y += lineAscent + descent * 0.45;
59339                         break;
59340                 case 'overline':
59341                         y += lineAscent - (ascent * 0.85);
59342                         break;
59343                 case 'lineThrough':
59344                         y += lineAscent - (ascent * 0.25);
59345                         break;
59346                 default:
59347                         throw 'Unkown decoration : ' + group.decoration;
59348         }
59349         pdfKitDoc.save();
59351         if (group.decorationStyle === 'double') {
59352                 var gap = Math.max(0.5, lw * 2);
59353                 pdfKitDoc.fillColor(group.decorationColor)
59354                         .rect(x + firstInline.x, y - lw / 2, totalWidth, lw / 2).fill()
59355                         .rect(x + firstInline.x, y + gap - lw / 2, totalWidth, lw / 2).fill();
59356         } else if (group.decorationStyle === 'dashed') {
59357                 var nbDashes = Math.ceil(totalWidth / (3.96 + 2.84));
59358                 var rdx = x + firstInline.x;
59359                 pdfKitDoc.rect(rdx, y, totalWidth, lw).clip();
59360                 pdfKitDoc.fillColor(group.decorationColor);
59361                 for (var i = 0; i < nbDashes; i++) {
59362                         pdfKitDoc.rect(rdx, y - lw / 2, 3.96, lw).fill();
59363                         rdx += 3.96 + 2.84;
59364                 }
59365         } else if (group.decorationStyle === 'dotted') {
59366                 var nbDots = Math.ceil(totalWidth / (lw * 3));
59367                 var rx = x + firstInline.x;
59368                 pdfKitDoc.rect(rx, y, totalWidth, lw).clip();
59369                 pdfKitDoc.fillColor(group.decorationColor);
59370                 for (var ii = 0; ii < nbDots; ii++) {
59371                         pdfKitDoc.rect(rx, y - lw / 2, lw, lw).fill();
59372                         rx += (lw * 3);
59373                 }
59374         } else if (group.decorationStyle === 'wavy') {
59375                 var sh = 0.7, sv = 1;
59376                 var nbWaves = Math.ceil(totalWidth / (sh * 2)) + 1;
59377                 var rwx = x + firstInline.x - 1;
59378                 pdfKitDoc.rect(x + firstInline.x, y - sv, totalWidth, y + sv).clip();
59379                 pdfKitDoc.lineWidth(0.24);
59380                 pdfKitDoc.moveTo(rwx, y);
59381                 for (var iii = 0; iii < nbWaves; iii++) {
59382                         pdfKitDoc.bezierCurveTo(rwx + sh, y - sv, rwx + sh * 2, y - sv, rwx + sh * 3, y)
59383                                 .bezierCurveTo(rwx + sh * 4, y + sv, rwx + sh * 5, y + sv, rwx + sh * 6, y);
59384                         rwx += sh * 6;
59385                 }
59386                 pdfKitDoc.stroke(group.decorationColor);
59387         } else {
59388                 pdfKitDoc.fillColor(group.decorationColor)
59389                         .rect(x + firstInline.x, y - lw / 2, totalWidth, lw)
59390                         .fill();
59391         }
59392         pdfKitDoc.restore();
59395 function drawDecorations(line, x, y, pdfKitDoc) {
59396         var groups = groupDecorations(line);
59397         for (var i = 0, l = groups.length; i < l; i++) {
59398                 drawDecoration(groups[i], x, y, pdfKitDoc);
59399         }
59402 function drawBackground(line, x, y, pdfKitDoc) {
59403         var height = line.getHeight();
59404         for (var i = 0, l = line.inlines.length; i < l; i++) {
59405                 var inline = line.inlines[i];
59406                 if (!inline.background) {
59407                         continue;
59408                 }
59409                 var justifyShift = (inline.justifyShift || 0);
59410                 pdfKitDoc.fillColor(inline.background)
59411                         .rect(x + inline.x - justifyShift, y, inline.width + justifyShift, height)
59412                         .fill();
59413         }
59416 module.exports = {
59417         drawBackground: drawBackground,
59418         drawDecorations: drawDecorations
59421 /***/ }),
59422 /* 306 */
59423 /***/ (function(module, exports, __webpack_require__) {
59425 var __WEBPACK_AMD_DEFINE_RESULT__;/* FileSaver.js
59426  * A saveAs() FileSaver implementation.
59427  * 1.3.2
59428  * 2016-06-16 18:25:19
59430  * By Eli Grey, http://eligrey.com
59431  * License: MIT
59432  *   See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
59433  */
59435 /*global self */
59436 /*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
59438 /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
59440 var saveAs = saveAs || (function(view) {
59441         "use strict";
59442         // IE <10 is explicitly unsupported
59443         if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
59444                 return;
59445         }
59446         var
59447                   doc = view.document
59448                   // only get URL when necessary in case Blob.js hasn't overridden it yet
59449                 , get_URL = function() {
59450                         return view.URL || view.webkitURL || view;
59451                 }
59452                 , save_link = doc ? doc.createElementNS("http://www.w3.org/1999/xhtml", "a") : []
59453                 , can_use_save_link = "download" in save_link
59454                 , click = function(node) {
59455                         var event = new MouseEvent("click");
59456                         node.dispatchEvent(event);
59457                 }
59458                 , is_safari = /constructor/i.test(view.HTMLElement) || view.safari
59459                 , is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent)
59460                 , throw_outside = function(ex) {
59461                         (view.setImmediate || view.setTimeout)(function() {
59462                                 throw ex;
59463                         }, 0);
59464                 }
59465                 , force_saveable_type = "application/octet-stream"
59466                 // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
59467                 , arbitrary_revoke_timeout = 1000 * 40 // in ms
59468                 , revoke = function(file) {
59469                         var revoker = function() {
59470                                 if (typeof file === "string") { // file is an object URL
59471                                         get_URL().revokeObjectURL(file);
59472                                 } else { // file is a File
59473                                         file.remove();
59474                                 }
59475                         };
59476                         setTimeout(revoker, arbitrary_revoke_timeout);
59477                 }
59478                 , dispatch = function(filesaver, event_types, event) {
59479                         event_types = [].concat(event_types);
59480                         var i = event_types.length;
59481                         while (i--) {
59482                                 var listener = filesaver["on" + event_types[i]];
59483                                 if (typeof listener === "function") {
59484                                         try {
59485                                                 listener.call(filesaver, event || filesaver);
59486                                         } catch (ex) {
59487                                                 throw_outside(ex);
59488                                         }
59489                                 }
59490                         }
59491                 }
59492                 , auto_bom = function(blob) {
59493                         // prepend BOM for UTF-8 XML and text/* types (including HTML)
59494                         // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
59495                         if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
59496                                 return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});
59497                         }
59498                         return blob;
59499                 }
59500                 , FileSaver = function(blob, name, no_auto_bom) {
59501                         if (!no_auto_bom) {
59502                                 blob = auto_bom(blob);
59503                         }
59504                         // First try a.download, then web filesystem, then object URLs
59505                         var
59506                                   filesaver = this
59507                                 , type = blob.type
59508                                 , force = type === force_saveable_type
59509                                 , object_url
59510                                 , dispatch_all = function() {
59511                                         dispatch(filesaver, "writestart progress write writeend".split(" "));
59512                                 }
59513                                 // on any filesys errors revert to saving with object URLs
59514                                 , fs_error = function() {
59515                                         if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
59516                                                 // Safari doesn't allow downloading of blob urls
59517                                                 var reader = new FileReader();
59518                                                 reader.onloadend = function() {
59519                                                         var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
59520                                                         var popup = view.open(url, '_blank');
59521                                                         if(!popup) view.location.href = url;
59522                                                         url=undefined; // release reference before dispatching
59523                                                         filesaver.readyState = filesaver.DONE;
59524                                                         dispatch_all();
59525                                                 };
59526                                                 reader.readAsDataURL(blob);
59527                                                 filesaver.readyState = filesaver.INIT;
59528                                                 return;
59529                                         }
59530                                         // don't create more object URLs than needed
59531                                         if (!object_url) {
59532                                                 object_url = get_URL().createObjectURL(blob);
59533                                         }
59534                                         if (force) {
59535                                                 view.location.href = object_url;
59536                                         } else {
59537                                                 var opened = view.open(object_url, "_blank");
59538                                                 if (!opened) {
59539                                                         // Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
59540                                                         view.location.href = object_url;
59541                                                 }
59542                                         }
59543                                         filesaver.readyState = filesaver.DONE;
59544                                         dispatch_all();
59545                                         revoke(object_url);
59546                                 }
59547                         ;
59548                         filesaver.readyState = filesaver.INIT;
59550                         if (can_use_save_link) {
59551                                 object_url = get_URL().createObjectURL(blob);
59552                                 setTimeout(function() {
59553                                         save_link.href = object_url;
59554                                         save_link.download = name;
59555                                         click(save_link);
59556                                         dispatch_all();
59557                                         revoke(object_url);
59558                                         filesaver.readyState = filesaver.DONE;
59559                                 });
59560                                 return;
59561                         }
59563                         fs_error();
59564                 }
59565                 , FS_proto = FileSaver.prototype
59566                 , saveAs = function(blob, name, no_auto_bom) {
59567                         return new FileSaver(blob, name || blob.name || "download", no_auto_bom);
59568                 }
59569         ;
59570         // IE 10+ (native saveAs)
59571         if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
59572                 return function(blob, name, no_auto_bom) {
59573                         name = name || blob.name || "download";
59575                         if (!no_auto_bom) {
59576                                 blob = auto_bom(blob);
59577                         }
59578                         return navigator.msSaveOrOpenBlob(blob, name);
59579                 };
59580         }
59582         FS_proto.abort = function(){};
59583         FS_proto.readyState = FS_proto.INIT = 0;
59584         FS_proto.WRITING = 1;
59585         FS_proto.DONE = 2;
59587         FS_proto.error =
59588         FS_proto.onwritestart =
59589         FS_proto.onprogress =
59590         FS_proto.onwrite =
59591         FS_proto.onabort =
59592         FS_proto.onerror =
59593         FS_proto.onwriteend =
59594                 null;
59596         return saveAs;
59598            typeof self !== "undefined" && self
59599         || typeof window !== "undefined" && window
59600         || this.content
59602 // `self` is undefined in Firefox for Android content script context
59603 // while `this` is nsIContentFrameMessageManager
59604 // with an attribute `content` that corresponds to the window
59606 if (typeof module !== "undefined" && module.exports) {
59607   module.exports.saveAs = saveAs;
59608 } else if (("function" !== "undefined" && __webpack_require__(307) !== null) && (__webpack_require__(308) !== null)) {
59609   !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
59610     return saveAs;
59611   }).call(exports, __webpack_require__, exports, module),
59612                                 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
59616 /***/ }),
59617 /* 307 */
59618 /***/ (function(module, exports) {
59620 module.exports = function() {
59621         throw new Error("define cannot be used indirect");
59625 /***/ }),
59626 /* 308 */
59627 /***/ (function(module, exports) {
59629 /* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {/* globals __webpack_amd_options__ */
59630 module.exports = __webpack_amd_options__;
59632 /* WEBPACK VAR INJECTION */}.call(exports, {}))
59634 /***/ })
59635 /******/ ]);
59638 this.pdfMake = this.pdfMake || {}; this.pdfMake.vfs = {
59639   "Roboto-Italic.ttf": "AAEAAAASAQAABAAgR0RFRtRX1FkAAgp8AAACREdQT1NKcuCzAAIMwAAAUiRHU1VCw4aZEQACXuQAABfoT1MvMqCnsO0AAAGoAAAAYGNtYXBAbb9DAAAafAAABoBjdnQgJEEG5QAAI5QAAABMZnBnbWf0XKsAACD8AAABvGdhc3AACAATAAIKcAAAAAxnbHlmoLsktAAALagAAdn2aGRteCEe/AUAABWQAAAE7GhlYWT4gasAAAABLAAAADZoaGVhDKYSegAAAWQAAAAkaG10eHJO1ygAAAIIAAATiGxvY2EXM5zBAAAj4AAACcZtYXhwBxICWwAAAYgAAAAgbmFtZTlLZFAAAgegAAACrnBvc3T/YQBkAAIKUAAAACBwcmVwdKCP7AAAIrgAAADbAAEAAAACAAAcadIiXw889QAbCAAAAAAAxPARLgAAAADQ206M+jj91QlMCHMAAgAJAAIAAAAAAAAAAQAAB2z+DAAACRb6OP52CUwIAAGzAAAAAAAAAAAAAAAABOIAAQAABOIAkAAWAFYABQABAAAAAAAOAAACAAFzAAYAAQADBAsBkAAFAAAFmgUzAAABHwWaBTMAAAPRAGYCAAAAAgAAAAAAAAAAAOAACv9QACF/AAAAIQAAAABHT09HAAEAAP/9BgD+AABmB5oCACAAAZ8AAAAABDoFsAAgACAAAgOWAGQACgAAAAoAAAH2AAAB9gAAAgkAQwKFAMgE0QBSBGYASgW5ALsE3QA6AWQAqgKxAG0Cvf+PA2IAawRwAEwBkP+PAi4AGQIVADUDPf+PBGYAaARmAPkEZgAXBGYANARmAAUEZgByBGYAcARmAJ0EZgBBBGYAlAHrACsBrv+bA/wAQQRMAHAEGAA6A7QApQcCAEQFGv+vBN8AOwUXAHQFIQA7BHMAOwRUADsFUwB5BZIAOwImAEkEUgAKBOcAOwQ3ADsG0AA7BZIAOwVgAHcE7wA7BWAAbwTRADoEpQAnBKsAqAUSAGcE+gCkBuwAwwTn/9QEswCoBK//6wIZ//8DOQC/Ahn/egNIAE8Div+BAnAAzwRDADMEZQAfBBoARgRqAEsEJgBFArwAdARlAAQEUAAfAewALwHk/xQD+QAgAewALwbXAB4EUgAfBHcARQRl/9cEcwBJAqoAHwQKAC4CkwBDBFEAWwPMAG4F3wCAA+P/xAO2/6UD4//tAqoAOAHuACECqv+MBVEAaQHu//EESABSBIz/8wWSABIEvQBTAeb/9wTM/90DSADbBiMAYgOCAMMDrgBZBFYAgQYkAGEDmADjAvAA6AQvACUC4gBcAuIAbgJ5ANUEb//lA9UAewIQAKUB9v/IAuIA3wORAMADrQAPBbkAuQYPALQGEwCeA7b/0wdL/4QELQAoBWAAIASgADgEpwAeBpcAEwSWAFwEeABEBG8AOQSD/+AFeQA1AfUALgRbAC0EOAAiAiIAIwVqADUEbwAkB3AAVAcWAEcB9wAzBWcAUQKu/0kFXgBnBHkAQgVvAGcE1wBaAf7/CQQhAD4DsQEXA3wBJgOZAOMDWgEHAewBDgKiAQECI/+vA7MA3QLvAMICUv/pAAr9agAK/esACv0LAAr99QAK/NsB6vy7AgcBIQP2APMCEQClBFsAQwWD/7EFUQBpBSD/xAR4AAwFkwBEBHj/2gWZAFQFaACGBTMACgRsAEgEo//wA+0AhARvAEMEOQApBA8AggRvACQEdQBzAo0AhQRW/7cD2AA/BKkAYARv/9wENgBOBG8ASgQWAIcERQBnBYIAQQV5AE8GbgBmBIcAUQQrAGcGIgBmBdsAoQVFAHgIWf/MCGwAQwZaALQFkgBCBO4ANAXg/4sHFf+sBKUAJQWSAEMFiP/KBOoAkwYHAFsFtgBBBVoAzgdXAEIHjgBCBe0AiQbAAEUE6AA2BUUAdAb6AEkE+//oBFQARgR5ADADSwAtBLn/jQX7/6UD+wAhBIUALwQ7AC8Ehv/IBcsAMASEAC8EhQAvA8QAYAWqAEwEowAvBEIAewZQAC8GdQAkBNsAVgYQADAEQQAwBDYANAZfADAETP+/BFAAHwQ2AE4Gn//DBrkALwRwAB8EhQAvBtwAbwYGAE8EPwAuBv4ASQXUACwEt/+6BC//ogbfAFoF5wBOBqcAJgW+ACkIyQBIB58ALgQN/84Dx//KBVEAaQRyAEIE7QCtA+4AhAVRAGoEbwBEBtUAdAX/AFIG3ABvBgYATwUUAGYEMABNBOEAQAAK/OgACv0LAAr+FwAK/jsACvo4AAr6TwQ/AC4E/gA6BHD/1wRLADUDfwAkBMAAQwPwACQE7AA2BGYALQZkALsFYwB0B50AOgWSACQH/ABCBskAJAXKAHEEuABfBv8ArAU9AFcFTwDEBFIAmAVQAOwGCgCKBKMABwTsADUEQwAtBZAAQwRvACQFZwBRBI4APASO//wEnf/4Azr/6QTaADEGawAyBrkATAYvAK0FDQBoBDIArwPyAKAHj//fBk3/2gfIADsGeAAjBNoAagQHAEwFiwCaBQMAfQVFAGoDEgDyA/8AAAf0AAAD/wAAB/QAAAKuAAACBAAAAVwAAARmAAACKQAAAZ8AAADVAAAACgAAAi0AGQItABkFIgCnBhkAmQOU/18BlwCuAZcAiQGV/5gBlwDUAsgAtgLPAJUCtv+UBFEAdwR2//YCpwCgA7EAOQU7ADkA+QAaB3kAlwJeAF8CXgACA5H/7wLiAGEDUAB+BIz/8wYuAAoGaAA5CD8AOgc0ACIGBgAfBGYAUQW3AEMEDABJBFwACgUp//IFMP/lBcQAzAO7AEsIBQA1BOUA6gT6AIIGAQC1BqwAkgalAI8GQwC+BHYATQVtACQElf+sBHkAqwSqAEEIBQBNAgb/GgRpADEETABwA/z/1AQZABkD8wBBAkQAeAKFAHAB/v/jBNcAdARWAFgEcgB0BqoAdAaqAHQE0gB0BnIAKQAKAAAH/v+rCDUAXAQKAGIEhQBBAff/DwGP/70DkgETA4wBEgONARED4ADNA/kAzgPfACID2wDSA5IBEQH4APwEbP+lBDkAHQRkAEcEZwAdA9IAHQO4AB0EkgBMBMcAHQHjACoDvP/2BD0AHQOiAB0F3gAdBMcAHQShAEoERQAdBKEARQQzAB0ECgARBBAAbQRkAEUETwB6BfAAlQQ9/7YEFQB0BA3/3ALiAB0C4gBrAuL/6QLi//sC4v/wAuIAFgLiAB4C4gAvAuIACwLiADYDhACTAqoBCwQk/5oEqABLBS0AQwUHAEQD/gAlBR8ARAP6ACUECgASBB0ABgQlADQDnQAdBE//sAShAEoET/+wA3j/0wSzAB0D2//VBUgAUQT6AH4E1gAMBVIAbARkAEcHE//EByEAHQVUAG0EsgAdBEIAHwUH/4kF5/+vBCgAEQTQAB8ENwAeBKb/xAQJAFgFCgAdBFIAWgYqAB0GgwAdBQAAUAXNAB8ENwAfBGMAIAZOAB0Ebv/fA/z/+gYh/68EYQAeBOwAHgUZAGkFoABQBEcAdASO/7YGOgBsBFIAWgRSAB0FoQAvBK8AQQQoABEEoQBKBB3//wPPAB4H7gAdBJH/3QRlAB8EHABDBHoARwRzACQDaACpBHT/1wSDAEYEJgBFBGUANQVhAIEFjACEBXIARAW9AIUFwACFA8IAuwRpADkDnQAdBEH/gQS0/9MC4gCQAuIAYQLiAIkC4gCRAuIAogLiAH4C4gCpBFP/1QQYACsGewBJBJ8APwTkAGQCAP8JAf//CQH2AC4B9v96AfYALgH2//EEOQAdAfYAAAIuABkFPwAvBT8ALwRuAD0EqwCoApP/9AUa/68FGv+vBRr/rwUa/68FGv+vBRr/rwUa/68FFwB0BHMAOwRzADsEcwA7BHMAOwImAEkCJgBJAiYASQImAEkFkgA7BWAAdwVgAHcFYAB3BWAAdwVgAHcFEgBnBRIAZwUSAGcFEgBnBLMAqARDADMEQwAzBEMAMwRDADMEQwAzBEMAMwRDADMEGgBGBCYARQQmAEUEJgBFBCYARQH1AC4B9QAuAfUALgH1AC4EUgAfBHcARQR3AEUEdwBFBHcARQR3AEUEUQBbBFEAWwRRAFsEUQBbA7b/pQO2/6UFGv+vBEMAMwUa/68EQwAzBRr/rwRDADMFFwB0BBoARgUXAHQEGgBGBRcAdAQaAEYFFwB0BBoARgUhADsFAABLBHMAOwQmAEUEcwA7BCYARQRzADsEJgBFBHMAOwQmAEUEcwA7BCYARQVTAHkEZQAEBVMAeQRlAAQFUwB5BGUABAVTAHkEZQAEBZIAOwRQAB8CJgBJAfUAEQImAEkB9QAaAiYASQH1AC4CJv+OAez/cAImAEkGeABJA9AALwRSAAoB/v8JBOcAOwP5ACAENwA7AewALwQ3ADsB7P+jBDcAOwKCAC8ENwA7AsgALwWSADsEUgAfBZIAOwRSAB8FkgA7BFIAHwRSAB8FYAB3BHcARQVgAHcEdwBFBWAAdwR3AEUE0QA6AqoAHwTRADoCqv+fBNEAOgKqAB8EpQAnBAoALgSlACcECgAuBKUAJwQKAC4EpQAnBAoALgSlACcECgAuBKsAqAKTAEMEqwCoApMAQwSrAKgCuwBDBRIAZwRRAFsFEgBnBFEAWwUSAGcEUQBbBRIAZwRRAFsFEgBnBFEAWwUSAGcEUQBbBuwAwwXfAIAEswCoA7b/pQSzAKgEr//rA+P/7QSv/+sD4//tBK//6wPj/+0HS/+EBpcAEwVgACAEbwA5BGf/sARn/7AEEABtBGz/pQRs/6UEbP+lBGz/pQRs/6UEbP+lBGz/pQRkAEcD0gAdA9IAHQPSAB0D0gAdAeMAKgHjACoB4wAqAeMAKgTHAB0EoQBKBKEASgShAEoEoQBKBKEASgRkAEUEZABFBGQARQRkAEUEFQB0BGz/pQRs/6UEbP+lBGQARwRkAEcEZABHBGQARwRnAB0D0gAdA9IAHQPSAB0D0gAdA9IAHQSSAEwEkgBMBJIATASSAEwExwAdAeMADwHjABgB4wAqAeP/egHjACoDvP/2BD0AHQOiAB0DogAdA6IAHQOiAB0ExwAdBMcAHQTHAB0EoQBKBKEASgShAEoEMwAdBDMAHQQzAB0ECgARBAoAEQQKABEECgARBBAAbQQQAG0EEABtBGQARQRkAEUEZABFBGQARQRkAEUEZABFBfAAlQQVAHQEFQB0BA3/3AQN/9wEDf/cBRr/rwTXAGMF9gBxAooAdwV0AGoFF//uBUcAHgKNACAFGv+vBN8AOwRzADsEr//rBZIAOwImAEkE5wA7BtAAOwWSADsFYAB3BO8AOwSrAKgEswCoBOf/1AImAEkEswCoBGwASAQ5ACkEbwAkAo0AhQRFAGcEWwAtBHcARQRv/+UDzABuA+P/xAKNAGcERQBnBHcARQRFAGcGbgBmBHMAOwRbAEMEpQAnAiYASQImAEkEUgAKBQcARATnADsE6gCTBRr/rwTfADsEWwBDBHMAOwWSAEMG0AA7BZIAOwVgAHcFkwBEBO8AOwUXAHQEqwCoBOf/1ARDADMEJgBFBIUALwR3AEUEZf/XBBoARgO2/6UD4//EBCYARQNLAC0ECgAuAewALwH1AC4B5P8UBDsALwO2/6UG7ADDBd8AgAbsAMMF3wCABuwAwwXfAIAEswCoA7b/pQFkAKoChQDIBBIAQwH+/wkBlwCJBtAAOwbXAB4FGv+vBEMAMwRzADsFkgBDBCYARQSFAC8FaACGBXkATwTtAK0D7gCECC0ARQkWAHcEpQAlA/sAIQUXAHQEGgBGBLMAqAPtAIQCJgBJBxX/rAX7/6UCJgBJBRr/rwRDADMFGv+vBEMAMwdL/4QGlwATBHMAOwQmAEUFZwBRBCEAPgQhAD4HFf+sBfv/pQSlACUD+wAhBZIAQwSFAC8FkgBDBIUALwVgAHcEdwBFBVEAaQRyAEIFUQBpBHIAQgVFAHQENgA0BOoAkwO2/6UE6gCTA7b/pQTqAJMDtv+lBVoAzgRCAHsGwABFBhAAMATn/9QD4//EBGoASwWI/8oEhv/IBRr/rwRDADMFGv+vBEMAMwUa/68EQwAzBRr/rwRDADMFGv+vBEMAMwUa/68EQwAzBRr/rwRDADMFGv+vBEMAMwUa/68EQwAzBRr/rwRDADMFGv+vBEMAMwUa/68EQwAzBHMAOwQmAEUEcwA7BCYARQRzADsEJgBFBHMAOwQmAEUEcwA7BCYARQRzADsEJgBFBHMAOwQmAEUEcwA7BCYARQImAEkB9QAuAiYADgHs//EFYAB3BHcARQVgAHcEdwBFBWAAdwR3AEUFYAB3BHcARQVgAHcEdwBFBWAAdwR3AEUFYAB3BHcARQVeAGcEeQBCBV4AZwR5AEIFXgBnBHkAQgVeAGcEeQBCBV4AZwR5AEIFEgBnBFEAWwUSAGcEUQBbBW8AZwTXAFoFbwBnBNcAWgVvAGcE1wBaBW8AZwTXAFoFbwBnBNcAWgSzAKgDtv+lBLMAqAO2/6UEswCoA7b/pQSIAEsEiAAABQcARAQ7AC8FkgA7BIQALwSrAKgDxABgBOf/1APj/8QFWgDOBEIAewVaAM4EQgB7BFsAQwNLAC0HFf+sBfv/pQYKAIoEowAHBFAAHwToACsE6AArBFsAEANL/+YFGwBYBBIAOQWSAEMEhQAvBZIAOwSEAC8G0AA7BcsAMAWI/8oEhv/IBLMAqAPtAF0E5//UA+P/xAQ5ACkEVP/XBhkAmQRmABcEZgA0BGYABQRmAHIEegCUBI4AfAVTAHkEZQAEBZIAOwRSAB8FGv+vBEMAMwRzADsEJgBFAib/3wH1/40FYAB3BHcARQTRADoCqgAfBRIAZwRRAFsEj/+yBN8AOwRlAB8FIQA7BGoASwUhADsEagBLBZIAOwRQAB8E5wA7A/kAIATnADsD+QAgBDcAOwHs//IG0AA7BtcAHgWSADsEUgAfBO8AOwRl/9cE0QA6Aqr/7gSlACcECgAuBKsAqAKTAEME+gCkA8wAbgT6AKQDzABuBuwAwwXfAIAEr//rA+P/7QWm/wwEbP+lBA7/4QUD//0CHwABBKsAHQRR/5sE4AAWBGz/pQQ5AB0D0gAdBA3/3ATHAB0B4wAqBD0AHQXeAB0EoQBKBEUAHQQQAG0EFQB0BD3/tgHjACoEFQB0A9IAHQOdAB0ECgARAeMAKgHjACoDvP/2BD0AHQQJAFgEbP+lBDkAHQOdAB0D0gAdBNAAHwXeAB0ExwAdBKEASgSzAB0ERQAdBGQARwQQAG0EPf+2BCgAEQTHAB0EZABIBBUAdAWhAC8E0AAfBAkAWAVIAFEFGv+vBEMAMwRzADsEJgBFAAAAAQAABOQJCgQAAAICAgMFBQYFAgMDBAUCAgIEBQUFBQUFBQUFBQICBAUFBAgGBQYGBQUGBgIFBgUIBgYGBgUFBQYGCAYFBQIEAgQEAwUFBQUFAwUFAgIEAggFBQUFAwUDBQQHBAQEAwIDBgIFBQYFAgUEBwQEBQcEAwUDAwMFBAICAwQEBgcHBAgFBgUFBwUFBQUGAgUFAgYFCAgCBgMGBQYFAgUEBAQEAgMCBAMDAAAAAAACAgQCBQYGBgUGBQYGBgUFBAUFBQUFAwUEBQUFBQUFBgYHBQUHBwYJCQcGBgcIBQYGBgcGBggJBwgGBggGBQUEBQcEBQUFBwUFBAYFBQcHBQcFBQcFBQUHCAUFCAcFCAcFBQgHBwYKCQUEBgUGBAYFCAcIBwYFBQAAAAAAAAUGBQUEBQQGBQcGCQYJCAcFCAYGBQYHBQYFBgUGBQUFBAUHCAcGBQQJBwkHBQUGBgYDBQkFCQMCAgUCAgEAAgIGBwQCAgICAwMDBQUDBAYBCAMDBAMEBQcHCQgHBQYFBQYGBgQJBgYHCAcHBQYFBQUJAgUFBAUEAwMCBQUFCAgFBwAJCQUFAgIEBAQEBAQEBAIFBQUFBAQFBQIEBQQHBQUFBQUFBQUFBwUFBQMDAwMDAwMDAwMEAwUFBgYEBgQFBQUEBQUFBAUEBgYFBgUICAYFBQYHBQUFBQUGBQcHBgcFBQcFBAcFBgYGBQUHBQUGBQUFBQQJBQUFBQUEBQUFBQYGBgYGBAUEBQUDAwMDAwMDBQUHBQYCAgICAgIFAgIGBgUFAwYGBgYGBgYGBQUFBQICAgIGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQICAgIFBQUFBQUFBQUFBAQGBQYFBgUGBQYFBgUGBQYGBQUFBQUFBQUFBQYFBgUGBQYFBgUCAgICAgICAgIHBAUCBgQFAgUCBQMFAwYFBgUGBQUGBQYFBgUFAwUDBQMFBQUFBQUFBQUFBQMFAwUDBgUGBQYFBgUGBQYFCAcFBAUFBAUEBQQIBwYFBQUFBQUF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c3dzd3N/c4dzkXObc7Jz0XPvdA50LnQ6dEZ0d3S4dR11QnVOdV51cnZGdmJ2f3aSdqZ273d6eBx4qXi1eXh503pZewR7ZnvpfEd8uH1dfcl+W368fyR/Pn9Yf3J/jH//gCeAYYB9gLKBO4GBgfiCOYJHglWCjoKbgsKC24Lng0qDo4Q3hMKFQ4YXhheHlIfxiCKIgIiviMWJKIl6ibqKLIqFisWLCItIi2KLqIwejHqMx40TjU+Nto4EjiKOWI6cjsSPFo9Uj7OQA5BhkLWRI5FPkYuRvpISkleSi5LIkxuTRpOVlAaUSJSolQiVNZW+liCWN5aBlz6XuZgtmHyYwpkEmUyZzJo4mq+a2psQm4ibuZwHnDqcepzunVCdu54enoyfA597n9KgDaBpoMGhN6G8ofqiS6KUotijE6Nbo5uj5aRApEyknaURpZyl+aZIptCnM6eYp/iooqiuqQGpTamiqeuqZarSqzerq6xHrM6tb63irk+uqK8Tr5yvpLAQsH6w6bFysdWyQLKSsvSzWrOFs9q0BLRdtKG0tbTJtNu077UBtRi1LLWOtba2RLa0tw23FbcdtyW3MLc4t0S3sLewt7i4KLiYuPq5QLmoub+51rntugS6HLovuju6R7peunC6h7qaurG6w7rauu27BLsbuy27RLtbu267hbuXu667wbvTu+q7/LwSvCO8NrxJvFW8Ybx4vIq8oLyzvMm82rzxvQm9Gr0xvUO9Wb1qvX29lL2mvby9z73hvfO+Cr4gvje+Sb62v2S/dr+Iv5q/q7+9v8+/4b/ywATAEMAiwDPARcBXwGnAe8DvwX3Bj8GgwbLBw8HVwefB+cILwhfCKcI7wk/CYcJzwoXCl8KpwrvCxsLRwuPC78L7ww3DH8MrwzfDScNbw2fDc8OIw5TDoMOsw77D0MPcw+jD+sQLxBfEKcQ6xEzEXsRxxITElsSoxLTEwMTSxOPE9cUHxRnFKsU2xULFTsVaxWzFfcWJxZXFocWtxb/Fy8Xdxe7GAMYRxiPGNcZIxlvGbsaBxuLHUcdjx3XHh8eYx6vHvcfPx+HH88gFyBbILchEyFvIcsiVyLjIyMjfyPHJB8kYySvJPslKyVbJbcl/yZDJosm4ycnJ28nuygDKF8opyjvKTcpgynfKicqayq3Kv8rQyuLLSctby2zLfsuQy6HLssvDy9XMT8xg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AdMAAAEHAKEBFwAeAAkAsAcvsBPcMDEA////3AAABA4GIAImAdMAAAEGAJ5VHwAJALAHL7AO3DAxAP///68AAASLBj8CJgAlAAAABgCtBAD//wBjAAAFFQY/ACYAKWQAAAcArf9CAAD//wBxAAAF2wZBACYALGQAAAcArf9QAAL//wB3AAACZQZAACYALWQAAAcArf9WAAH//wBq/+cFIQY/ACYAMxQAAAcArf9JAAD////uAAAFlgY/ACYAPWQAAAcArf7NAAD//wAeAAAE7gY/ACYAuRQAAAcArf9MAAD//wAg//QDGwZ0AiYAwgAAAQcArv8t/+wAHACwAEVYsA4vG7EOGD5ZsBvcsBHQsBsQsCTQMDH///+vAAAEiwWwAgYAJQAA//8AOwAABKAFsAIGACYAAP//ADsAAASxBbACBgApAAD////rAAAEzgWwAgYAPgAA//8AOwAABXcFsAIGACwAAP//AEkAAAIBBbACBgAtAAD//wA7AAAFUAWwAgYALwAA//8AOwAABrcFsAIGADEAAP//ADsAAAV3BbACBgAyAAD//wB3/+cFDQXIAgYAMwAA//8AOwAABPMFsAIGADQAAP//AKgAAAUJBbACBgA4AAD//wCoAAAFMgWwAgYAPQAA////1AAABSsFsAIGADwAAP//AEkAAAMKBwkCJgAtAAABBwBq/7gBQgAMALACL7AZ3LAE0DAx//8AqAAABTIG/QImAD0AAAEHAGoA/QE2AAwAsAEvsB7csAnQMDH//wBI/+cEMgY6AiYAugAAAQcArQFo//sACQCwFS+wKNwwMQD//wAp/+cD5QY5AiYAvgAAAQcArQEh//oACQCwGi+wK9wwMQD//wAk/mED8wY6AiYAwAAAAQcArQE7//sACQCwAy+wFdwwMQD//wCF//QCZQYlAiYAwgAAAQYArSTmAAkAsAAvsBHcMDEA//8AZ//lBAoGdAImAMoAAAEGAK4c7AASALALL7Ar3LAW0LArELAa0DAx//8ALQAABFcEOgIGAI0AAP//AEX/6AQfBFICBgBTAAD////l/mAEJQQ6AgYAdgAA//8AbgAAA+0EOgIGAFoAAP///8QAAAP0BDoCBgBcAAD//wBn//QC3gWzAiYAwgAAAQYAaozsAAwAsAAvsCTcsA/QMDH//wBn/+UD+gWzAiYAygAAAQYAanvs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3LAi0DAx//8Ak//mBUAG+gImAN0AAAEHAHAA7AFKAAkAsAEvsBHcMDEA////pf5FA+wFuAImAF0AAAEGAHAvCAAJALABL7AQ3DAxAP//AJP/5gVABwkCJgDdAAABBwBqARsBQgAMALABL7Am3LAR0DAx////pf5FA+wFxwImAF0AAAEGAGpeAAAMALABL7Al3LAQ0DAx//8Ak//mBUAHQQImAN0AAAEHAKUBXQFCABYAsABFWLABLxuxARw+WbAT3LAX0DAx////pf5FBF4F/wImAF0AAAEHAKUAoAAAABYAsABFWLABLxuxARg+WbAS3LAW0DAx//8AzgAABUQHCQImAOAAAAEHAGoBRAFCABYAsABFWLASLxuxEhw+WbAo3LAc0DAx//8AewAABAAFswImAPgAAAEGAGpp7AAMALAIL7Ao3LAT0DAx//8ARQAABpYHCQAmAOUPAAAnAC0ElQAAAQcAagIIAUIAFgCwAEVYsAovG7EKHD5ZsCHcsC3QMDH//wAwAAAFqQWzACYA/QAAACcAjAQKAAABBwBqAWr/7AAWALAARViwCi8bsQoYPlmwIdywLdAwMf///9T+RQUrBbACJgA8AAAABwGvA5UAAP///8T+RQP0BDoCJgBcAAAABwGvAqoAAP//AEv/6AR1BgACBgBIAAD////K/kUFZQWwAiYA3AAAAAcBrwQkAAD////I/kUESgQ6AiYA8QAAAAcBrwM7AAD///+v/p8EiwWwAiYAJQAAAAcArATcAAD//wAz/p8DzwRRAiYARQAAAAcArAQpAAD///+vAAAEiwe5AiYAJQAAAQcAqgUBAUYACQCwBC+wGNwwMQD//wAz/+gDzwaDAiYARQAAAQcAqgRzABAACQCwGC+wOdwwMQD///+vAAAF7QfDAiYAJQAAAQcBtwDyAS4AFgCwAEVYsAUvG7EFHD5ZsA7csBTQMDH//wAz/+gFXwaOAiYARQAAAQYBt2T5ABYAsABFWLAYLxuxGBg+WbAv3LA10DAx////rwAABIsHvwImACUAAAEHAbYA+AE9ABYAsABFWLAFLxuxBRw+WbAM3LAT0DAx//8AM//oA/0GiQImAEUAAAEGAbZqBwAWALAARViwGC8bsRgYPlmwL9ywNNAwMf///68AAAVsB+oCJgAlAAABBwG1APMBGwAWALAARViwBS8bsQUc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ALAARViwBC8bsQQcPlmwDNywENAwMf//ADP/6APPBesCJgBFAAABBwCrA/L//QAWALAARViwGC8bsRgYPlmwLdywMdAwMf//ADsAAASxBywCJgApAAABBwCrBE4BPgAWALAARViwBi8bsQYcPlmwDdywEdAwMf//AEX/6gPgBesCJgBJAAABBwCrA9f//QAWALAARViwCC8bsQgYPlmwIdywJdAwMf///98AAAKKBywCJgAtAAABBwCrAwQBPgAWALAARViwAi8bsQIcPlmwBdywCdAwMf///40AAAI4BekCJgCMAAABBwCrArL/+wAWALAARViwAi8bsQIYPlmwBdywCdAwMf//AHf/5wUNByICJgAzAAABBwCrBKEBNAAWALAARViwCi8bsQocPlmwJNywKNAwMf//AEX/6AQfBesCJgBTAAABBwCrA+D//QAWALAARViwAC8bsQAYPlmwJNywKNAwMf//ADoAAATCByACJgA2AAABBwCrBEMBMgAWALAARViwBC8bsQQcPlmwGdywHdAwMf//AB8AAALUBesCJgBWAAABBwCrA0n//QAWALAARViwCi8bsQoYPlmwEtywDdAwMf//AGf/5wUgByACJgA5AAABBwCrBHsBMgAWALAARViwCi8bsQocPlmwFNywGNAwMf//AFv/6AQeBesCJgBZAAABBwCrA+T//QAWALAARViwBy8bsQcYPlmwFdywGdAwMf///7IAAAU8Bj8AJgDPZAAABwCt/pEAAP//ADv+qQSgBbACJgAmAAAABwCsBJgACv//AB/+lgP+BgACJgBGAAAABwCsBIb/9///ADv+qQTVBbACJgAoAAAABwCsBJcACv//AEv+nwR1BgACJgBIAAAABwCsBJkAAP//ADv+CQTVBbACJgAoAAAABwGiAR/+qv//AEv9/wR1BgACJgBIAAAABwGiASH+oP//ADv+qQV3BbACJgAsAAAABwCsBPoACv//AB/+qQPjBgACJgBMAAAABwCsBH8ACv//ADsAAAVQBy4CJgAvAAABBwB1AbABMAATALAARViwBS8bsQUcPlmwDtwwMQD//wAgAAAEIgc/AiYATwAAAQcAdQF9AUEACQCwBS+wD9wwMQD//wA7/vgFUAWwAiYALwAAAAcArATSAFn//wAg/uUEGgYAAiYATwAAAAcArARQAEb//wA7/qkDsQWwAiYAMAAAAAcArASdAAr////y/qkB7gYAAiYAUAAAAAcArAM3AAr//wA7/qkGtwWwAiYAMQAAAAcArAWnAAr//wAe/qkGagRSAiYAUQAAAAcArAWrAAr//wA7/qkFdwWwAiYAMgAAAAcArAT+AAr//wAf/qkD4wRSAiYAUgAAAAcArARmAAr//wA7AAAE8wdAAiYANAAAAQcAdQG0AUIAEwCwAEVYsAMvG7EDHD5ZsBbcMDEA////1/5gBDYF9QImAFQAAAEHAHUBkf/3ABMAsABFWLANLxuxDRg+WbAh3DAxAP//ADr+qQTCBbACJgA2AAAABwCsBJUACv///+7+qQLUBFQCJgBWAAAABwCsAzMACv//ACf+nwSjBccCJgA3AAAABwCsBKQAAP//AC7+lwO2BFACJgBXAAAABwCsBG3/+P//AKj+nwUJBbACJgA4AAAABwCsBJYAAP//AEP+nwKUBUACJgBYAAAABwCsA/oAAP//AKQAAAVhBy0CJgA6AAABBwCkAOEBRgATALAARViwAS8bsQEcPlmwCtwwMQD//wBuAAAD7QXiAiYAWgAAAQYApBv7ABMAsABFWLABLxuxARg+WbAK3DAxAP//AKT+qQVhBbACJgA6AAAABwCsBMoACv//AG7+qQPtBDoCJgBaAAAABwCsBDgACv//AMP+qQdBBbACJgA7AAAABwCsBc0ACv//AID+qQX+BDoCJgBbAAAABwCsBSwACv///+v+qQTOBbACJgA+AAAABwCsBJgACv///+3+qQPOBDoCJgBeAAAABwCsBEIACv///wz/5wVTBdYAJgAzRgAABwFa/hoAAP///6UAAAPjBRwCJgG6AAAABwCt/6v+3f///+EAAAQrBR8AJgG+PAAABwCt/sD+4P////0AAATWBRwAJgHBPAAABwCt/tz+3f//AAEAAAHmBR4AJgHCPAAABwCt/uD+3///AB3/6gRYBRwAJgHICgAABwCt/vz+3f///5sAAAShBRwAJgHSPAAABwCt/nr+3f//ABYAAAR0BRsAJgHzCgAABwCt/xT+3P///6UAAAPjBI0CBgG6AAD//wAdAAAD5wSNAgYBuwAA//8AHQAAA+8EjQIGAb4AAP///9wAAAQOBI0CBgHTAAD//wAdAAAEmgSNAgYBwQAA//8AKgAAAaoEjQIGAcIAAP//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DAAGiA7uDu4MRg6gCiIO7g7uD5oKigaSDGYMRgrYCqwNUg8QCl4L4gsQDBYGmA22DbYNtgwgCxAKUAxMDbAMTAsQBqYN5gtwD5oLcAasBrIGvAbCBsgMTAbOBtgNtgb+BxQHKgcwB0YHTAdSB4QHigeQDcANwAe+Du4H4AgCDVIIMA7uDu4LJg7uDu4IRg3ADcAIeAiCCIwIpg1ICLgNsAjSCOgLEAkyCUwJaAloCxAJYgloCWgJaAtwDCAK2AxMCxAN5g1IDqAOoA1ICtIK0grSCtIK0gmKCbAJugnECeIJ9AoGChgK/g+aD5oPmg+aDGYLcAtwC3ALcAtwC3ALcAr+DAAMAAwADAAO7g7uDu4O7g7uD5oPmg+aD5oPmgxGDEYMRgxGDxAL4gviC+IL4gviC+IL4gwWDBYMFgwWDbYMIAwgDCAMIAwgDEwMTAtwC+ILcAviC3AL4gr+Cv4K/gr+D5oMAAwWDAAMFgwADBYMAAwWDAAMFg7uDbYO7g7uDu4O7g7uDEYOoAoiCiIKIgoiDu4Ntg7uDbYO7g22DbYPmgwgD5oMIA+aDCAKUApQClAMZgxmDGYMRgxGDEYMRgxGDEYKrA8QDEwPEApeCl4KXgtwDAAO7g7uD5oPEAtwCoAMAApeDu4O7g6gDu4O7g+aCooMZg8QDVIO7g8QDbYMIAxMDCAMAA3mDu4O7gxGDqAOoAsmC3AKgA3mDAAO7g7uD5oKigr+DGYNUgviDBYMIAsQDEwNsAwWDUgMTAqsCqwKrA8QDEwK0grSCtIO7g22C3AL4gwADBYK2AxMCv4PEAxMDu4NUg2wDu4LcAviC3AL4gwADBYMFgwWDVINsA+aDCAMIAsQCyYMTAsmDEwLJgxMDVINsAtwC+ILcAviC3AL4gtwC+ILcAviC3AL4gtwC+ILcAviC3AL4gtwC+ILcAviC3AL4gwADBYMAAwWDAAMFgwADBYMAAwWDAAMFgwADBYMAAwWDu4O7g+aDCAPmgwgD5oMIA+aDCAPmgwgD5oMIA+aDCAMIAxGDEYPEAxMDxAMTA8QDEwOoA7uDGYNUg2wDeYNSA1SDbANtg3ADeYOoA7uDu4PEA+aAAIAhwAGAAYAAAALAAsAAQATABMAAgAlACoAAwAsADUACQA4AD4AEwBFAEYAGgBJAEoAHABMAEwAHgBRAFQAHwBWAFYAIwBaAFoAJABcAF0AJQCKAIoAJwCcAJwAKACwALQAKQC2ALgALgC6ALoAMQC8AL0AMgC/AMAANADCAMQANgDGAMsAOQDRANEAPwDTAN0AQADfAN8ASwDhAOMATADlAOcATwDpAO0AUgDwAPAAVwD1APcAWAD6APsAWwD9AP8AXQEDAQQAYAEJAQkAYgEMAQwAYwEXARkAZAErAS0AZwEwATAAagEyATIAawFJAUkAbAFsAW0AbQFvAXEAbwG6AboAcgG9Ab0AcwHEAcUAdAHIAcgAdgHKAcsAdwHNAc0AeQIoAigAegIqAisAewJHAkgAfQJKAkoAfwJMAm0AgAJvAnIAogJ3AnwApgKBAokArAKLAosAtQKNAo0AtgKPAo8AtwKRApEAuAKTApwAuQKlAqcAwwKpAqkAxgKrAqsAxwKtAq0AyAKvAq8AyQKyArIAygK0ArQAywK2ArYAzAK4ArgAzQK6AroAzgK8ArwAzwK+AsoA0ALMAswA3QLOAs4A3gLQAtAA3wLbAtsA4ALdAt0A4QLfAt8A4gLhAuEA4wLjAuMA5ALlAuUA5QLnAucA5gLpAukA5wLrAusA6ALtAu0A6QLvAvIA6gL0AvQA7gL2AvYA7wNTA1gA8ANbA2oA9gNtA20BBgNxA3EBBwNzA3MBCAN3A3cBCQN6A3sBCgN9A4YBDAOIA4oBFgOMA5EBGQOTA5QBHwOWA5kBIQOfA6ABJQOiA6IBJwOkA6QBKAOmA6kBKQOsA7EBLQOzA7MBMwO3A7gBNAO9A70BNgO/A8gBNwPLA8wBQQPOA9EBQwPYA9kBRwPdA90BSQPfA+UBSgPqA+sBUQPvBBcBUwQZBBkBfAQbBCgBfQQwBDABiwQzBDMBjAQ1BDUBjQRBBEYBjgRJBEkBlARLBEsBlQRNBE0BlgRPBFABlwRVBFgBmQRbBFsBnQRdBF4BngRgBGABoARkBGQBoQRmBGYBogRqBGoBowSqBKoBpAABABP/IAACAFb/5gG6/8AAAQG6AA4AAwANABQAQQASAGEAEwABAPX/9QABAMMADQACALf/wgDDABAAAQDD/+IAAQDG//IAAQDDAA4AAgDJ/+0A9f/AAAkAvv/mAMH/6wDC/+kAxP/wAMX/5wDJ/+MAy//OAMz/1ADN/9sABQDB/+wAwwAPAMX/6gDJ/8QAy//nAAUASv/pAMH/7gDD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Aor/6wKM/+sCjv/rApD/6wKS/+sClP/rApb/6wKY/+sCmv/rApz/6wKe/+sCoP/rAqL/6wKk/+sCsv74Asb/6wLI/+sCyv/rAtsAFALdABQC3wAUAuL/6gLk/+oC5v/qAuj/6gLq/+oC7P/qAvD/6ANT/1YDW/9WA2v/6wNv/+oDcf/rA3P/6AN2/+oDd//rA3j/6gN//vgDg/9WA44AFAOQ/94Dkf/rA5P/6wOV/+sDlv/oA5j/6wOf/+gDp//oA6//VgOw/94Ds//rA7j/6AO5/+sDvv/rA8D/6APF/1YDxv/eA8f/VgPI/94DzP/rA87/6wPP/+sD2f/rA9v/6wPd/+sD4f/oA+P/6APl/+gD7P/rA+//VgPw/94D8f9WA/L/3gPz/1YD9P/eA/X/VgP2/94D9/9WA/j/3gP5/1YD+v/eA/v/VgP8/94D/f9WA/7/3gP//1YEAP/eBAH/VgQC/94EA/9WBAT/3gQF/1YEBv/eBAj/6wQK/+sEDP/rBA7/6wQQ/+sEEv/rBBT/6wQW/+sEHP/rBB7/6wQg/+sEIv/rBCT/6wQm/+sEKP/rBCr/6wQs/+sELv/rBDD/6wQy/+sENP/qBDb/6gQ4/+oEOv/qBDz/6gQ+/+oEQP/qBEL/6ARE/+gERv/oBE0AFAAfADj/1QA6/+QAO//sAD3/3QDR/9UA1f/VARj/5AEy/9UBOv/VAmb/3QLb/9UC3f/VAt//1QLt/+wC7//dAvH/3QNY/90DZ//dA2r/3QOO/9UDoP/sA6L/7AOk/+wDpv/dA7f/5AO//90EQf/dBEP/3QRF/90ETf/VBGr/3QAaADj/sAA6/+0APf/QANH/sADV/7ABGP/tATL/sAE6/7ACZv/QAtv/sALd/7AC3/+wAu//0ALx/9ADWP/QA2f/0ANq/9ADjv+wA6b/0AO3/+0Dv//QBEH/0ARD/9AERf/QBE3/sARq/9AAEAAu/+4AOf/uAmL/7gJj/+4CZP/uAmX/7gKy/+4C4f/uAuP/7gLl/+4C5//uAun/7gLr/+4Df//uBDP/7gQ1/+4ARwAGABAACwAQAEf/6ABI/+gASf/oAEv/6ABV/+gAk//oAJj/6AC6/+gAx//oAMj/6AD2/+gBAv/oAR3/6AEh/+gBOf/oAUv/6AFM/+gBVv/oAWwAEAFtABABbwAQAXAAEAFxABACbv/o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/90AWv/hAF3/4QCT/9wAmP/cAJr/3QC6/9wAvP/hAMD/8wDH/9wAyP/cAMr/3QDr//MA7//zAPD/8wDy//MA8//zAPT/8wD2/9wA9//zAPn/8wD6//MA/f/zAP//8wEC/9wBBP/zARf/1gEZ/+EBHf/cASH/3AE1//MBOf/cAUT/8wFJ//MBS//cAUz/3AFW/9wCbv/cAm//3AJw/9wCcf/cAnL/3AJ3//MCeP/WAnn/1gJ6/9YCe//WAnz/1gJ9/90Cfv/dAn//3QKA/90Cgf/hAoL/4QKK/9wCjP/cAo7/3AKQ/9wCkv/cApT/3AKW/9wCmP/cApr/3AKc/9wCnv/cAqD/3AKi/9wCpP/cAr//8wLB//MCw//zAsT/8wLG/9YCyP/WAsr/1gLi/90C5P/dAub/3QLo/90C6v/dAuz/3QLw/+EDa//cA23/8wNv/90Dcf/WA3P/4QN2/90Dd//WA3j/3QOR/9wDkv/zA5P/1gOU//MDlf/cA5b/4QOY/9wDmf/zA57/8wOf/+EDp//hA67/8wOz/9wDtP/zA7j/4QO5/9wDvv/cA8D/4QPM/9wDzv/cA8//3APV//MD1//zA9n/1gPb/9wD3f/WA+H/4QPj/+ED5f/hA+n/8wPs/9wECP/cBAr/3AQM/9wEDv/cBBD/3AQS/9wEFP/cBBb/3AQc/9YEHv/WBCD/1gQi/9YEJP/WBCb/1gQo/9YEKv/cBCz/3AQu/9wEMP/WBDL/3AQ0/90ENv/dBDj/3QQ6/90EPP/dBD7/3QRA/90EQv/hBET/4QRG/+EESv/zBEz/8wRW//MEY//zBGX/8wRn//MAcQAG/9oAC//aAEf/8ABI//AASf/wAEv/8ABV//AAWf/vAFr/3ABd/9wAk//wAJj/8ACa/+8Auv/wALz/3ADH//AAyP/wAMr/7wD2//ABAv/wARn/3AEd//ABIf/wATn/8AFL//ABTP/wAVb/8AFs/9oBbf/aAW//2gFw/9oBcf/aAm7/8AJv//ACcP/wAnH/8AJy//ACff/vAn7/7wJ//+8CgP/vAoH/3AKC/9wCiv/wAoz/8AKO//ACkP/wApL/8AKU//AClv/wApj/8AKa//ACnP/wAp7/8AKg//ACov/wAqT/8ALi/+8C5P/vAub/7wLo/+8C6v/vAuz/7wLw/9wDa//wA2//7wNz/9wDdv/v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//UA1f/xANn/9ADc//UA3f/zARj/9AEy//EBOv/xAVH/9QJm//AC2//xAt3/8QLf//EC7//wAvH/8ANY//ADZ//wA2j/9ANq//ADgv/zA47/8QOP//QDpv/wA7f/9AO///ADwv/0A9D/9APg//MD4v/zA+T/8wPq//QD7f/1BEH/8ARD//AERf/wBE3/8QRP//QEV//0BGj/9QRq//AAWQAlAA8AOP/mADr/5gA8AA4APf/mALEADwCzAA8A0f/mANMADgDV/+YA2QAOANwADgDdAAsA4P/lAPEADwD4/+gBAwAPAQwADwEY/+YBMv/mATr/5gFRAA4CTAAPAk0ADwJOAA8CTwAPAlAADwJRAA8CUgAPAmb/5gKDAA8ChQAPAocADwLb/+YC3f/mAt//5gLv/+YC8f/mA1MADwNY/+YDWwAPA2f/5gNoAA4Dav/mA4IACwODAA8Djv/mA48ADgOm/+YDrwAPA7f/5gO//+YDwgAOA8UADwPHAA8D0AAOA+AACwPiAAsD5AALA+b/5QPn/+gD6gAOA+0ADgPuAA8D7wAPA/EADwPzAA8D9QAPA/cADwP5AA8D+wAPA/0ADwP/AA8EAQAPBAMADwQFAA8EQf/mBEP/5gRF/+YETf/mBE8ADgRR/+UEUv/oBFP/5QRU/+gEVwAOBGgADgRpAA8Eav/mAC4AOP/jADz/5QA9/+QA0f/jANP/5QDV/+MA2f/lANz/5QDd/+kA8f/qAQP/6gEy/+MBOv/jAVH/5QJm/+QC2//jAt3/4wLf/+MC7//kAvH/5ANY/+QDZ//kA2j/5QNq/+QDgv/pA47/4wOP/+UDpv/kA7//5APC/+UD0P/lA+D/6QPi/+kD5P/pA+r/5QPt/+UD7v/qBEH/5ARD/+QERf/kBE3/4wRP/+UEV//lBGj/5QRp/+oEav/kACEAOP/iADz/5ADR/+IA0//kANX/4gDZ/+QA3P/kAN3/6QDx/+sBA//rATL/4gE6/+IBUf/kAtv/4gLd/+IC3//iA2j/5AOC/+kDjv/iA4//5APC/+QD0P/kA+D/6QPi/+kD5P/pA+r/5APt/+QD7v/rBE3/4gRP/+QEV//kBGj/5ARp/+sAFwA4/+sAPf/zANH/6wDV/+sBMv/rATr/6wJm//MC2//rAt3/6wLf/+sC7//zAvH/8wNY//MDZ//zA2r/8wOO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ABgEJwQnAAMEKAQoABgEMAQwABgEMwQzAAwENQQ1AAwEQQRBAA8EQgRCABkEQwRDAA8ERAREABkERQRFAA8ERgRGABkESQRJAAkESwRLAAIETQRNAAYETwRPAA4EUARQABsEVQRVAAcEVgRWAAgEVwRXAA4EWARYABsEWwRbABcEXQRdAB8EXgReAAcEYARgAAkEZARkAAIEZgRmAAIEagRqAA8EqgSqAAMAAgFtAAYABgAHAAsACwAHABAAEAATABEAEQAXABIAEgATACUAJQARACcAJwAFACsAKwAFAC4ALgAcADMAMwAFADUANQAFADcANwAZADgAOAAKADkAOQAGADoAOgANADsAOwAJADwAPAASAD0APQAOAD4APgAUAEUARQAaAEcASQAVAEsASwAVAFEAUgAYAFMAUwAIAFQAVAAYAFUAVQAVAFcAVwAbAFkAWQALAFoAWgACAFwAXAAWAF0AXQACAF4AXgAMAIMAgwAFAJIAkgAFAJMAkwAVAJcAlwAFAJgAmAAVAJoAmgALALEAsQARALIAsgAFALMAswARALoAugAVALwAvAACAMAAwAAYAMcAyAAVAMoAygALANEA0QAKANIA0gAFANMA0wABANUA1QAKANkA2QASANwA3AABAN0A3QAQAOAA4AAPAOsA6wAYAO0A7QAWAO8A8AAYAPEA8QAEAPIA9AAYAPYA9gAVAPcA9wAYAPgA+AADAPkA+gAYAP0A/QAYAP8A/wAYAQIBAgAVAQMBAwAEAQQBBAAYAQcBBwAFAQwBDAARARYBFgAFARcBFwAIARgBGAANARkBGQACARoBGgAFARwBHAAFAR0BHQAVAR4BHgAFASABIAAFASEBIQAVATIBMgAKATUBNQAYATgBOAAFATkBOQAVAToBOgAKAUQBRAAYAUkBSQAYAUsBTAAVAVEBUQABAVUBVQAFAVYBVgAVAWkBagAXAWwBbQAHAW4BbgATAW8BcQAHAXIBcgATAXYBdwATAigCKQAFAisCLAAFAkYCRgAXAkwCUgARAlMCUwAFAl0CYQAFAmICZQAGAmYCZgAOAmcCbQAaAm4CcgAVAncCdwAYAngCfAAIAn0CgAALAoECggACAoMCgwARAoQChAAaAoUChQARAoYChgAaAocChwARAogCiAAaAokCiQAFAooCigAVAosCiwAFAowCjAAVAo0CjQAFAo4CjgAVAo8CjwAFApACkAAVApICkgAVApQClAAVApYClgAVApgCmAAVApoCmgAVApwCnAAVAp0CnQAFAp4CngAVAp8CnwAFAqACoAAVAqECoQAFAqICogAVAqMCowAFAqQCpAAVArICsgAcAr8CvwAYAsECwQAYAsMCxAAYAsUCxQAFAsYCxgAIAscCxwAFAsgCyAAIAskCyQAFAsoCygAIAtEC0QAZAtIC0gAbAtMC0wAZAtQC1AAbAtUC1QAZAtYC1gAbAtcC1wAZAtgC2AAbAtkC2QAZAtoC2gAbAtsC2wAKAt0C3QAKAt8C3wAKAuEC4QAGAuIC4gALAuMC4wAGAuQC5AALAuUC5QAGAuYC5gALAucC5wAGAugC6AALAukC6QAGAuoC6gALAusC6wAGAuwC7AALAu0C7QAJAu8C7wAOAvAC8AACAvEC8QAOAvIC8gAUAvMC8wAMAvQC9AAUAvUC9QAMAvYC9gAUAvcC9wAMAvoC+gAFA1MDUwARA1cDVwAFA1gDWAAOA1sDWwARA14DXgAUA2QDZAAFA2cDZwAOA2gDaAASA2oDagAOA2sDawAVA20DbQAYA28DbwALA3EDcQAIA3MDcwACA3YDdgALA3cDdwAIA3gDeAALA38DfwAcA4IDggAQA4MDgwARA4oDigAFA40DjQAFA44DjgAKA48DjwASA5ADkAAaA5EDkQAVA5IDkgAYA5MDkwAIA5QDlAAYA5UDlQAVA5YDlgACA5cDlwAWA5gDmAAVA5kDmQAYA5oDmgAbA54DngAYA58DnwACA6ADoAAJA6IDogAJA6QDpAAJA6YDpgAOA6cDpwACA6gDqQAHA6wDrAAHA64DrgAYA68DrwARA7ADsAAaA7MDswAVA7QDtAAYA7cDtwANA7gDuAACA7kDuQAVA7oDugAFA70DvQAFA74DvgAVA78DvwAOA8ADwAACA8IDwgASA8MDwwAWA8UDxQARA8YDxgAaA8cDxwARA8gDyAAaA8wDzAAVA84DzwAVA9AD0AASA9ED0QAWA9UD1QAYA9cD1wAYA9gD2AAFA9kD2QAIA9oD2gAFA9sD2wAVA9wD3AAFA90D3QAIA+AD4AAQA+ED4QACA+ID4gAQA+MD4wACA+QD5AAQA+UD5QACA+YD5gAPA+cD5wADA+kD6QAYA+oD6gASA+sD6wAWA+wD7AAVA+0D7QABA+4D7gAEA+8D7wARA/AD8AAaA/ED8QARA/ID8gAaA/MD8wARA/QD9AAaA/UD9QARA/YD9gAaA/cD9wARA/gD+AAaA/kD+QARA/oD+gAaA/sD+wARA/wD/AAaA/0D/QARA/4D/gAaA/8D/wARBAAEAAAaBAEEAQARBAIEAgAaBAMEAwARBAQEBAAaBAUEBQARBAYEBgAaBAgECAAVBAoECgAVBAwEDAAVBA4EDgAVBBAEEAAVBBIEEgAVBBQEFAAVBBYEFgAVBBsEGwAFBBwEHAAIBB0EHQAFBB4EHgAIBB8EHwAFBCAEIAAIBCEEIQAFBCIEIgAIBCMEIwAFBCQEJAAIBCUEJQAFBCYEJgAIBCcEJwAFBCgEKAAIBCkEKQAFBCoEKgAVBCsEKwAFBCwELAAVBC0ELQAFBC4ELgAVBC8ELwAFBDAEMAAIBDEEMQAFBDIEMgAVBDMEMwAGBDQENAALBDUENQAGBDYENgALBDgEOAALBDoEOgALBDwEPAALBD4EPgALBEAEQAALBEEEQQAOBEIEQgACBEMEQwAOBEQERAACBEUERQAOBEYERgACBEoESgAYBEwETAAYBE0ETQAKBE8ETwASBFAEUAAWBFEEUQAPBFIEUgADBFMEUwAPBFQEVAADBFYEVgAYBFcEVwASBFgEWAAWBGMEYwAYBGUEZQAYBGcEZwAYBGgEaAABBGkEaQAEBGoEagAOBHAEcAAXBKoEqgAFAAEAAAAKAgYG8AAEREZMVAAaY3lybABIZ3JlawB2bGF0bgCkAAQAAAAA//8AEgAAAAoAFAAeACgANABBAEsAVQBfAGkAcwB9AIcAkQCbAKUArwAEAAAAAP//ABIAAQALABUAHwApADUAQgBMAFYAYABqAHQAfgCIAJIAnACmALAABAAAAAD//wASAAIADAAWACAAKgA2AEMATQBXAGEAawB1AH8AiQCTAJ0ApwCxACgABkFaRSAAVENSVCAAfk1PTCAAqE5BViAA1FJPTSABAFRVUiABLAAA//8AEwADAA0AFwAhACsAMgA3AEQATgBYAGIAbAB2AIAAigCUAJ4AqACyAAD//wASAAQADgAYACIALAA4AEUATwBZAGMAbQB3AIEAiwCVAJ8AqQCzAAD//wASAAUADwAZACMALQA5AEYAUABaAGQAbgB4AIIAjACWAKAAqgC0AAD//wATAAYAEAAaACQALgA6AD4ARwBRAFsAZQBvAHkAgwCNAJcAoQCrALUAAP//ABMABwARABsAJQAvADsAPwBIAFIAXABmAHAAegCEAI4AmACiAKwAtgAA//8AEwAIABIAHAAmADAAPABAAEkAUwBdAGcAcQB7AIUAjwCZAKMArQC3AAD//wATAAkAEwAdACcAMQAzAD0ASgBUAF4AaAByAHwAhgCQAJoApACuALgAuWMyc2MEWGMyc2MEWGMyc2MEWGMyc2MEWGMyc2MEWGMyc2MEWGMyc2MEWGMyc2MEWGMyc2MEWGMyc2MEWGNjbXAEXmNjbXAEXmNjbXAEXmNjbXAEXmNjbXAEXmNjbXAEXmNjbXAEXmNjbXAEXmNjbXAEXmNjbXAEXmRsaWcEZmRsaWcEZmRsaWcEZmRsaWcEZmRsaWcEZmRsaWcEZmRsaWcEZmRsaWcEZmRsaWcEZmRsaWcEZmRub20EbGRub20EbGRub20EbGRub20EbGRub20EbGRub20EbGRub20EbGRub20EbGRub20EbGRub20EbGZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmxpZ2EEfGxpZ2EEhGxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxvY2wEkGxvY2wElmxvY2wEnG51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqHBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5AAAAAEAAAAAAAIAAgADAAAAAQAHAAAAAQAYAAAAAwAVABYAFwAAAAIACAAJAAAAAQAJAAAAAQAUAAAAAQAEAAAAAQAGAAAAAQAFAAAAAQAZAAAAAQARAAAAAQATAAAAAQABAAAAAQAKAAAAAQALAAAAAQAMAAAAAQANAAAAAQAOAAAAAQAPAAAAAQAQAAAAAQASABsAOAPGBrQHYA3wDfAOBg4oDl4OhA6yDsYO2g7uDwAPGg9cD3oPmA/KD/wQLhBCEHoQbBB6EKYAAQAAAAEACAACAcQA3wHnAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHoAekCRAI7AeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QH+AgACAQTdAgICAwIEAgUCBgIHAggCCQIKAgsCLwIPAhACEQIUAhUCFgIXAhgCGQIbAhwCHgIdAvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRgNFA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSBKsErAStBK4ErwSwBLEEsgSzBLQEtQS2BLcEuAS5BLoEuwS8BL0EvgS/BMAEwQTCBMMExATFBMYB/wTHBMgEyQTKBMsEzATNBM4EzwTQBNEE0gTTBNQE1QTWBNgE2QTbAhoE3AIOBNcCEwINBNoCDAISAAEA3wAIACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgBlAGcAhQCSALAAsQCyALMAtAC1ALYAtwC4ALkA0QDSANMA1ADVANYA1wDYANkA2gDbANwA3QDeAN8A4ADhAOIA4wDkAOUA5gDnAOgBLAEwATIBOAE6ATwBPgE/AUUBRgF/AYUBigGNAkcCSAJKAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAoMChQKHAokCiwKNAo8CkQKTApUClwKZApsCnQKfAqECowKlAqcCqQKrAq0CrwKyArQCtgK4AroCvAK+AsACwgLFAscCyQLLAs0CzwLRAtMC1QLZAtsC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvIC9AL2A1MDVANVA1YDVwNYA1kDWwNcA10DXgNfA2ADYQNiA2QDZQNmA2cDaANpA2oDegN7A3wDfQN+A38DgAOBA4IDgwOEA4UDhgOHA4gDiQOKA4sDjAONA44DjwO7A70DvwPUA9oD4ARJBEsETwRXBFkEXgRqAAEAAAABAAgAAgF0ALcBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAv0DMAI7AfoEygTLAfsB/AH9Af4B/wIABM4EzwTRBNQE3QICAgMCBAIFAgYCBwIIAgkCCgILAfQB9QH2AfcB+AH5Ai8CDwIQAhECFAIVAhcCGQL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZA08DGgMbAxwDHQMeAx8DIAMhAyIDIwMkAyUDJgMnAygDKQMqAysDLAMtAy4DLwMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRgNFA0cDSANJA0oDSwNMA00DTgNQA1EDUgTJBMwEzQTQBNIE0wIBBNUEwQTCBMMExATFBMYExwTIBNYE2ATZAhgE2wIaBNwC/AIOBNcCEwINBNoCFgIMAhIAAQC3AEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgCHAIwAkwDpAOoA6wDsAO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+AP8BAAEBAQIBAwEEAQUBBgEtATEBMwE5ATsBPQFAAUcCSwJnAmgCaQJqAmsCbAJtAm4CbwJwAnECcgJzAnQCdQJ2AncCeAJ5AnoCewJ8An0CfgJ/AoACgQKCAoQChgKIAooCjAKOApACkgKUApYCmAKaApwCngKgAqICpAKmAqgCqgKsAq4CswK1ArcCuQK7Ar0CvwLBAsMCxgLIAsoCzALOAtAC0gLUAtYC2gLcAt4C4ALiAuQC5gLoAuoC7ALuAvAC8wL1AvcDkAORA5IDkwOUA5UDlgOXA5gDmQOaA5sDnAOdA54DnwO8A74DwAPOA9UD2wPhBEcESgRMBFAEWARaBFsEXwRrAAYAAAAGABIAKgBCAFoAcgCKAAMAAAABABIAAQCQAAEAAAAaAAEAAQBNAAMAAAABABIAAQB4AAEAAAAaAAEAAQBOAAMAAAABABIAAQBgAAEAAAAaAAEAAQKuAAMAAAABABIAAQBIAAEAAAAaAAEAAQObAAMAAAABABIAAQAwAAEAAAAaAAEAAQOdAAMAAAABABIAAQAYAAEAAAAaAAEAAQQaAAIAAQCnAKsAAAAEAAAAAQAIAAEGHgA2AHIApACuALgAygD8AQ4BGAFKAWQBfgGQAboB7AH2AhgCMgJEAnYCiAKiAswC3gMQAxoDJAM2A2gDcgN8A4YDoAO6A8wD9gQoBDIEVARuBIAEsgTEBN4FCAUaBSQFLgU4BUIFbAWWBcAF6gYUAAYADgAUABoAIAAmACwCTAACAKcCTQACAKgCTwACAKkD8QACAKoEewACAKsD7wACAKwAAQAEBIgAAgCsAAEABAKJAAIAqAACAAYADASKAAIArASMAAIBogAGAA4AFAAaACAAJgAsAlQAAgCnAlUAAgCoBAsAAgCpBAkAAgCqBH0AAgCrBAcAAgCsAAIABgAMBHcAAgCoAqMAAgGiAAEABASOAAIArAAGAA4AFAAaACAAJgAsAlgAAgCnAlkAAgCoAqcAAgCpBBcAAgCqBH8AAgCrBBkAAgCsAAMACAAOABQEkAACAKgEkgACAKwCtAACAaIAAwAIAA4AFAK2AAIAqASUAAIArAK4AAIBogACAAYADAOtAAIAqASWAAIArAAFAAwAEgAYAB4AJAR5AAIApwK+AAIAqAJcAAIAqQSYAAIArALAAAIBogAGAA4AFAAaACAAJgAsAl0AAgCnAl4AAgCoAmAAAgCpBB0AAgCqBIEAAgCrBBsAAgCsAAEABASaAAIAqAAEAAoAEAAWABwCywACAKgEgwACAKsEnAACAKwCzQACAaIAAwAIAA4AFALRAAIAqASeAAIArALXAAIBogACAAYADASgAAIArALbAAIBogAGAA4AFAAaACAAJgAsAmIAAgCnAmMAAgCoAuEAAgCpBDUAAgCqBIUAAgCrBDMAAgCsAAIABgAMBKIAAgCpBKQAAgCsAAMACAAOABQDoAACAKcDogACAKgEpgACAKwABQAMABIAGAAeACQDpgACAKcCZgACAKgERQACAKkEQwACAKoEQQACAKwAAgAGAAwC8gACAKgEqAACAKwABgAOABQAGgAgACYALAJnAAIApwJoAAIAqAJqAAIAqQPyAAIAqgR8AAIAqwPwAAIArAABAAQEiQACAKwAAQAEAooAAgCoAAIABgAMBIsAAgCsBI0AAgGiAAYADgAUABoAIAAmACwCbwACAKcCcAACAKgEDAACAKkECgACAKoEfgACAKsECAACAKwAAQAEBHgAAgCoAAEABASPAAIArAABAAQEGgACAKwAAwAIAA4AFASRAAIAqASTAAIArAK1AAIBogADAAgADgAUArcAAgCoBJUAAgCsArkAAgGiAAIABgAMA64AAgCoBJcAAgCsAAUADAASABgAHgAkBHoAAgCnAr8AAgCoAncAAgCpBJkAAgCsAsEAAgGiAAYADgAUABoAIAAmACwCeAACAKcCeQACAKgCewACAKkEHgACAKoEggACAKsEHAACAKwAAQAEBJsAAgCoAAQACgAQABYAHALMAAIAqASEAAIAqwSdAAIArALOAAIBogADAAgADgAUAtIAAgCoBJ8AAgCsAtgAAgGiAAIABgAMBKEAAgCsAtwAAgGiAAYADgAUABoAIAAmACwCfQACAKcCfgACAKgC4gACAKkENgACAKoEhgACAKsENAACAKwAAgAGAAwEowACAKkEpQACAKwAAwAIAA4AFAOhAAIApwOjAAIAqASnAAIArAAFAAwAEgAYAB4AJAOnAAIApwKBAAIAqARGAAIAqQREAAIAqgRCAAIArAACAAYADALzAAIAqASpAAIArAABAAQC+AACAKgAAQAEAvoAAgCoAAEABAL5AAIAqAABAAQC+wACAKgABQAMABIAGAAeACQCcwACAKcCdAACAKgCqAACAKkEGAACAKoEgAACAKsABQAMABIAGAAeACQEKwACAKcEKQACAKgELwACAKkELQACAKoEMQACAKwABQAMABIAGAAeACQELAACAKcEKgACAKgEMAACAKkELgACAKoEMgACAKwABQAMABIAGAAeACQEOQACAKcENwACAKgEPQACAKkEOwACAKoEPwACAKwABQAMABIAGAAeACQEOgACAKcEOAACAKgEPgACAKkEPAACAKoEQAACAKwAAQAEBIcAAgCoAAIAEQAlACkAAAArAC0ABQAvADQACAA2ADsADgA9AD4AFABFAEkAFgBLAE0AGwBPAFQAHgBWAFsAJABdAF4AKgCBAIEALACDAIMALQCGAIYALgCJAIkALwCMAIwAMACXAJoAMQDPAM8ANQABAAAAAQAIAAEABgACAAEAAgLVAtYAAQAAAAEACAACAA4ABATeBN8E4AThAAEABAKHAogCmQKaAAQAAAABAAgAAQAmAAIACgAcAAIABgAMAaMAAgBKAagAAgBYAAEABAGpAAIAWAABAAIASgBXAAQAAAABAAgAAQBEAAIACgAUAAEABAGkAAIATQABAAQBpgACAE0ABAAAAAEACAABAB4AAgAKABQAAQAEAaUAAgBQAAEABAGnAAIAUAABAAIASgGjAAEAAAABAAgAAQAGAZUAAQABAEsAAQAAAAEACAABAAYBJwABAAEAugABAAAAAQAIAAEABgGsAAEAAQA2AAEAAAABAAgAAgAcAAIB4wHkAAEAAAABAAgAAgAKAAIB5QHmAAEAAgAvAE8AAQAAAAEACAACAB4ADAIoAioCKQIrAiwCHwIgAiECIgGuAiQCJQABAAwAJwAoACsAMwA1AEYARwBIAEsAUwBUAFUAAQAAAAEACAACAAwAAwImAicCJwABAAMASQBLAiIAAQAAAAEACAACAGYACAI9Ai0CLgIwAjECOQI6AjwAAQAAAAEACAACABYACAAbABUAFgAXABgAGQAdABQAAQAIAa0CIwRxBHIEcwR0BHUEdgABAAAAAQAIAAIAFgAIBHYCIwRxBHIEcwR0Aa0EdQABAAgAFAAVABYAFwAYABkAGwAdAAEAAAABAAgAAgAWAAgAFQAWABcAGAAZABsAHQAUAAEACAItAi4CMAIxAjkCOgI8Aj0AAQAAAAEACAABAAYBaQABAAEAEwAGAAAAAQAIAAMAAQASAAEAUgAAAAEAAAAaAAIAAgF8AXwAAAHUAd0AAQABAAAAAQAIAAEAKAHAAAEAAAABAAgAAgAaAAoCMgB6AHMAdAIzAjQCNQI2AjcCOAACAAEAFAAdAAAAAQAAAAEACAACACYAEAHUAdUB1gHXAdgB2QHaAdsB3AHdAkACPgJBAkICPwJDAAEAEAAUABUAFgAXABgAGQAaABsAHAAdAE0ATgKuA5sDnQQa",
59640   "Roboto-Medium.ttf": "AAEAAAARAQAABAAQR1BPU32qcYwAAgioAABZDEdTVUJMnCjgAAJhtAAAGWhPUy8yoQuxtgAAAZgAAABgY21hcEAmSHIAABpsAAASyGN2dCAElytKAAAvvAAAAFZmcGdte/lhqwAALTQAAAG8Z2FzcAAIABMAAgicAAAADGdseWaunmLpAAA53AABy8xoZG14PT88IAAAFYAAAATsaGVhZPh7qwgAAAEcAAAANmhoZWEK7wqbAAABVAAAACRobXR4JPNE9QAAAfgAABOIbG9jYd3eZq0AADAUAAAJxm1heHAHEgL1AAABeAAAACBuYW1lPWNvTAACBagAAALUcG9zdP9tAGQAAgh8AAAAIHByZXAbsfg2AAAu8AAAAMwAAQAAAAIAABFApG1fDzz1ABsIAAAAAADE8BEuAAAAANDbTpT6JP3VCVwIcwAAAAkAAgAAAAAAAAABAAAHbP4MAAAJa/ok/kEJXAABAAAAAAAAAAAAAAAAAAAE4gABAAAE4gCPABYATgAFAAEAAAAAAA4AAAIAAhYABgABAAMElQH0AAUAAAWaBTMAAAEfBZoFMwAAA9EAZgIAAAACAAAAAAAAAAAA4AAK/1AAIX8AAAAhAAAAAEdPT0cAQAAA//0GAP4AAGYHmgIAIAABnwAAAAAEOgWwACAAIAACA4wAZAAAAAAAAAAAAf4AAAH+AAACJQCPApgAZQTiAGAEjABkBeAAYwUdAFYBWgBSAsoAgALSACgDiQAbBHUARAHCABwCoABHAjwAhwMqAAIEjABpBIwAqASMAFEEjABPBIwANASMAIEEjAB1BIwARQSMAGgEjABdAh8AggHnAC4EEQA/BHoAkQQqAIAD5AA8BygAWwVTABIFDACUBTkAZgU6AJQEhgCUBGUAlAVyAGoFrwCUAkIAowRxAC0FCwCUBFQAlAcBAJQFrgCUBYYAZgUdAJQFhgBgBP4AlATUAEoE2wAtBTcAfQUtABIHCgAwBRAAKQTgAAcE0QBQAjEAhANYABQCMQAMA2sANQOcAAMClAAxBFQAWgSBAHwEMABPBIQATwRLAFMC1gAtBIkAUgRxAHkCCwB9AgH/tQQtAH0CCwCMBvYAfARzAHkEjgBPBIEAfASLAE8C0AB8BCEASwKpAAgEcgB3A/UAFgXyACEEBgAfA+UADAQGAFICrwA4AgIArgKvABsFUQB1Ah4AhgR9AGQEtQBeBZ0AXQTgABkB/ACIBPgAWgOFAF0GRABXA5EAjQPiAFcEbQB/BkQAVwPbAIcDCgB/BEoAXwL2ADwC9gA3ApsAcAS7AJID7QBFAkIAjgIQAG0C9gCAA6cAdwPiAF0F0ABZBisAUAZXAGcD5ABCB4X/9gREAE0FhABpBMoAlATnAIgGwQBIBKcAZwSRAEMEiABPBJcAggWwAB8CGgCPBJgAjgRkACICTwAhBZMAkASIAH4HtABkBzoAWwIMAIsFiABRAtD/5AWKAFgEngBPBaQAfQTyAHcCJv+1BDwAWQPmAJQDsAByA9wAhwN8AHUCCwCBArIAeAJNACkD2AB6Ax8ASQJsAIIAAPyOAAD9XgAA/HMAAP0+AAD8DAAA/RwCXQDGBDwAZwJCAI4EdQCbBb8AGQV6AFsFOAAgBJAAbAWxAJsEkABHBe8ASgWqAEQFWwBrBIQAVgTGAJYEDgAgBIgAVARgAGAEGgBhBIgAfgShAHMCqgCpBGoAFgQTAGQE8wAtBIgAgAQ3AFIEkABSBC0APwRgAIAF0ABEBckATwaUAGYEswB2BHv/4QZxADMF/gAiBVkAaAiIAC0IjwCbBlsAMQWqAJIFCACQBgYAJAeiABYE1gBJBagAlAWpAC0FCgA5Bl8ATwX5AJIFiQCOB5sAmAf5AJgGGgAYBvkAmwUHAJAFUABrB1QAoAT3ACAEfQBbBI8AjwNaAIUE9gAnBnYAHgQWAE0EmACGBG4AjwSaACEGAwCPBJcAhgSYAIYD9QAjBdMAVATTAIYEZgBfBo4AhgbsAH4FFwAfBm8AjwRoAI8EPABRBoQAkQRwACcEcf/bBDwAVAbRAB4G5ACGBIn/7gSYAIYHSQCIBk8AcARn/+AHKACYBgEAhgUMABwEYAAKB0IArAY2AJ0G7QCABeYAggkyAKMH+QCPBCAAKAPwADMFegBfBIgATwUaABAEDgAgBXoAXwSIAE8HRQCIBkQAdAdJAIgGTwBwBRoAZgRKAFwE/wBtAAD8ZgAA/HMAAP17AAD9pQAA+iQAAPpNBGf/4AUTAJQEhgB8BGoAjwOhAH4EtwCbBCAAfgUsAJAEqwCOBpUANAWkAD0H0ACUBaoAfghHAJsG9QB+BioAZwT/AGEHMQAtBXAAJgV0AIAEcwB0BYcAhQYkABYEw//LBSEAkAR4AI4FrwCbBIgAfgWIAFEEpgBbBKYAXQTHADQDUwAtBQcAUgbxAGgG3QBeBlMAPAUoAC8EewBIBD4AdAe+AEIGnQBAB/0AlAaeAHcFBABdBCwAVQWqACEFHQBEBVUAgQMsAGcEFAAACCkAAAQUAAAIKQAAArkAAAIKAAABXAAABH8AAAIwAAABogAAANEAAAAAAAACoQBHAqEARwUpAJ0GMACBA50ABAHAAGMBvAAzAc4AMgGoAEoDFABsAxsAQAMIADIEXQBABJkAXALLAIgD+gCKBaYAigFsAEcHpwBKAnIAbAJpAFQDnAAtAvYANQNcAGkEtQBfBnAAIQa4AJgIkwCUB4gANQaMAHwEjABeBfUAIQQ0ACgEogAhBV4ATwV9ACgF5ABwA+IATAguAJAFCQBtBRQAlgY1AFkG3QBUBtEAWwaiAFgEkQBiBZYApgTZAEAEgwCeBLIAOwhFAF4CLf+vBI4AZQR6AJEEEQA8BCoAgAQMACQCWwChApgAYwHxAEUFGwAtBKgAGAS8AC0HIwAtByMALQURAC0GtwBLAAAAAAgwAFkINQBcBDMAOgSTAE8CEP+wAbMAXAOhAHUDoQB1A6EAdQQLAHUECwB1BAv/TAQLAHoDoQB1AgUAlASeAAkEYAB2BIAATwR6AHYD4AB2A8UAdgSmAFQE3gB2AfwAhQPVACQEWwB2A7kAdgYGAHYE3QB2BMAATwRtAHYEwABMBFwAdgQ0AD4EOwAkBIQAZwR7AAkGBwAoBF4AFQQ8AAUEKgBBAvYASwL2AIAC9gA8AvYANwL2ADUC9gBPAvYATQL2ADYC9gBLAvYARgO5AJACsgCWBDsACgS7AFYFRACbBSgAmwQwAIEFOQCbBC0AgQQ0AD4EZgA4BE0ADgO5AHYEewAJBMAATwR7AAkDmABCBNgAdgQZAEQFnQBQBVQAUATkAF8FkQAkBIAATwdUACQHVwB2BZcAJATXAHYEcQB2BVkAJwY6ABoERgBCBOQAdgRcAHYEywAkBEYAHwVdAHYEjABBBoQAdgcKAHYFWgAKBiAAdgRnAHYEgAA8BpIAdgSIAEMEIgAKBpIAGgSdAHYFGgB2BW4AJAXwAE8EWgAFBMQAFQaVACQEjABBBIwAdgX+AAoE0gBPBEYAQgTAAE8EZgA4A/cARgg2AHYE6wAoBIgAfAQ9AFAEmABPA6QAWwShAEwElAB8BJ8ATwRLAFMEiQBRBXoAawWiAGsFhgCbBeAAawXiAGsEGwCXBIIAbgO5AHYEVwAPBL4ANQL2AEsC9gA1AvYATwL2AE0C9gA2AvYASwL2AEYEawBmBC4AQwaYAE8EtABzBOsAYgIm/7UCJv+1AhsAjwIb//sCGwCPBGAAdgH+AAACoABHBVj/9wVY//cEj//UBNsALQKp/+gFUwASBVMAEgVTABIFUwASBVMAEgVTABIFUwASBTkAZgSGAJQEhgCUBIYAlASGAJQCQv/IAkIAowJC/8sCQv+/Ba4AlAWGAGYFhgBmBYYAZgWGAGYFhgBmBTcAfQU3AH0FNwB9BTcAfQTgAAcEVABaBFQAWgRUAFoEVABaBFQAWgRUAFoEVABaBDAATwRLAFMESwBTBEsAUwRLAFMCGv+0AhoAjwIa/7cCGv+rBHMAeQSOAE8EjgBPBI4ATwSOAE8EjgBPBHIAdwRyAHcEcgB3BHIAdwPlAAwD5QAMBVMAEgRUAFoFUwASBFQAWgVTABIEVABaBTkAZgQwAE8FOQBmBDAATwU5AGYEMABPBTkAZgQwAE8FOgCUBRoATwSGAJQESwBTBIYAlARLAFMEhgCUBEsAUwSGAJQESwBTBIYAlARLAFMFcgBqBIkAUgVyAGoEiQBSBXIAagSJAFIFcgBqBIkAUgWvAJQEcQB5AkL/swIa/58CQv+5Ahr/pQJC/98CGv/LAkIAFwILAAACQgCdBrMAowQMAH0EcQAtAib/tQULAJQELQB9BFQAlAILAIoEVACUAgsAVQRUAJQCoQCMBFQAlALnAIwFrgCUBHMAeQWuAJQEcwB5Ba4AlARzAHkEc/+lBYYAZgSOAE8FhgBmBI4ATwWGAGYEjgBPBP4AlALQAHwE/gCUAtAATwT+AJQC0AA4BNQASgQhAEsE1ABKBCEASwTUAEoEIQBLBNQASgQhAEsE1ABKBCEASwTbAC0CqQAIBNsALQKpAAgE2wAtAtEACAU3AH0EcgB3BTcAfQRyAHcFNwB9BHIAdwU3AH0EcgB3BTcAfQRyAHcFNwB9BHIAdwcKADAF8gAhBOAABwPlAAwE4AAHBNEAUAQGAFIE0QBQBAYAUgTRAFAEBgBSB4X/9gbBAEgFhABpBIgATwR6/6YEev+mBDsAJASeAAkEngAJBJ4ACQSeAAkEngAJBJ4ACQSeAAkEgABPA+AAdgPgAHYD4AB2A+AAdgH8/6YB/ACDAfz/qQH8/50E3QB2BMAATwTAAE8EwABPBMAATwTAAE8EhABnBIQAZwSEAGcEhABnBDwABQSeAAkEngAJBJ4ACQSAAE8EgABPBIAATwSAAE8EegBqA+AAdgPgAHYD4AB2A+AAdgPgAHYEpgBUBKYAVASmAFQEpgBUBN4AdgH8/5EB/P+XAfz/vQH8ABUB/AB8A9UAJARbAHYDuQB2A7kAdgO5AHYDuQB2BN0AdgTdAHYE3QB2BMAATwTAAE8EwABPBFwAdgRcAHYEXAB2BDQAPgQ0AD4ENAA+BDQAPgQ7ACQEOwAkBDsAJASEAGcEhABnBIQAZwSEAGcEhABnBIQAZwYHACgEPAAFBDwABQQqAEEEKgBBBCoAQQVTABIE6v9KBhP/UwKm/1YFmv+nBUT+4QVv/7ICqv+HBVMAEgUMAJQEhgCUBNEAUAWvAJQCQgCjBQsAlAcBAJQFrgCUBYYAZgUdAJQE2wAtBOAABwUQACkCQv+/BOAABwSEAFYEYABgBIgAfgKqAKkEYACABJgAjgSOAE8EuwCSA/UAFgQGAB8Cqv/MBGAAgASOAE8EYACABpQAZgSGAJQEdQCbBNQASgJCAKMCQv+/BHEALQUoAJsFCwCUBQoAOQVTABIFDACUBHUAmwSGAJQFqACUBwEAlAWvAJQFhgBmBbEAmwUdAJQFOQBmBNsALQUQACkEVABaBEsAUwSYAIYEjgBPBIEAfAQwAE8D5QAMBAYAHwRLAFMDWgCFBCEASwILAH0CGv+rAgH/tQRuAI8D5QAMBwoAMAXyACEHCgAwBfIAIQcKADAF8gAhBOAABwPlAAwBWgBSApgAZQRKAI8CJv+xAbwAMwcBAJQG9gB8BVMAEgRUAFoEhgCUBagAlARLAFMEmACGBaoARAXJAE8FGgAQBA7/8QhzAE8JawBmBNYASQQWAE0FOQBmBDAATwTgAAcEDgAgAkIAoweiABYGdgAeAkIAowVTABIEVABaBVMAEgRUAFoHhf/2BsEASASGAJQESwBTBYgAUQQ8AFkEPABZB6IAFgZ2AB4E1gBJBBYATQWoAJQEmACGBagAlASYAIYFhgBmBI4ATwV6AF8EiABPBXoAXwSIAE8FUABrBDwAUQUKADkD5QAMBQoAOQPlAAwFCgA5A+UADAWJAI4EZgBfBvkAmwZvAI8FEAApBAYAHwSEAE8FqQAtBJoAIQVTABIEVABaBVMAEgRUAFoFUwASBFQAWgVTABAEVP+aBVMAEgRUAFoFUwASBFQAWgVTABIEVABaBVMAEgRUAFoFUwASBFQAWgVTABIEVABaBVMAEgRUAFoFUwASBFQAWgSGAJQESwBTBIYAlARLAFMEhgCUBEsAUwSGAJQESwBTBIb/1QRL/44EhgCUBEsAUwSGAJQESwBTBIYAlARLAFMCQgCjAhoAjwJCAJQCCwB4BYYAZgSOAE8FhgBmBI4ATwWGAGYEjgBPBYYAJwSO/6MFhgBmBI4ATwWGAGYEjgBPBYYAZgSOAE8FigBYBJ4ATwWKAFgEngBPBYoAWASeAE8FigBYBJ4ATwWKAFgEngBPBTcAfQRyAHcFNwB9BHIAdwWkAH0E8gB3BaQAfQTyAHcFpAB9BPIAdwWkAH0E8gB3BaQAfQTyAHcE4AAHA+UADATgAAcD5QAMBOAABwPlAAwEogBPBKIATwUoAJsEbgCPBa8AlASXAIYE2wAtA/UAIwUQACkEBgAfBYkAjgRmAF8FiQCOBGYAXwR1AJsDWgCFB6IAFgZ2AB4GJAAWBMP/ywRxAHkFB//QBQf/0AR1//ADWv/iBTz/4wRE/64FqACUBJgAhgWvAJQElwCGBwEAlAYDAI8FqQAtBJoAIQTgAAcEDgAgBRAAKQQGAB8EYABgBGUAAgYwAIEEjABRBIwATwSMADQEjACBBKAAXQS0AH0FcgBqBIkAUgWuAJQEcwB5BVMAEgRUAA0EhgBIBEsAAQJC/vYCGv7iBYYAZgSOABYE/gAyAtD/bgU3AHEEcgAPBN/+rAUMAJQEgQB8BToAlASEAE8FOgCUBIQATwWvAJQEcQB5BQsAlAQtAH0FCwCUBC0AfQRUAJQCCwB4BwEAlAb2AHwFrgCUBHMAeQUdAJQEgQB8BP4AlALQAHIE1ABKBCEASwTbAC0CqQAIBS0AEgP1ABYFLQASA/UAFgcKADAF8gAhBNEAUAQGAFIFzP4cBJ4ACQQc/yoFGv83Ajj/OQTK/5MEeP7oBO7/pASeAAkEYAB2A+AAdgQqAEEE3gB2AfwAhQRbAHYGBgB2BMAATwRtAHYEOwAkBDwABQReABUB/P+dBDwABQPgAHYDuQB2BDQAPgH8AIUB/P+dA9UAJARbAHYERgAfBJ4ACQRgAHYDuQB2A+AAdgTkAHYGBgB2BN4AdgTAAE8E2AB2BG0AdgSAAE8EOwAkBF4AFQRGAEIE3gB2BIAATwQ8AAUF/gAKBOQAdgRGAB8FnQBQBVMAEgRUAFoEhgCUBEsAUwIaAHgAAAABAAAE5AkLBAAAAgICAwYFBwYCAwMEBQIDAwQFBQUFBQUFBQUFAgIFBQUECAYGBgYFBQYGAwUGBQgGBgYGBgUFBgYIBgUFAgQCBAQDBQUFBQUDBQUCAgUCCAUFBQUDBQMFBAcFBAUDAgMGAgUFBgUCBgQHBAQFBwQDBQMDAwUEAwIDBAQHBwcECAUGBQYIBQUFBQYCBQUDBgUJCAIGAwYFBgYCBQQEBAQCAwMEBAMAAAAAAAADBQMFBgYGBQYFBwYGBQUFBQUFBQUDBQUGBQUFBQUHBwcFBQcHBgoKBwYGBwkFBgYGBwcGCQkHCAYGCAYFBQQGBwUFBQUHBQUEBwUFBwgGBwUFBwUFBQgIBQUIBwUIBwYFCAcIBwoJBQQGBQYFBgUIBwgHBgUGAAAAAAAABQYFBQQFBQYFBwYJBgkIBwYIBgYFBgcFBgUGBQYFBQUEBggIBwYFBQkHCQcGBQYGBgQFCQUJAwICBQICAQADAwYHBAICAgIDBAMFBQMEBgIJAwMEAwQFBwgKCAcFBwUFBgYHBAkGBgcICAcFBgUFBQkCBQUFBQUDAwIGBQUICAYIAAkJBQUCAgQEBAUFBQUEAgUFBQUEBAUFAgQFBAcFBQUFBQUFBQUHBQUFAwMDAwMDAwMDAwQDBQUGBgUGBQUFBQQFBQUEBQUGBgYGBQgIBgUFBgcFBgUFBQYFBwgGBwUFBwUFBwUGBgcFBQcFBQcFBQUFBAkGBQUFBAUFBQUFBgYGBwcFBQQFBQMDAwMDAwMFBQcFBgICAgICBQIDBgYFBQMGBgYGBgYGBgUFBQUDAwMDBgYGBgYGBgYGBgUFBQUFBQUFBQUFBQUCAgICBQUFBQUFBQUFBQQEBgUGBQYFBgUGBQYFBgUGBgUFBQUFBQUFBQUGBQYFBgUGBQYFAwIDAgMCAwIDCAUFAgYFBQIFAgUDBQMGBQYFBgUFBgUGBQYFBgMGAwYDBQUFBQUFBQUFBQUDBQMFAwYFBgUGBQYFBgUGBQgHBQQFBQUFBQUFCAgGBQUFBQUFBQUFBQUFBAQEBAICAgIFBQUF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AAADfwAABBsAAAQbAAAA3AAABBwAAAQiAAADhwAABCMAAAQkAAAA3QAABCUAAAQlAAADjgAABCYAAAQvAAAA3wAABDAAAAQwAAADjwAABDEAAAQ0AAAA6QAABDUAAAQ1AAADkAAABDYAAAQ4AAAA7QAABDkAAAQ5AAADkQAABDoAAAQ9AAAA8AAABD4AAAQ+AAADkgAABD8AAAQ/AAAA9AAABEAAAARBAAADkwAABEIAAARCAAAA9QAABEMAAARDAAADlQAABEQAAAREAAAA9gAABEUAAARFAAADlgAABEYAAARPAAAA9wAABFAAAARQAAADsgAABFEAAARRAAADlwAABFIAAARSAAABAQAABFMAAARTAAADmAAABFQAAARUAAABAgAABFUAAARYAAADmQAABFkAAARbAAABAwAABFwAAARcAAADnQAABF0AAARdAAADswAABF4AAAReAAADngAABF8AAARhAAABBgAABGIAAARiAAAEXAAABGMAAARvAAABCQAABHAAAARxAAADtAAABHIAAAR1AAABFgAABHYAAAR3AAADtgAABHgAAAR4AAADuQAABHkAAAR5AAADuAAABHoAAASGAAABGgAABIgAAASJAAABJwAABIoAAASLAAAEYQAABIwAAASMAAAEWwAABI0AAASRAAABKQAABJIAAASTAAAEXQAABJQAAASVAAABLgAABJYAAASXAAAEVgAABJgAAASZAAADugAABJoAAASbAAAESAAABJwAAASdAAABMAAABJ4AAASfAAAEXwAABKAAAAShAAABMgAABKIAAASjAAAESgAABKQAAASpAAABNAAABKoAAASrAAADvAAABKwAAAStAAAETAAABK4AAASvAAADvgAABLAAAASxAAAEaQAABLIAAASzAAAETgAABLQAAAS1AAABOgAABLYAAAS3AAAEUAAABLgAAAS6AAABPAAABLsAAAS7AAAEWgAABLwAAAS9AAABPwAABL4AAAS/AAAEWAAABMAAAATCAAADwAAABMMAAATEAAABQQAABMUAAATGAAAEZwAABMcAAATIAAABQwAABMkAAATKAAAEYwAABMsAAATMAAAEUgAABM0AAATOAAAEZQAABM8AAATXAAADwwAABNgAAATYAAABRQAABNkAAATZAAADzQAABNoAAATaAAADzAAABNsAAATfAAADzgAABOAAAAThAAABRgAABOIAAAT1AAAD0wAABPYAAAT3AAAEVAAABPgAAAT5AAAD5wAABPoAAAT7AAABSAAABPwAAAT9AAAD6QAABP4AAAT/AAAEawAABQAAAAUAAAABSgAABQEAAAUBAAAD6wAABQIAAAUQAAABSwAABREAAAURAAAEbQAABRIAAAUTAAAD7AAAHgAAAB4BAAADrgAAHj4AAB4/AAADrAAAHoAAAB6FAAADnwAAHqAAAB7xAAAD7gAAHvIAAB7zAAADpQAAHvQAAB75AAAEQAAAH00AAB9NAAAEqQAAIAAAACALAAABWwAAIBAAACARAAABZwAAIBMAACAUAAABaQAAIBUAACAVAAAEbwAAIBcAACAeAAABawAAICAAACAiAAABcwAAICUAACAnAAABdgAAIDAAACAwAAABeQAAIDIAACAzAAADpwAAIDkAACA6AAABegAAIDwAACA8AAADqQAAIEQAACBEAAABfAAAIHQAACB0AAABfQAAIH8AACB/AAABfgAAIKMAACCjAAAEbgAAIKQAACCkAAABfwAAIKYAACCqAAABgAAAIKsAACCrAAAERwAAIKwAACCsAAABhQAAILEAACCxAAABhgAAILkAACC6AAABhwAAILwAACC9AAABiQAAIQUAACEFAAABiwAAIRMAACETAAABjAAAIRYAACEWAAABjQAAISIAACEiAAABjgAAISYAACEmAAAAuQAAIS4AACEuAAABjwAAIVsAACFeAAABkAAAIgIAACICAAABlAAAIgYAACIGAAAAsQAAIg8AACIPAAABlQAAIhEAACISAAABlgAAIhoAACIaAAABmAAAIh4AACIeAAABmQAAIisAACIrAAABmgAAIkgAACJIAAABmwAAImAAACJgAAABnAAAImQAACJlAAABnQAAJcoAACXKAAABnwAA7gEAAO4CAAABoAAA9sMAAPbDAAABogAA+wEAAPsEAAABpAAA/v8AAP7/AAABqgAA//wAAP/9AAABq7AALEuwCVBYsQEBjlm4Af+FsIQdsQkDX14tsAEsICBFaUSwAWAtsAIssAEqIS2wAywgRrADJUZSWCNZIIogiklkiiBGIGhhZLAEJUYgaGFkUlgjZYpZLyCwAFNYaSCwAFRYIbBAWRtpILAAVFghsEBlWVk6LbAELCBGsAQlRlJY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seix/7IWsi6yRbJcsnOyi7KdsrSyy7LisvmzEbMoszqzUbNps4Czl7Ops7+z1bPstAS0ELQctDO0RbRbtHK0iLSetLW0zbTetPW1B7UdtS61RrVdtW+1hbWcta61xbXcte22BLYbtoW3J7c5t0u3Yrd4t4+3pre4t8m327fruAK4E7gquEC4V7huuNu5crmJuZq5sbnHud659LoLuiK6LrpAule6abqAupK6qbrAute67rr5uwS7G7snuzO7Srthu227ebuQu6e7s7u/u9S76bv1vAG8GLwqvDa8QrxZvGq8f7yWvKe8vrzVvO29Bb0XvSm9Nb1BvVO9ZL12vYi9n721vcG9zb3ZveW9974IvhS+IL4svji+T75bvnK+iL6avrC+x77evvG/BL8cvy+/jb/vwAbAHcA0wErAYsB5wJDAp8C+wNDA4cD4wQrBIcE4wWjBmMGowb/B1sHswf3CFcItwjnCRcJcwnPCicKgwrfCzcLkwvzDDsMlwzfDTcNew3bDjcOkw7rD0sPpw//EFsR9xI/EpcS8xM3E3sT0xQrFIcWOxaTFusXRxejF9MYKxhzGM8ZKxlXGa8aCxo7GpMawxsXG0cboxvTHC8ccxzPHRsdYx2THdceHx53Hqce6x8bH3Mfox/7ID8gmyDnITMityMTI2sjxyQjJH8k1yUDJTMlYyWTJcMl8yYjJo8mrybPJu8nDycvJ08nbyePJ68nzyfvKA8oLyhPKK8pDylXKZ8p5yorKpMqsyrTKvMrEyszK5Mr7yw3LH8sxy0nLYMvOy9bL7sv2y/7MFcwszDTMPMxEzEzMY8xrzHPMe8yDzIvMk8ybzKPMq8yzzMrM0szazS7NNs0+zVXNbM10zXzNlM2czbPNyc3gzffODs4lzjjOS85iznPOh86mzrLOxM7MzuPO9c8Bzw3PJM87z1LPac9xz3nPkc+pz7XPwc/Nz9nP5c/xz/nQAdAJ0CDQN9A/0FbQbdCF0JzQpNCs0MPQ2dDx0PnRENEo0UDRWNFv0YbRnNG00czR5NH80gTSDNIk0jvSU9Jq0nzSjdKl0rzS1NLs0wTTG9M301PTX9Nr03PTf9OL05fTo9O108fT4NPy1AvUHdQw1ELUVdRn1HfUhtSZ1KvUvtTQ1OPU9dUI1RrVKtU61UbVUtVk1XbViNWZ1bLVxNXd1e/WAtYU1ifWOdZJ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CRCwBtCwBi+wAdCwAS8wMf//AI//8gPIBbAAJgAFAAAABwAFAiUAAP///7H+SwJzBd8CJgCbAAABBwCe/z//3gAJALAAL7AR3DAxAP//ADMEAAFlBgACBgFtAAD//wCUAAAGagc2AiYAMQAAAQcAdQKQATYAEwCwAEVYsAIvG7ECHz5ZsBHcMDEA//8AfAAABnkGAAImAFEAAAEHAHUCoAAAAAkAsAMvsCDcMDEA//8AEv5tBUIFsAImACUAAAAHAKYBegAD//8AWv5xA/sETgImAEUAAAAHAKYArQAH//8AlAAABEwHPQImACkAAAEHAEQA6AE9ABMAsABFWLAGLxuxBh8+WbAN3DAxAP//AJQAAAUNBz0CJgDbAAABBwBEAUoBPQATALAARViwCC8bsQgfPlmwC9wwMQD//wBT/+wECwYAAiYASQAAAQcARAChAAAAEwCwAEVYsAgvG7EIGz5ZsB/cMDEA//8AhgAABBIF8wImAO8AAAEHAEQAxP/zABMAsABFWLAILxuxCBs+WbAL3DAxAP//AEQAAAVcBbACBgC4AAD//wBP/iIFfgQ6AgYAzAAA//8AEAAABPMG/AImARgAAAEHAKsESQEOABYAsABFWLAPLxuxDx8+WbAR3LAV0DAx////8QAABBgF0AImARkAAAEHAKsD5f/iABYAsABFWLARLxuxERs+WbAT3LAX0DAx//8AT/5LCGQETgAmAFMAAAAHAF0EjgAA//8AZv5LCVwFxAAmADMAAAAHAF0FhgAA//8ASf46BH8FwwImANoAAAAHAbABkv+g//8ATf47A8QETQImAO4AAAAHAbABOf+h//8AZv4+BOsFxAImACcAAAAHAbAB1v+k//8AT/4+A/UETgImAEcAAAAHAbABSv+k//8ABwAABNYFsAIGAD0AAP//ACD+XwP1BDoCBgC8AAD//wCjAAABnwWwAgYALQAA//8AFgAAB5sHIwImANkAAAEHAKACHQE9ABMAsABFWLANLxuxDR8+WbAZ3DAxAP//AB4AAAZcBdkCJgDtAAABBwCgAYf/8wATALAARViwDS8bsQ0bPlmwGdwwMQD//wCjAAABnwWwAgYALQAA//8AEgAABUIHHAImACUAAAEHAKAA9gE2ABMAsABFWLAELxuxBB8+WbAO3DAxAP//AFr/7AP7BeYCJgBFAAABBwCg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ALAARViwBy8bsQcfPlmxDwn0sBXQMDEA//8AU//sBMgGfAImAEkAAAEGAbc97AAMALAIL7Ag3LAl0DAx////1QAABEwHtQImACkAAAEHAbYAiQEyABcAsABFWLAGLxuxBh8+WbEPCfSwFNAwMQD///+O/+wECwZ5AiYASQAAAQYBtkL2AAwAsAgvsB7csCXQMDH//wCUAAAEkgflAiYAKQAAAQcBtQCIARoADACwBi+wDNywE9AwMf//AFP/7ARLBqkCJgBJAAABBgG1Qd4ADACwCC+wHtywJdAwMf//AJQAAARMB90CJgApAAABBwG0AIkBDAAMALAGL7AM3LAT0DAx//8AU//sBAsGoQImAEkAAAEGAbRC0AAMALAIL7Ae3LAl0DAx//8AlP6eBEwHPgImACkAAAAnAJ0AiAE9AAcArATLAAr//wBT/pQECwYBAiYASQAAACYAnUEAAAcArASPAAD//wCjAAACEQfCAiYALQAAAQcAqgN4AUMACQCwAi+wBNwwMQD//wCPAAAB/QZ+AiYAjAAAAQcAqgNk//8ACQCwAi+wBNwwMQD//wCU/poBpwWwAiYALQAAAAcArAN4AAb//wB4/p4BkAXVAiYATQAAAAcArANcAAr//wBm/pQFHgXEAiYAMwAAAAcArAUdAAD//wBP/pIEPQROAiYAUwAAAAcArASd//7//wBm/+wFHge7AiYAMwAAAQcAqgUcATwACQCwFC+wH9wwMQD//wBP/+wEPQaFAiYAUwAAAQcAqgSYAAYACQCwBC+wG9wwMQD//wBm/+wFYQexAiYAMwAAAQcBtwDWASEADACwFC+wIdywJtAwMf//AE//7ATdBnwCJgBTAAABBgG3UuwADACwBC+wHdywItAwMf//ACf/7AUeB64CJgAzAAABBwG2ANsBKwAMALAUL7Af3LAm0DAx////o//sBD0GeQImAFMAAAEGAbZX9gAMALAEL7Ab3LAi0DAx//8AZv/sBR4H3gImADMAAAEHAbUA2gETAAwAsBQvsB/csCbQMDH//wBP/+wEYAapAiYAUwAAAQYBtVbeAAwAsAQvsBvcsCLQMDH//wBm/+wFHgfWAiYAMwAAAQcBtADbAQUADACwFC+wH9ywJtAwMf//AE//7AQ9BqECJgBTAAABBgG0V9AADACwBC+wG9ywItAwMf//AGb+lAUe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GzIcqB5aIBg63iFOIuA5MiUuOt463jb2Ot463iX4J5I5oChwKTIpwCoeKvg5KCuCOZAsTCx2Ldw23DBiMKAx0jOQNtwyVDLaMwQzWjOQN0A3+DakOCQztjbcOco5KDqMOow5KDaeM+A2njaeNp41UjV4NYI1jDWqNbw1zjXgNso7ijuKO4o7ijg+N0A3QDdAN0A3QDdAN0A2yjfYN9g32DfYOt463jreOt463juKO4o7ijuKO4o4HjgeOB44HjsAN7Y3tje2N7Y3tje2N7Y37jfuN+437jmWN/g3+Df4N/g3+DgkOCQ3QDe2N0A3tjdAN7Y2yjbKNso2yjuKN9g37jfYN+432DfuN9g37jfYN+463jmWOt463jreOt463jgeOow16jXqNeo16jreOZY63jmWOt45ljmWO4o3+DuKN/g7ijf4Nhg2GDYYOD44Pjg+OB44HjgeOB44HjgeNng7ADgkOwA2KjYqNio3QDfYOt463juKOwA3QDZMN9g2KjreOt46jDreOt47ijZWOD47ADkyOt47ADmWN/g4JDf4N9g5yjreOt44HjqMOow29jdANkw5yjfYOt463juKNlY2yjg+OTI3tjfuN/g23DgkOZA37jkoOCQ2eDZ4Nng7ADgkNp42njaeOt45ljdAN7Y32DfuNqQ4JDbKOwA4JDreOTI5kDreN0A3tjdAN7Y32DfuN+437jkyOZA7ijf4N/g23Db2OCQ29jgkNvY4JDkyOZA3QDe2N0A3tjdAN7Y3QDe2N0A3tjdAN7Y3QDe2N0A3tjdAN7Y3QDe2N0A3tjdAN7Y32DfuN9g37jfYN+432DfuN9g37jfYN+432DfuN9g37jreOt47ijf4O4o3+DuKN/g7ijf4O4o3+DuKN/g7ijf4N/g4HjgeOwA4JDsAOCQ7ADgkOow63jg+OTI5kDnKOSg5MjmQOZY5oDnKOow63jreOwA7igACAIsABAAEAAAABgAGAAEACwAMAAIAEwATAAQAJQAqAAUALAA2AAsAOAA/ABYARQBGAB4ASQBKACAATABMACIATwBPACMAUQBUACQAVgBWACgAWABYACkAWgBdACoAXwBfAC4AigCKAC8AnACcADAAsAC0ADEAtgC4ADYAugC6ADkAvAC8ADoAvwDAADsAwgDCAD0AxADEAD4AxgDNAD8A0QDRAEcA0wDdAEgA3wDfAFMA4QDjAFQA5QDuAFcA8ADwAGEA9QD3AGIA+gD7AGUA/QD/AGcBAgEEAGoBCQEJAG0BDAEMAG4BFwEZAG8BIQEhAHIBKwEtAHMBMAEwAHYBMgEyAHcBSQFJAHgBbAFtAHkBbwFxAHsBugG6AH4BvQG9AH8BxAHFAIAByAHIAIIBygHLAIMBzQHNAIUCKAIoAIYCKgIrAIcCRgJHAIkCSQJJAIsCSwJsAIwCbgJxAK4CdgJ7ALICgAKIALgCigKKAMECjAKMAMICjgKOAMMCkAKQAMQCkgKbAMUCpAKmAM8CqAKoANICqgKqANMCrAKsANQCrgKuANUCsQKxANYCswKzANcCtQK1ANgCtwK3ANkCuQK5ANoCuwK7ANsCvQLJANwCywLLAOkCzQLNAOoCzwLPAOsC2gLaAOwC3ALcAO0C3gLeAO4C4ALgAO8C4gLiAPAC5ALkAPEC5gLmAPIC6ALoAPMC6gLqAPQC7ALsAPUC7gLxAPYC8wLzAPoC9QL1APsDUgNXAPwDWgNpAQIDbANsARIDcANwARMDcgNyARQDdgN2ARUDeQN6ARYDfAOFARgDhwOJASIDiwOQASUDkgOTASsDlQOYAS0DngOfATEDoQOhATMDowOjATQDpQOoATUDqwOwATkDsgOyAT8DtgO3AUADvAO8AUIDvgPHAUMDygPLAU0DzQPQAU8D1wPYAVMD3APcAVUD3gPkAVYD6QPqAV0D7gQWAV8EGAQYAYgEGgQnAYkELwQvAZcEMgQyAZgENAQ0AZkEQARFAZoESARIAaAESgRKAaEETARMAaIETgRPAaMEVARXAaUEWgRaAakEXARdAaoEXwRfAawEYwRjAa0EZQRlAa4EaQRpAa8EqQSpAbAACgA4/8QA0f/EANX/xAEy/8QBOv/EAtr/xALc/8QC3v/EA43/xARM/8QAFQA6ABQAOwAmAD0AFgEYABQCZQAWAuwAJgLuABYC8AAWA1cAFgNmABYDaQAWA58AJgOhACYDowAmA6UAFgO2ABQDvgAWBEAAFgRCABYERAAWBGkAFgABABP/CADOABD+7gAS/u4AJf9AAC7/MAA4ABQARf/eAEf/6wBI/+sASf/rAEv/6wBT/+sAVf/rAFb/5gBZ/+oAWv/oAF3/6ACT/+sAmP/rAJr/6gCx/0AAs/9AALr/6wC8/+gAx//rAMj/6wDK/+oA0QAUANUAFAD2/+sBAv/rAQz/QAEX/+sBGf/oAR3/6wEh/+sBMgAUATn/6wE6ABQBS//rAUz/6wFW/+sBbv7uAXL+7gF2/u4Bd/7uAbr/wAJL/0ACTP9AAk3/QAJO/0ACT/9AAlD/QAJR/0ACZv/eAmf/3gJo/94Caf/eAmr/3gJr/94CbP/eAm3/6wJu/+sCb//rAnD/6wJx/+sCd//rAnj/6wJ5/+sCev/rAnv/6wJ8/+oCff/qAn7/6gJ//+oCgP/oAoH/6AKC/0ACg//eAoT/QAKF/94Chv9AAof/3gKJ/+sCi//rAo3/6wKP/+sCkf/rApP/6wKV/+sCl//rApn/6wKb/+sCnf/rAp//6wKh/+sCo//rArH/MALF/+sCx//rAsn/6wLaABQC3AAUAt4AFALh/+oC4//qAuX/6gLn/+oC6f/qAuv/6gLv/+gDUv9AA1r/QANq/+sDbv/qA3D/6wNy/+gDdf/qA3b/6wN3/+oDfv8wA4L/QAONABQDj//eA5D/6wOS/+sDlP/rA5X/6AOX/+sDnv/oA6b/6AOu/0ADr//eA7L/6wO3/+gDuP/rA73/6wO//+gDxP9AA8X/3gPG/0ADx//eA8v/6wPN/+sDzv/rA9j/6wPa/+sD3P/rA+D/6APi/+gD5P/oA+v/6wPu/0AD7//eA/D/QAPx/94D8v9AA/P/3gP0/0AD9f/eA/b/QAP3/94D+P9AA/n/3gP6/0AD+//eA/z/QAP9/94D/v9AA///3gQA/0AEAf/eBAL/QAQD/94EBP9ABAX/3gQH/+sECf/rBAv/6wQN/+sED//rBBH/6wQT/+sEFf/rBBv/6wQd/+sEH//rBCH/6wQj/+sEJf/rBCf/6wQp/+sEK//rBC3/6wQv/+sEMf/rBDP/6gQ1/+oEN//qBDn/6gQ7/+oEPf/qBD//6gRB/+gEQ//oBEX/6ARMABQAIAA4/98AOv/kADv/7AA9/90A0f/fANX/3wEY/+QBMv/fATr/3wG6AA4CZf/dAtr/3wLc/98C3v/fAuz/7ALu/90C8P/dA1f/3QNm/90Daf/dA43/3wOf/+wDof/sA6P/7AOl/90Dtv/kA77/3QRA/90EQv/dBET/3QRM/98Eaf/dABoAOP/OADr/7QA9/9AA0f/OANX/zgEY/+0BMv/OATr/zgJl/9AC2v/OAtz/zgLe/84C7v/QAvD/0ANX/9ADZv/QA2n/0AON/84Dpf/QA7b/7QO+/9AEQP/QBEL/0ARE/9AETP/OBGn/0AAQAC7/7gA5/+4CYf/uAmL/7gJj/+4CZP/uArH/7gLg/+4C4v/uAuT/7gLm/+4C6P/uAur/7gN+/+4EMv/uBDT/7gBKAAYAEAALABAADQAUAEEAEgBH/+gASP/oAEn/6ABL/+gAVf/oAGEAEwCT/+gAmP/oALr/6ADH/+gAyP/oAPb/6AEC/+gBHf/oASH/6AE5/+gBS//oAUz/6AFW/+gBbAAQAW0AEAFvABABcAAQAXEAEAJt/+gCbv/oAm//6AJw/+gCcf/oAon/6AKL/+gCjf/oAo//6AKR/+gCk//oApX/6AKX/+gCmf/oApv/6AKd/+gCn//oAqH/6AKj/+gDav/oA5D/6AOU/+gDl//oA6cAEAOoABADqwAQA7L/6AO4/+gDvf/oA8v/6APN/+gDzv/oA9r/6APr/+gEB//oBAn/6AQL/+gEDf/oBA//6AQR/+gEE//oBBX/6AQp/+gEK//oBC3/6AQx/+gAAgD1/9YBbf+YAD0AR//sAEj/7ABJ/+wAS//sAFX/7ACT/+wAmP/sALr/7ADH/+wAyP/sAPb/7AEC/+wBHf/sASH/7AE5/+wBS//sAUz/7AFW/+wCbf/sAm7/7AJv/+wCcP/sAnH/7AKJ/+wCi//sAo3/7AKP/+wCkf/sApP/7AKV/+wCl//sApn/7AKb/+wCnf/sAp//7AKh/+wCo//sA2r/7AOQ/+wDlP/sA5f/7AOy/+wDuP/sA73/7APL/+wDzf/sA87/7APa/+wD6//sBAf/7AQJ/+wEC//sBA3/7AQP/+wEEf/sBBP/7AQV/+wEKf/sBCv/7AQt/+wEMf/sABgAU//iARf/4gFtABgCd//iAnj/4gJ5/+ICev/iAnv/4gLF/+ICx//iAsn/4gNw/+IDdv/iA5L/4gPY/+ID3P/iBBv/4gQd/+IEH//iBCH/4gQj/+IEJf/iBCf/4gQv/+IABgAQ/4QAEv+EAW7/hAFy/4QBdv+EAXf/hAAQAC7/7AA5/+wCYf/sAmL/7AJj/+wCZP/sArH/7ALg/+wC4v/sAuT/7ALm/+wC6P/sAur/7AN+/+wEMv/sBDT/7AAeAAb/8gAL//IAWv/zAF3/8wC8//MA9f/1ARn/8wFs//IBbf/yAW//8gFw//IBcf/yAoD/8wKB//MC7//zA3L/8wOV//MDnv/zA6b/8wOn//IDqP/yA6v/8gO3//MDv//zA+D/8wPi//MD5P/zBEH/8wRD//MERf/zAD4AJ//zACv/8wAz//MANf/zAIP/8wCS//MAl//zALL/8wDDAA0A0v/zAQf/8wEW//MBGv/zARz/8wEe//MBIP/zATj/8wFV//MCKP/zAin/8wIr//MCLP/zAlL/8wJc//MCXf/zAl7/8wJf//MCYP/zAoj/8wKK//MCjP/zAo7/8wKc//MCnv/zAqD/8wKi//MCxP/zAsb/8wLI//MC+f/zA1b/8wNj//MDif/zA4z/8wO5//MDvP/zA9f/8wPZ//MD2//zBBr/8wQc//MEHv/zBCD/8wQi//MEJP/zBCb/8wQo//MEKv/zBCz/8wQu//MEMP/zBKn/8wA/ACf/5gAr/+YAM//mADX/5gCD/+YAkv/mAJf/5gCy/+YAt//CAMMAEADS/+YBB//mARb/5gEa/+YBHP/mAR7/5gEg/+YBOP/mAVX/5gIo/+YCKf/mAiv/5gIs/+YCUv/mAlz/5gJd/+YCXv/mAl//5gJg/+YCiP/mAor/5gKM/+YCjv/mApz/5gKe/+YCoP/mAqL/5gLE/+YCxv/mAsj/5gL5/+YDVv/mA2P/5gOJ/+YDjP/mA7n/5gO8/+YD1//mA9n/5gPb/+YEGv/mBBz/5gQe/+YEIP/mBCL/5gQk/+YEJv/mBCj/5gQq/+YELP/mBC7/5gQw/+YEqf/mADcAJf/kADz/0gA9/9MAsf/kALP/5ADD/+IA2f/SAQz/5AJL/+QCTP/kAk3/5AJO/+QCT//kAlD/5AJR/+QCZf/TAoL/5AKE/+QChv/kAu7/0wLw/9MDUv/kA1f/0wNa/+QDZv/TA2f/0gNp/9MDgv/kA47/0gOl/9MDrv/kA77/0wPB/9IDxP/kA8b/5APP/9ID6f/SA+7/5APw/+QD8v/kA/T/5AP2/+QD+P/kA/r/5AP8/+QD/v/kBAD/5AQC/+QEBP/kBED/0wRC/9MERP/TBE7/0gRW/9IEaf/TACcAEP9GABL/RgAl/80Asf/NALP/zQDG//IBDP/NAW7/RgFy/0YBdv9GAXf/RgJL/80CTP/NAk3/zQJO/80CT//NAlD/zQJR/80Cgv/NAoT/zQKG/80DUv/NA1r/zQOC/80Drv/NA8T/zQPG/80D7v/NA/D/zQPy/80D9P/NA/b/zQP4/80D+v/NA/z/zQP+/80EAP/NBAL/zQQE/80AAQDDAA4ArwBH/9wASP/cAEn/3ABL/9wAUf/BAFL/wQBT/9YAVP/BAFX/3ABZ/90AWv/hAF3/4QCT/9wAmP/cAJr/3QC6/9wAvP/hAL7/5gDA/8EAwf/rAML/6QDE//AAxf/nAMf/3ADI/9wAyf/jAMr/3QDL/84AzP/UAM3/2wDr/8EA7//BAPD/wQDy/8EA8//BAPT/wQD2/9wA9//BAPn/wQD6/8EA/f/BAP//wQEC/9wBBP/BARf/1gEZ/+EBHf/cASH/3AE1/8EBOf/cAUT/wQFJ/8EBS//cAUz/3AFW/9wCbf/cAm7/3AJv/9wCcP/cAnH/3AJ2/8ECd//WAnj/1gJ5/9YCev/WAnv/1gJ8/90Cff/dAn7/3QJ//90CgP/hAoH/4QKJ/9wCi//cAo3/3AKP/9wCkf/cApP/3AKV/9wCl//cApn/3AKb/9wCnf/cAp//3AKh/9wCo//cAr7/wQLA/8ECwv/BAsP/wQLF/9YCx//WAsn/1gLh/90C4//dAuX/3QLn/90C6f/dAuv/3QLv/+EDav/cA2z/wQNu/90DcP/WA3L/4QN1/90Ddv/WA3f/3QOQ/9wDkf/BA5L/1gOT/8EDlP/cA5X/4QOX/9wDmP/BA53/wQOe/+EDpv/hA63/wQOy/9wDs//BA7f/4QO4/9wDvf/cA7//4QPL/9wDzf/cA87/3APU/8ED1v/BA9j/1gPa/9wD3P/WA+D/4QPi/+ED5P/hA+j/wQPr/9wEB//cBAn/3AQL/9wEDf/cBA//3AQR/9wEE//cBBX/3AQb/9YEHf/WBB//1gQh/9YEI//WBCX/1gQn/9YEKf/cBCv/3AQt/9wEL//WBDH/3AQz/90ENf/dBDf/3QQ5/90EO//dBD3/3QQ//90EQf/hBEP/4QRF/+EESf/BBEv/wQRV/8EEYv/BBGT/wQRm/8EAdgAG/9oAC//aAEf/8ABI//AASf/wAEv/8ABV//AAWf/vAFr/3ABd/9wAk//wAJj/8ACa/+8Auv/wALz/3ADB/+wAwwAPAMX/6gDH//AAyP/wAMn/zgDK/+8Ay//nAPb/8AEC//ABGf/cAR3/8AEh//ABOf/wAUv/8AFM//ABVv/wAWz/2gFt/9oBb//aAXD/2gFx/9oCbf/wAm7/8AJv//ACcP/wAnH/8AJ8/+8Cff/vAn7/7wJ//+8CgP/cAoH/3AKJ//ACi//wAo3/8AKP//ACkf/wApP/8AKV//ACl//wApn/8AKb//ACnf/wAp//8AKh//ACo//wAuH/7wLj/+8C5f/vAuf/7wLp/+8C6//vAu//3ANq//ADbv/vA3L/3AN1/+8Dd//vA5D/8AOU//ADlf/cA5f/8AOe/9wDpv/cA6f/2gOo/9oDq//aA7L/8AO3/9wDuP/wA73/8AO//9wDy//wA83/8APO//AD2v/wA+D/3APi/9wD5P/cA+v/8AQH//AECf/wBAv/8AQN//AED//wBBH/8AQT//AEFf/wBCn/8AQr//AELf/wBDH/8AQz/+8ENf/vBDf/7wQ5/+8EO//vBD3/7wQ//+8EQf/cBEP/3ARF/9wARAAQAAwAEgAMAEf/5wBI/+cASf/nAEv/5wBV/+cAk//nAJj/5wC6/+cAwwAPAMf/5wDI/+cA9v/nAQL/5wEd/+cBIf/nATn/5wFL/+cBTP/nAVb/5wFuAAwBcgAMAXYADAF3AAwCbf/nAm7/5wJv/+cCcP/nAnH/5wKJ/+cCi//nAo3/5wKP/+cCkf/nApP/5wKV/+cCl//nApn/5wKb/+cCnf/nAp//5wKh/+cCo//nA2r/5wOQ/+cDlP/nA5f/5wOy/+cDuP/nA73/5wPL/+cDzf/nA87/5wPa/+cD6//nBAf/5wQJ/+cEC//nBA3/5wQP/+cEEf/nBBP/5wQV/+cEKf/nBCv/5wQt/+cEMf/nAAYAyf/qAOz/7gD1/9UA/f/tATP/7AFY/+wAAQD1/8AAAQDJACAAfgAGAAwACwAMAEf/6ABI/+gASf/oAEoADABL/+gAU//qAFX/6ABaAAsAXQALAJP/6ACY/+gAuv/oALwACwDD/5AAxQALAMf/6ADI/+gAyQAMAPb/6AEC/+gBF//qARkACwEd/+gBIf/oATn/6AFL/+gBTP/oAVb/6AFsAAwBbQAMAW8ADAFwAAwBcQAMAbr/vwG8/+4BwP/sAcj/7QHK/+wBzP/1Ac0ADgHPAA0B0gANAm3/6AJu/+gCb//oAnD/6AJx/+gCd//qAnj/6gJ5/+oCev/qAnv/6gKAAAsCgQALAon/6AKL/+gCjf/oAo//6AKR/+gCk//oApX/6AKX/+gCmf/oApv/6AKd/+gCn//oAqH/6AKj/+gCxf/qAsf/6gLJ/+oC7wALA2r/6ANw/+oDcgALA3b/6gOQ/+gDkv/qA5T/6AOVAAsDl//oA54ACwOmAAsDpwAMA6gADAOrAAwDsv/oA7cACwO4/+gDvf/oA78ACwPL/+gDzf/oA87/6APY/+oD2v/oA9z/6gPgAAsD4gALA+QACwPr/+gEB//oBAn/6AQL/+gEDf/oBA//6AQR/+gEE//oBBX/6AQb/+oEHf/qBB//6gQh/+oEI//qBCX/6gQn/+oEKf/oBCv/6AQt/+gEL//qBDH/6ARBAAsEQwALBEUACwABAPX/4gANAFz/7QBe/+0A7f/tAPX/wALy/+0C9P/tAvb/7QOW/+0Dwv/tA9D/7QPq/+0ET//tBFf/7QAMAFz/8gBe//IA7f/yAvL/8gL0//IC9v/yA5b/8gPC//ID0P/yA+r/8gRP//IEV//yAB8AWv/0AFz/8gBd//QAXv/zALz/9ADt//IBGf/0AoD/9AKB//QC7//0AvL/8wL0//MC9v/zA3L/9AOV//QDlv/yA57/9AOm//QDt//0A7//9APC//ID0P/yA+D/9APi//QD5P/0A+r/8gRB//QEQ//0BEX/9ARP//IEV//yAF0ABv/KAAv/ygA4/9IAOv/UADz/9AA9/9MAWv/mAFz/7wBd/+YAvP/mANH/0gDV/9IA2f/0AN3/7QDg/+EA5f/UAO3/7wD1/8kA/f/RAQj/5QEY/9QBGf/mAR//4wEy/9IBM//EATr/0gE8/+EBTf/UAU7/9QFP/+cBV/9kAVj/yQFs/8oBbf/KAW//ygFw/8oBcf/KAmX/0wKA/+YCgf/mAtr/0gLc/9IC3v/SAu7/0wLv/+YC8P/TA1f/0wNm/9MDZ//0A2n/0wNy/+YDgf/tA43/0gOO//QDlf/mA5b/7wOe/+YDpf/TA6b/5gOn/8oDqP/KA6v/ygO2/9QDt//mA77/0wO//+YDwf/0A8L/7wPP//QD0P/vA9//7QPg/+YD4f/tA+L/5gPj/+0D5P/mA+X/4QPp//QD6v/vBED/0wRB/+YEQv/TBEP/5gRE/9MERf/mBEz/0gRO//QET//vBFD/4QRS/+EEVv/0BFf/7wRp/9MAbAAG/8AAC//AADj/nQA6/8cAPP/wAD3/qwBR/9IAUv/SAFT/0gDA/9IA0f+dANP/9QDV/50A2f/wANz/9QDd/+oA4P/lAOX/wQDr/9IA7//SAPD/0gDy/9IA8//SAPT/0gD1/80A9//SAPn/0gD6/9IA/f/SAP//0gEE/9IBGP/HATL/nQEz/8wBNf/SATr/nQE8/+UBP//fAUT/0gFJ/9IBTf/OAU//6gFR//UBV/+eAVj/zgFs/8ABbf/AAW//wAFw/8ABcf/AAmX/qwJ2/9ICvv/SAsD/0gLC/9ICw//SAtr/nQLc/50C3v+dAu7/qwLw/6sDV/+rA2b/qwNn//ADaf+rA2z/0gOB/+oDjf+dA47/8AOR/9IDk//SA5j/0gOd/9IDpf+rA6f/wAOo/8ADq//AA63/0gOz/9IDtv/HA77/qwPB//ADz//wA9T/0gPW/9ID3//qA+H/6gPj/+oD5f/lA+j/0gPp//AD7P/1BED/qwRC/6sERP+rBEn/0gRL/9IETP+dBE7/8ARQ/+UEUv/lBFX/0gRW//AEYv/SBGT/0gRm/9IEZ//1BGn/qwBvAAb/sQAL/7EAOP+eADr/xQA8//IAPf+oAFH/zwBS/88AVP/PAFz/7wDA/88A0f+eANX/ngDZ//IA3f/sAOD/4QDl/8IA6//PAO3/7wDv/88A8P/PAPL/zwDz/88A9P/PAPX/xgD3/88A+f/PAPr/zwD9/88A///PAQT/zwEY/8UBMv+eATP/wAE1/88BOv+eATz/4QE//98BRP/PAUn/zwFN/80BT//oAVf/nwFY/8YBbP+xAW3/sQFv/7EBcP+xAXH/sQJl/6gCdv/PAr7/zwLA/88Cwv/PAsP/zwLa/54C3P+eAt7/ngLu/6gC8P+oA1f/qANm/6gDZ//yA2n/qANs/88Dgf/sA43/ngOO//IDkf/PA5P/zwOW/+8DmP/PA53/zwOl/6gDp/+xA6j/sQOr/7EDrf/PA7P/zwO2/8UDvv+oA8H/8gPC/+8Dz//yA9D/7wPU/88D1v/PA9//7APh/+wD4//sA+X/4QPo/88D6f/yA+r/7wRA/6gEQv+oBET/qARJ/88ES//PBEz/ngRO//IET//vBFD/4QRS/+EEVf/PBFb/8gRX/+8EYv/PBGT/zwRm/88Eaf+oAE0AOP++AFH/4QBS/+EAVP/hAFr/7wBd/+8AvP/vAMD/4QDR/74A1f++AOX/yQDr/+EA7//hAPD/4QDy/+EA8//hAPT/4QD1/98A9//hAPn/4QD6/+EA/f/hAP//4QEE/+EBCP/tARn/7wEf/+sBMv++ATP/3wE1/+EBOv++AT//6QFE/+EBSf/hAU7/9QFY/+ACdv/hAoD/7wKB/+8Cvv/hAsD/4QLC/+ECw//hAtr/vgLc/74C3v++Au//7wNs/+EDcv/vA43/vgOR/+EDk//hA5X/7wOY/+EDnf/hA57/7wOm/+8Drf/hA7P/4QO3/+8Dv//vA9T/4QPW/+ED4P/vA+L/7wPk/+8D6P/hBEH/7wRD/+8ERf/vBEn/4QRL/+EETP++BFX/4QRi/+EEZP/hBGb/4QBkADj/5gA6/+cAPP/yAD3/5wBR/9YAUv/WAFT/1gBc//EAwP/WANH/5gDV/+YA2f/yAN3/7gDg/+gA5f/mAOv/1gDt//EA7//WAPD/1gDy/9YA8//WAPT/1gD1/9AA9//WAPn/1gD6/9YA/f/WAP//1gEE/9YBGP/nATL/5gEz/84BNf/WATr/5gE8/+gBRP/WAUn/1gFN/+cBT//tAVf/5gFY/9ACZf/nAnb/1gK+/9YCwP/WAsL/1gLD/9YC2v/mAtz/5gLe/+YC7v/nAvD/5wNX/+cDZv/nA2f/8gNp/+cDbP/WA4H/7gON/+YDjv/yA5H/1gOT/9YDlv/xA5j/1gOd/9YDpf/nA63/1gOz/9YDtv/nA77/5wPB//IDwv/xA8//8gPQ//ED1P/WA9b/1gPf/+4D4f/uA+P/7gPl/+gD6P/WA+n/8gPq//EEQP/nBEL/5wRE/+cESf/WBEv/1gRM/+YETv/yBE//8QRQ/+gEUv/oBFX/1gRW//IEV//xBGL/1gRk/9YEZv/WBGn/5wCTACUAEAAn/+gAK//oADP/6AA1/+gAOP/gADr/4AA9/98Ag//oAJL/6ACX/+gAsQAQALL/6ACzABAA0f/gANL/6ADTABAA1f/gANgAFADcABAA4P/hAOX/4ADsABMA8QAQAPj/4AEDABABB//oAQwAEAEW/+gBGP/gARr/6AEc/+gBHv/oASD/6AEy/+ABOP/oATr/4AE8/+EBPf/gAUD/4QFF/+kBTf/fAU//3gFRABABVf/oAVf/3wFZ//ICKP/oAin/6AIr/+gCLP/oAksAEAJMABACTQAQAk4AEAJPABACUAAQAlEAEAJS/+gCXP/oAl3/6AJe/+gCX//oAmD/6AJl/98CggAQAoQAEAKGABACiP/oAor/6AKM/+gCjv/oApz/6AKe/+gCoP/oAqL/6ALE/+gCxv/oAsj/6ALa/+AC3P/gAt7/4ALu/98C8P/fAvn/6ANSABADVv/oA1f/3wNaABADY//oA2b/3wNp/98DggAQA4n/6AOM/+gDjf/gA6X/3wOuABADtv/gA7n/6AO8/+gDvv/fA8QAEAPGABAD1//oA9n/6APb/+gD5f/hA+b/4APsABAD7QAQA+4AEAPwABAD8gAQA/QAEAP2ABAD+AAQA/oAEAP8ABAD/gAQBAAAEAQCABAEBAAQBBr/6AQc/+gEHv/oBCD/6AQi/+gEJP/oBCb/6AQo/+gEKv/oBCz/6AQu/+gEMP/oBED/3wRC/98ERP/fBEz/4ARQ/+EEUf/gBFL/4QRT/+AEZwAQBGgAEARp/98Eqf/oADIAG//yADj/8QA6//QAPP/0AD3/8ADR//EA0//1ANX/8QDZ//QA3P/1AN3/8wDl//EBGP/0ATL/8QE6//EBTf/yAU//8gFR//UBV//yAmX/8ALa//EC3P/xAt7/8QLu//AC8P/wA1f/8ANm//ADZ//0A2n/8AOB//MDjf/xA47/9AOl//ADtv/0A77/8APB//QDz//0A9//8wPh//MD4//zA+n/9APs//UEQP/wBEL/8ARE//AETP/xBE7/9ARW//QEZ//1BGn/8ABmACUADwA4/+YAOv/mADwADgA9/+YAsQAPALMADwDR/+YA0wAOANX/5gDYABMA2QAOANwADgDdAAsA4P/lAOX/5gDm//QA7AASAPEADwD1/+cA+P/oAP3/5wEDAA8BDAAPARj/5gEy/+YBM//nATr/5gE8/+UBPf/oAU3/5gFP/+YBUQAOAVf/5gFY/+cCSwAPAkwADwJNAA8CTgAPAk8ADwJQAA8CUQAPAmX/5gKCAA8ChAAPAoYADwLa/+YC3P/mAt7/5gLu/+YC8P/mA1IADwNX/+YDWgAPA2b/5gNnAA4Daf/mA4EACwOCAA8Djf/mA44ADgOl/+YDrgAPA7b/5gO+/+YDwQAOA8QADwPGAA8DzwAOA98ACwPhAAsD4wALA+X/5QPm/+gD6QAOA+wADgPtAA8D7gAPA/AADwPyAA8D9AAPA/YADwP4AA8D+gAPA/wADwP+AA8EAAAPBAIADwQEAA8EQP/mBEL/5gRE/+YETP/mBE4ADgRQ/+UEUf/oBFL/5QRT/+gEVgAOBGcADgRoAA8Eaf/mADcABv+/AAv/vwA4/58AOv/JAD3/rQDR/58A1f+fAN3/7ADg/+YA5f/EAPX/zQD9/9UBGP/JATL/nwEz/8wBOv+fATz/5gE//98BTf/RAU//7AFX/6EBWP/PAWz/vwFt/78Bb/+/AXD/vwFx/78CZf+tAtr/nwLc/58C3v+fAu7/rQLw/60DV/+tA2b/rQNp/60Dgf/sA43/nwOl/60Dp/+/A6j/vwOr/78Dtv/JA77/rQPf/+wD4f/sA+P/7APl/+YEQP+tBEL/rQRE/60ETP+fBFD/5gRS/+YEaf+tADAAOP/jADz/5QA9/+QA0f/jANP/5QDV/+MA2P/iANn/5QDc/+UA3f/pAPH/6gED/+oBMv/jATr/4wFR/+UBV//kAmX/5ALa/+MC3P/jAt7/4wLu/+QC8P/kA1f/5ANm/+QDZ//lA2n/5AOB/+kDjf/jA47/5QOl/+QDvv/kA8H/5QPP/+UD3//pA+H/6QPj/+kD6f/lA+z/5QPt/+oEQP/kBEL/5ARE/+QETP/jBE7/5QRW/+UEZ//lBGj/6gRp/+QAIwA4/+IAPP/kANH/4gDT/+QA1f/iANj/4QDZ/+QA3P/kAN3/6QDs/+QA8f/rAQP/6wEy/+IBOv/iAVH/5ALa/+IC3P/iAt7/4gNn/+QDgf/pA43/4gOO/+QDwf/kA8//5APf/+kD4f/pA+P/6QPp/+QD7P/kA+3/6wRM/+IETv/kBFb/5ARn/+QEaP/rABcAOP/rAD3/8wDR/+sA1f/rATL/6wE6/+sCZf/zAtr/6wLc/+sC3v/rAu7/8wLw//MDV//zA2b/8wNp//MDjf/rA6X/8wO+//MEQP/zBEL/8wRE//METP/rBGn/8wA2AFH/7wBS/+8AVP/vAFz/8ADA/+8A6//vAOz/7gDt//AA7//vAPD/7wDy/+8A8//vAPT/7wD1/+4A9//vAPn/7wD6/+8A/f/vAP//7wEE/+8BCP/0AR//8QEz/+8BNf/vAUT/7wFJ/+8BWP/vAnb/7wK+/+8CwP/vAsL/7wLD/+8DbP/vA5H/7wOT/+8Dlv/wA5j/7wOd/+8Drf/vA7P/7wPC//AD0P/wA9T/7wPW/+8D6P/vA+r/8ARJ/+8ES//vBE//8ARV/+8EV//wBGL/7wRk/+8EZv/vACIABv/yAAv/8gBa//UAXf/1ALz/9QD1//QA/f/0AQj/9QEZ//UBM//1AVj/9QFs//IBbf/yAW//8gFw//IBcf/yAoD/9QKB//UC7//1A3L/9QOV//UDnv/1A6b/9QOn//IDqP/yA6v/8gO3//UDv//1A+D/9QPi//UD5P/1BEH/9QRD//UERf/1ADIAUf/uAFL/7gBU/+4AwP/uAOv/7gDsABQA7//uAPD/7gDy/+4A8//uAPT/7gD1/+0A9//uAPj/7QD5/+4A+v/uAPv/0AD9/+4A///uAQT/7gEz/+0BNf/uAT3/7QFE/+4BSf/uAVj/7QJ2/+4Cvv/uAsD/7gLC/+4Cw//uA2z/7gOR/+4Dk//uA5j/7gOd/+4Drf/uA7P/7gPU/+4D1v/uA+b/7QPo/+4ESf/uBEv/7gRR/+0EU//tBFX/7gRi/+4EZP/uBGb/7gAKAAb/9QAL//UBbP/1AW3/9QFv//UBcP/1AXH/9QOn//UDqP/1A6v/9QBZAEf/8ABI//AASf/wAEv/8ABT/8cAVf/wAJP/8ACY//AAuv/wAMf/8ADI//AA9v/wAQL/8AEX/8cBG//rAR3/8AEh//ABOf/wAUv/8AFM//ABVv/wAbz/6wHA/+kByP/rAcr/6wJt//ACbv/wAm//8AJw//ACcf/wAnf/xwJ4/8cCef/HAnr/xwJ7/8cCif/wAov/8AKN//ACj//wApH/8AKT//AClf/wApf/8AKZ//ACm//wAp3/8AKf//ACof/wAqP/8ALF/8cCx//HAsn/xwNq//ADcP/HA3b/xwOQ//ADkv/HA5T/8AOX//ADsv/wA7j/8AO9//ADy//wA83/8APO//AD2P/HA9r/8APc/8cD6//wBAf/8AQJ//AEC//wBA3/8AQP//AEEf/wBBP/8AQV//AEG//HBB3/xwQf/8cEIf/HBCP/xwQl/8cEJ//HBCn/8AQr//AELf/wBC//xwQx//AAoQAGAA0ACwANAEX/8ABH/8AASP/AAEn/wABKAA0AS//AAFP/4gBV/8AAWgALAF0ACwCT/8AAmP/AALr/wAC8AAsAxv/WAMf/wADI/8AAy//VAOz/yADx/9cA9v/AAQL/wAED/9cBF//iARkACwEb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AD4AEgBFAEcAGQBJAEkAHABMAEwAHQBRAFQAHgBWAFYAIgBaAFoAIwBcAF4AJACKAIoAJwCwALMAKAC8ALwALADAAMAALQDGAMYALgDTANQALwDWANYAMQDZANkAMgDbAN0AMwDfAN8ANgDhAOEANwDjAOMAOADlAOUAOQDrAOsAOgDtAO0AOwD2APYAPAD7APsAPQD9AP4APgEDAQQAQAEJAQkAQgEMAQwAQwEXARkARAErAS0ARwEwATAASgEyATIASwFJAUkATAFsAXIATQF2AXcAVAIoAigAVgIqAisAVwJGAkcAWQJJAkkAWwJLAnEAXAJ2AnsAgwKAApAAiQKSApsAmgKkAqYApAKoAqgApwKqAqoAqAKsAqwAqQKuAq4AqgKxArEAqwKzArMArAK1ArUArQK3ArcArgK5ArkArwK7ArsAsAK9AskAsQLLAssAvgLNAs0AvwLPAs8AwALaAtoAwQLcAtwAwgLeAt4AwwLgAuAAxALiAuIAxQLkAuQAxgLmAuYAxwLoAugAyALqAuoAyQLsAuwAygLuAvYAywNSA1cA1ANaA2kA2gNsA2wA6gNwA3AA6wNyA3IA7AN2A3YA7QN5A3oA7gN8A4UA8AOHA4kA+gOLA5AA/QOSA5gBAwOeA58BCgOhA6EBDAOjA6MBDQOlA6gBDgOrA7ABEgOyA7IBGAO2A7cBGQO8A8cBGwPKA8sBJwPNA9ABKQPXA9gBLQPcA9wBLwPeA+QBMAPpA+oBNwPuBBYBOQQYBBgBYgQaBCcBYwQvBC8BcQQyBDIBcgQ0BDQBcwRABEUBdARIBEgBegRKBEoBewRMBEwBfAROBE8BfQRUBFcBfwRaBFoBgwRcBF0BhARfBF8BhgRjBGMBhwRlBGUBiARpBGkBiQSpBKkBigACAU4AEAAQAAEAEgASAAEAJQAlAAIAJgAmAAMAJwAnAAQAKAAoAAUAKQApAAYALAAtAAcALgAuAAgALwAvAAkAMAAwAAoAMQAyAAcAMwAzAAUANAA0AAsAOAA4AAwAOQA5AAgAOgA6AA0AOwA7AA4APAA8AA8APQA9ABAAPgA+ABEARQBFABIARgBGABMARwBHABQASQBJABUATABMABYAUQBSABYAUwBTABcAVABUABMAVgBWABgAWgBaABkAXABcABoAXQBdABkAXgBeABsAigCKABMAsACwABwAsQCxAAIAsgCyAAUAswCzAAIAvAC8ABkAwADAABYAxgDGABMA0wDUAB0A1gDWAAcA2QDZAA8A2wDcAAcA3QDdAB4A3wDfAAcA4QDhAAcA4wDjAB0A5QDlAB0A6wDrAB8A7QDtABoA9gD2ABMA+wD7ACAA/QD9ACAA/gD+ABMBAwEEACABCQEJACABDAEMAAIBFwEXABcBGAEYAA0BGQEZABkBKwErABMBLAEsABwBLQEtAB8BMAEwAAkBMgEyAAkBSQFJAB8BbgFuAAEBcgFyAAEBdgF3AAECKAIoAAQCKgIrAAUCRgJHAAUCSQJJAAwCSwJRAAICUgJSAAQCUwJWAAYCVwJbAAcCXAJgAAUCYQJkAAgCZQJlABACZgJsABICbQJtABQCbgJxABUCdgJ2ABYCdwJ7ABcCgAKBABkCggKCAAICgwKDABIChAKEAAIChQKFABIChgKGAAIChwKHABICiAKIAAQCiQKJABQCigKKAAQCiwKLABQCjAKMAAQCjQKNABQCjgKOAAQCjwKPABQCkAKQAAUCkgKSAAYCkwKTABUClAKUAAYClQKVABUClgKWAAYClwKXABUCmAKYAAYCmQKZABUCmgKaAAYCmwKbABUCpAKkAAcCpQKlABYCpgKmAAcCqAKoAAcCqgKqAAcCrAKsAAcCrgKuAAcCsQKxAAgCswKzAAkCtQK1AAoCtwK3AAoCuQK5AAoCuwK7AAoCvQK9AAcCvgK+ABYCvwK/AAcCwALAABYCwQLBAAcCwgLDABYCxALEAAUCxQLFABcCxgLGAAUCxwLHABcCyALIAAUCyQLJABcCywLLABgCzQLNABgCzwLPABgC2gLaAAwC3ALcAAwC3gLeAAwC4ALgAAgC4gLiAAgC5ALkAAgC5gLmAAgC6ALoAAgC6gLqAAgC7ALsAA4C7gLuABAC7wLvABkC8ALwABAC8QLxABEC8gLyABsC8wLzABEC9AL0ABsC9QL1ABEC9gL2ABsDUgNSAAIDUwNTAAYDVANVAAcDVgNWAAUDVwNXABADWgNaAAIDWwNbAAMDXANcAAYDXQNdABEDXgNfAAcDYANgAAkDYQNiAAcDYwNjAAUDZANkAAsDZQNlAAwDZgNmABADZwNnAA8DaANoAAcDaQNpABADbANsABYDcANwABcDcgNyABkDdgN2ABcDeQN5AAYDegN6ABwDfAN9AAcDfgN+AAgDfwOAAAkDgQOBAB4DggOCAAIDgwODAAMDhAOEABwDhQOFAAYDhwOIAAcDiQOJAAUDiwOLAAsDjAOMAAQDjQONAAwDjgOOAA8DjwOPABIDkAOQABUDkgOSABcDkwOTABMDlAOUABQDlQOVABkDlgOWABoDlwOXABUDmAOYAB8DngOeABkDnwOfAA4DoQOhAA4DowOjAA4DpQOlABADpgOmABkDrAOsAAcDrQOtABYDrgOuAAIDrwOvABIDsAOwAAYDsgOyABUDtgO2AA0DtwO3ABkDvAO8AAQDvQO9ABQDvgO+ABADvwO/ABkDwAPAAAcDwQPBAA8DwgPCABoDwwPDAAcDxAPEAAIDxQPFABIDxgPGAAIDxwPHABIDygPKAAYDywPLABUDzQPOABUDzwPPAA8D0APQABoD1wPXAAUD2APYABcD3APcABcD3gPeABMD3wPfAB4D4APgABkD4QPhAB4D4gPiABkD4wPjAB4D5APkABkD6QPpAA8D6gPqABoD7gPuAAID7wPvABID8APwAAID8QPxABID8gPyAAID8wPzABID9AP0AAID9QP1ABID9gP2AAID9wP3ABID+AP4AAID+QP5ABID+gP6AAID+wP7ABID/AP8AAID/QP9ABID/gP+AAID/wP/ABIEAAQAAAIEAQQBABIEAgQCAAIEAwQDABIEBAQEAAIEBQQFABIEBgQGAAYEBwQHABUECAQIAAYECQQJABUECgQKAAYECwQLABUEDAQMAAYEDQQNABUEDgQOAAYEDwQPABUEEAQQAAYEEQQRABUEEgQSAAYEEwQTABUEFAQUAAYEFQQVABUEFgQWAAcEGAQYAAcEGgQaAAUEGwQbABcEHAQcAAUEHQQdABcEHgQeAAUEHwQfABcEIAQgAAUEIQQhABcEIgQiAAUEIwQjABcEJAQkAAUEJQQlABcEJgQmAAUEJwQnABcELwQvABcEMgQyAAgENAQ0AAgEQARAABAEQQRBABkEQgRCABAEQwRDABkERAREABAERQRFABkESARIAAkESgRKAAcETARMAAwETgROAA8ETwRPABoEVARUABwEVQRVAB8EVgRWAA8EVwRXABoEWgRaABYEXARcAB0EXQRdABwEXwRfAAkEYwRjAAcEZQRlAAcEaQRpABAEqQSpAAUAAgFtAAYABgABAAsACwABABAAEAAWABEAEQAZABIAEgAWACUAJQACACcAJwAIACsAKwAIAC4ALgAaADMAMwAIADUANQAIADcANwAbADgAOAAJADkAOQAKADoAOgALADsAOwAMADwAPAAXAD0APQANAD4APgAYAEUARQADAEcASQAEAEsASwAEAFEAUgAFAFMAUwAGAFQAVAAFAFUAVQAEAFcAVwAHAFkAWQAOAFoAWgAPAFwAXAAcAF0AXQAPAF4AXgAQAIMAgwAIAJIAkgAIAJMAkwAEAJcAlwAIAJgAmAAEAJoAmgAOALEAsQACALIAsgAIALMAswACALoAugAEALwAvAAPAMAAwAAFAMcAyAAEAMoAygAOANEA0QAJANIA0gAIANMA0wARANUA1QAJANkA2QAXANwA3AARAN0A3QAVAOAA4AASAOsA6wAFAO0A7QAcAO8A8AAFAPEA8QATAPIA9AAFAPYA9gAEAPcA9wAFAPgA+AAUAPkA+gAFAP0A/QAFAP8A/wAFAQIBAgAEAQMBAwATAQQBBAAFAQcBBwAIAQwBDAACARYBFgAIARcBFwAGARgBGAALARkBGQAPARoBGgAIARwBHAAIAR0BHQAEAR4BHgAIASABIAAIASEBIQAEATIBMgAJATUBNQAFATgBOAAIATkBOQAEAToBOgAJAUQBRAAFAUkBSQAFAUsBTAAEAVEBUQARAVUBVQAIAVYBVgAEAWkBagAZAWwBbQABAW4BbgAWAW8BcQABAXIBcgAWAXYBdwAWAigCKQAIAisCLAAIAkUCRQAZAksCUQACAlICUgAIAlwCYAAIAmECZAAKAmUCZQANAmYCbAADAm0CcQAEAnYCdgAFAncCewAGAnwCfwAOAoACgQAPAoICggACAoMCgwADAoQChAACAoUChQADAoYChgACAocChwADAogCiAAIAokCiQAEAooCigAIAosCiwAEAowCjAAIAo0CjQAEAo4CjgAIAo8CjwAEApECkQAEApMCkwAEApUClQAEApcClwAEApkCmQAEApsCmwAEApwCnAAIAp0CnQAEAp4CngAIAp8CnwAEAqACoAAIAqECoQAEAqICogAIAqMCowAEArECsQAaAr4CvgAFAsACwAAFAsICwwAFAsQCxAAIAsUCxQAGAsYCxgAIAscCxwAGAsgCyAAIAskCyQAGAtAC0AAbAtEC0QAH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ALgAuWMyc2MEWGMyc2MEXmMyc2MEZGMyc2MEamMyc2MEamMyc2MEamMyc2MEamMyc2MEamMyc2MEamMyc2MEamNjbXAEcGNjbXAEcGNjbXAEcGNjbXAEcGNjbXAEcGNjbXAEcGNjbXAEcGNjbXAEcGNjbXAEcGNjbXAEcGRsaWcEeGRsaWcEfmRsaWcEhGRsaWcEimRsaWcEimRsaWcEimRsaWcEimRsaWcEimRsaWcEimRsaWcEimRub20EkGRub20ElmRub20EnGRub20EomRub20EomRub20EomRub20EomRub20EomRub20EomRub20EomZyYWMEqGZyYWMEqGZyYWMEqGZyYWMEqGZyYWMEqGZyYWMEqGZyYWMEqGZyYWMEqGZyYWMEqGZyYWMEqGxpZ2EEsmxpZ2EEumxudW0EwGxudW0ExmxudW0EzGxudW0E0mxudW0E0mxudW0E0mxudW0E0mxudW0E0mxudW0E0mxudW0E0mxvY2wE2GxvY2wE3mxvY2wE5G51bXIE6m51bXIE8G51bXIE9m51bXIE/G51bXIE/G51bXIE/G51bXIE/G51bXIE/G51bXIE/G51bXIE/G9udW0FAm9udW0FCG9udW0FDm9udW0FFG9udW0FFG9udW0FFG9udW0FFG9udW0FFG9udW0FFG9udW0FFHBudW0FGnBudW0FIHBudW0FJnBudW0FLHBudW0FLHBudW0FLHBudW0FLHBudW0FLHBudW0FLHBudW0FLHNtY3AFMnNtY3AFOHNtY3AFPnNtY3AFRHNtY3AFRHNtY3AFRHNtY3AFRHNtY3AFRHNtY3AFRHNtY3AFRHNzMDEFSnNzMDEFUHNzMDEFVnNzMDEFXHNzMDEFXHNzMDEFXHNzMDEFXHNzMDEFXHNzMDEFXHNzMDEFXHNzMDIFYnNzMDIFaHNzMDIFbnNzMDIFdHNzMDIFdHNzMDIFdHNzMDIFdHNzMDIFdHNzMDIFdHNzMDIFdHNzMDMFenNzMDMFgHNzMDMFhnNzMDMFjHNzMDMFjHNzMDMFjHNzMDMFjHNzMDMFjHNzMDMFjHNzMDMFjHNzMDQFknNzMDQFmHNzMDQFnnNzMDQFpHNzMDQFpHNzMDQFpHNzMDQFpHNzMDQFpHNzMDQFpHNzMDQFpHNzMDUFqnNzMDUFsHNzMDUFtnNzMDUFvHNzMDUFvHNzMDUFvHNzMDUFvHNzMDUFvHNzMDUFvHNzMDUFvHNzMDYFwnNzMDYFyHNzMDYFznNzMDYF1HNzMDYF1HNzMDYF1HNzMDYF1HNzMDYF1HNzMDYF1HNzMDYF1HNzMDcF2nNzMDcF4HNzMDcF5nNzMDcF7HNzMDcF7HNzMDcF7HNzMDcF7HNzMDcF7HNzMDcF7HNzMDcF7HRudW0F8nRudW0F+HRudW0F/nRudW0GBHRudW0GBHRudW0GBHRudW0GBHRudW0GBHRudW0GBHRudW0GBAAAAAEAAQAAAAEAAwAAAAEAAgAAAAEAAAAAAAIACAAJAAAAAQAOAAAAAQAQAAAAAQAPAAAAAQANAAAAAQBDAAAAAQBFAAAAAQBEAAAAAQBCAAAAAwA/AEAAQQAAAAIAEQASAAAAAQASAAAAAQA8AAAAAQA+AAAAAQA9AAAAAQA7AAAAAQAKAAAAAQAMAAAAAQALAAAAAQBHAAAAAQBJAAAAAQBIAAAAAQBGAAAAAQAwAAAAAQAyAAAAAQAxAAAAAQAvAAAAAQA4AAAAAQA6AAAAAQA5AAAAAQA3AAAAAQAFAAAAAQAHAAAAAQAGAAAAAQAEAAAAAQAUAAAAAQAWAAAAAQAVAAAAAQATAAAAAQAYAAAAAQAaAAAAAQAZAAAAAQAXAAAAAQAcAAAAAQAeAAAAAQAdAAAAAQAbAAAAAQAgAAAAAQAiAAAAAQAhAAAAAQAfAAAAAQAkAAAAAQAmAAAAAQAlAAAAAQAjAAAAAQAoAAAAAQAqAAAAAQApAAAAAQAnAAAAAQAsAAAAAQAuAAAAAQAtAAAAAQArAAAAAQA0AAAAAQA2AAAAAQA1AAAAAQAzAEsAmACYAJgAmAQmBCYEJgQmBxQHwA5QDlAOZg6IDogOiA6IDr4O5A8SDxIPEg8SDyYPJg8mDyYPOg86DzoPOg9OD04PTg9OD2APYA9gD2APeg96D3oPeg+8D7wPvA+8D9oP2g/aD9oP+A/4D/gP+BAqECoQKhAqEFwQXBBcEFwQjhCiENoQzBDMEMwQzBDaENoQ2hDaEQYAAQAAAAEACAACAcQA3wHnAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHoAekCQwI7AeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QH+AgACAQTcAgICAwIEAgUCBgIHAggCCQIKAgsCLwIPAhACEQIUAhUCFgIXAhgCGQIbAhwCHgIdAvsC/AL9Av4C/wMAAwEDAgMDAwQDBQMGAwcDCAMJAwoDCwMMAw0DDgMPAxADEQMSAxMDFAMVAxYDFwMYAxkDGgMbAxwDHQMeAx8DIAMhAyIDIwMkAyUDJgMnAygDKQMqAysDLAMtAy4DLwMwAzEDMgMzAzQDNQM2AzcDOAM5AzoDOwM8Az0DPgM/A0ADQQNCA0MDRQNEA0YDRwNIA0kDSgNLA0wDTQNOA08DUANRBKoEqwSsBK0ErgSvBLAEsQSyBLMEtAS1BLYEtwS4BLkEugS7BLwEvQS+BL8EwATBBMIEwwTEBMUB/wTGBMcEyATJBMoEywTMBM0EzgTPBNAE0QTSBNME1ATVBNcE2ATaAhoE2wIOBNYCEwINBNkCDAISAAEA3wAIACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgBlAGcAhQCSALAAsQCyALMAtAC1ALYAtwC4ALkA0QDSANMA1ADVANYA1wDYANkA2gDbANwA3QDeAN8A4ADhAOIA4wDkAOUA5gDnAOgBLAEwATIBOAE6ATwBPgE/AUUBRgF/AYUBigGNAkYCRwJJAksCTAJNAk4CTwJQAlECUgJTAlQCVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAoIChAKGAogCigKMAo4CkAKSApQClgKYApoCnAKeAqACogKkAqYCqAKqAqwCrgKxArMCtQK3ArkCuwK9Ar8CwQLEAsYCyALKAswCzgLQAtIC1ALYAtoC3ALeAuAC4gLkAuYC6ALqAuwC7gLwAvEC8wL1A1IDUwNUA1UDVgNXA1gDWgNbA1wDXQNeA18DYANhA2MDZANlA2YDZwNoA2kDeQN6A3sDfAN9A34DfwOAA4EDggODA4QDhQOGA4cDiAOJA4oDiwOMA40DjgO6A7wDvgPTA9kD3wRIBEoETgRWBFgEXQRpAAEAAAABAAgAAgF0ALcBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAvwDLwI7AfoEyQTKAfsB/AH9Af4B/wIABM0EzgTQBNME3AICAgMCBAIFAgYCBwIIAgkCCgILAfQB9QH2AfcB+AH5Ai8CDwIQAhECFAIVAhcCGQL9Av4C/wMAAwEDAgMDAwQDBQMGAwcDCAMJAwoDCwMMAw0DDgMPAxADEQMSAxMDFAMVAxYDFwMYA04DGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDKwMsAy0DLgMwAzEDMgMzAzQDNQM2AzcDOAM5AzoDOwM8Az0DPgM/A0ADQQNCA0MDRQNEA0YDRwNIA0kDSgNLA0wDTQNPA1ADUQTIBMsEzATPBNEE0gIBBNQEwATBBMIEwwTEBMUExgTHBNUE1wTYAhgE2gIaBNsC+wIOBNYCEwINBNkCFgIMAhIAAQC3AEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgCHAIwAkwDpAOoA6wDsAO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+AP8BAAEBAQIBAwEEAQUBBgEtATEBMwE5ATsBPQFAAUcCSgJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQJyAnMCdAJ1AnYCdwJ4AnkCegJ7AnwCfQJ+An8CgAKBAoMChQKHAokCiwKNAo8CkQKTApUClwKZApsCnQKfAqECowKlAqcCqQKrAq0CsgK0ArYCuAK6ArwCvgLAAsICxQLHAskCywLNAs8C0QLTAtUC2QLbAt0C3wLhAuMC5QLnAukC6wLtAu8C8gL0AvYDjwOQA5EDkgOTA5QDlQOWA5cDmAOZA5oDmwOcA50DngO7A70DvwPNA9QD2gPgBEYESQRLBE8EVwRZBFoEXgRqAAYAAAAGABIAKgBCAFoAcgCKAAMAAAABABIAAQCQAAEAAABKAAEAAQBNAAMAAAABABIAAQB4AAEAAABKAAEAAQBOAAMAAAABABIAAQBgAAEAAABKAAEAAQKtAAMAAAABABIAAQBIAAEAAABKAAEAAQOaAAMAAAABABIAAQAwAAEAAABKAAEAAQOcAAMAAAABABIAAQAYAAEAAABKAAEAAQQZAAIAAQCnAKsAAAAEAAAAAQAIAAEGHgA2AHIApACuALgAygD8AQ4BGAFKAWQBfgGQAboB7AH2AhgCMgJEAnYCiAKiAswC3gMQAxoDJAM2A2gDcgN8A4YDoAO6A8wD9gQoBDIEVARuBIAEsgTEBN4FCAUaBSQFLgU4BUIFbAWWBcAF6gYUAAYADgAUABoAIAAmACwCSwACAKcCTAACAKgCTgACAKkD8AACAKoEegACAKsD7gACAKwAAQAEBIcAAgCsAAEABAKIAAIAqAACAAYADASJAAIArASLAAIBogAGAA4AFAAaACAAJgAsAlMAAgCnAlQAAgCoBAoAAgCpBAgAAgCqBHwAAgCrBAYAAgCsAAIABgAMBHYAAgCoAqIAAgGiAAEABASNAAIArAAGAA4AFAAaACAAJgAsAlcAAgCnAlgAAgCoAqYAAgCpBBYAAgCqBH4AAgCrBBgAAgCsAAMACAAOABQEjwACAKgEkQACAKwCswACAaIAAwAIAA4AFAK1AAIAqASTAAIArAK3AAIBogACAAYADAOsAAIAqASVAAIArAAFAAwAEgAYAB4AJAR4AAIApwK9AAIAqAJbAAIAqQSXAAIArAK/AAIBogAGAA4AFAAaACAAJgAsAlwAAgCnAl0AAgCoAl8AAgCpBBwAAgCqBIAAAgCrBBoAAgCsAAEABASZAAIAqAAEAAoAEAAWABwCygACAKgEggACAKsEmwACAKwCzAACAaIAAwAIAA4AFALQAAIAqASdAAIArALWAAIBogACAAYADASfAAIArALaAAIBogAGAA4AFAAaACAAJgAsAmEAAgCnAmIAAgCoAuAAAgCpBDQAAgCqBIQAAgCrBDIAAgCsAAIABgAMBKEAAgCpBKMAAgCsAAMACAAOABQDnwACAKcDoQACAKgEpQACAKwABQAMABIAGAAeACQDpQACAKcCZQACAKgERAACAKkEQgACAKoEQAACAKwAAgAGAAwC8QACAKgEpwACAKwABgAOABQAGgAgACYALAJmAAIApwJnAAIAqAJpAAIAqQPxAAIAqgR7AAIAqwPvAAIArAABAAQEiAACAKwAAQAEAokAAgCoAAIABgAMBIoAAgCsBIwAAgGiAAYADgAUABoAIAAmACwCbgACAKcCbwACAKgECwACAKkECQACAKoEfQACAKsEBwACAKwAAQAEBHcAAgCoAAEABASOAAIArAABAAQEGQACAKwAAwAIAA4AFASQAAIAqASSAAIArAK0AAIBogADAAgADgAUArYAAgCoBJQAAgCsArgAAgGiAAIABgAMA60AAgCoBJYAAgCsAAUADAASABgAHgAkBHkAAgCnAr4AAgCoAnYAAgCpBJgAAgCsAsAAAgGiAAYADgAUABoAIAAmACwCdwACAKcCeAACAKgCegACAKkEHQACAKoEgQACAKsEGwACAKwAAQAEBJoAAgCoAAQACgAQABYAHALLAAIAqASDAAIAqwScAAIArALNAAIBogADAAgADgAUAtEAAgCoBJ4AAgCsAtcAAgGiAAIABgAMBKAAAgCsAtsAAgGiAAYADgAUABoAIAAmACwCfAACAKcCfQACAKgC4QACAKkENQACAKoEhQACAKsEMwACAKwAAgAGAAwEogACAKkEpAACAKwAAwAIAA4AFAOgAAIApwOiAAIAqASmAAIArAAFAAwAEgAYAB4AJAOmAAIApwKAAAIAqARFAAIAqQRDAAIAqgRBAAIArAACAAYADALyAAIAqASoAAIArAABAAQC9wACAKgAAQAEAvkAAgCoAAEABAL4AAIAqAABAAQC+gACAKgABQAMABIAGAAeACQCcgACAKcCcwACAKgCpwACAKkEFwACAKoEfwACAKsABQAMABIAGAAeACQEKgACAKcEKAACAKgELgACAKkELAACAKoEMAACAKwABQAMABIAGAAeACQEKwACAKcEKQACAKgELwACAKkELQACAKoEMQACAKwABQAMABIAGAAeACQEOAACAKcENgACAKgEPAACAKkEOgACAKoEPgACAKwABQAMABIAGAAeACQEOQACAKcENwACAKgEPQACAKkEOwACAKoEPwACAKwAAQAEBIYAAgCoAAIAEQAlACkAAAArAC0ABQAvADQACAA2ADsADgA9AD4AFABFAEkAFgBLAE0AGwBPAFQAHgBWAFsAJABdAF4AKgCBAIEALACDAIMALQCGAIYALgCJAIkALwCMAIwAMACXAJoAMQDPAM8ANQABAAAAAQAIAAEABgACAAEAAgLUAtUAAQAAAAEACAACAA4ABATdBN4E3wTgAAEABAKGAocCmAKZAAQAAAABAAgAAQAmAAIACgAcAAIABgAMAaMAAgBKAagAAgBYAAEABAGpAAIAWAABAAIASgBXAAQAAAABAAgAAQBEAAIACgAUAAEABAGkAAIATQABAAQBpgACAE0ABAAAAAEACAABAB4AAgAKABQAAQAEAaUAAgBQAAEABAGnAAIAUAABAAIASgGjAAEAAAABAAgAAQAGAZUAAQABAEsAAQAAAAEACAABAAYBJwABAAEAugABAAAAAQAIAAEABgGsAAEAAQA2AAEAAAABAAgAAgAcAAIB4wHkAAEAAAABAAgAAgAKAAIB5QHmAAEAAgAvAE8AAQAAAAEACAACAB4ADAIoAioCKQIrAiwCHwIgAiEBrgIjAiQCJQABAAwAJwAoACsAMwA1AEYARwBIAEsAUwBUAFUAAQAAAAEACAACAAwAAwImAicCJwABAAMASQBLAa4AAQAAAAEACAACAGYACAI9Ai0CLgIwAjECOQI6AjwAAQAAAAEACAACABYACAAbABUAFgAXABgAGQAdABQAAQAIAa0CIgRwBHEEcgRzBHQEdQABAAAAAQAIAAIAFgAIBHUCIgRwBHEEcgRzAa0EdAABAAgAFAAVABYAFwAYABkAGwAdAAEAAAABAAgAAgAWAAgAFQAWABcAGAAZABsAHQAUAAEACAItAi4CMAIxAjkCOgI8Aj0AAQAAAAEACAABAAYBaQABAAEAEwAGAAAAAQAIAAMAAQASAAEAUgAAAAEAAABKAAIAAgF8AXwAAAHUAd0AAQABAAAAAQAIAAEAKAHAAAEAAAABAAgAAgAaAAoCMgB6AHMAdAIzAjQCNQI2AjcCOAACAAEAFAAdAAAAAQAAAAEACAACACYAEAHUAdUB1gHXAdgB2QHaAdsB3AHdAkACPgJBAkICPwThAAEAEAAUABUAFgAXABgAGQAaABsAHAAdAE0ATgKtA5oDnAQZ",
59641   "Roboto-MediumItalic.ttf": "AAEAAAARAQAABAAQR1BPUyEcbY8AAhQcAABZakdTVULEnLdcAAJtiAAAGXxPUy8yoQuw+wAAAZgAAABgY21hcNhuDxIAABpsAAAGXGN2dCAElytKAAAjUAAAAFZmcGdte/lhqwAAIMgAAAG8Z2FzcAAIABMAAhQQAAAADGdseWZgubUGAAAtcAAB42poZG14LxpP7wAAFYAAAATsaGVhZPi2qwsAAAEcAAAANmhoZWEM2xKRAAABVAAAACRobXR4rRqYNAAAAfgAABOIbG9jYSKZqcwAACOoAAAJxm1heHAHEgLZAAABeAAAACBuYW1lRuRz4wACENwAAAMUcG9zdP9hAGQAAhPwAAAAIHByZXAbsfg2AAAihAAAAMwAAQAAAAIAALDh6v1fDzz1ABsIAAAAAADE8BEuAAAAANDbTpf6Qf3VCXgIcwACAAkAAgAAAAAAAAABAAAHbP4MAAAJN/pB/mwJeAgAAbMAAAAAAAAAAAAAAAAE4gABAAAE4gCPABYAVgAFAAEAAAAAAA4AAAIAAfIABgABAAMEGQH0AAUAAAWaBTMAAAEfBZoFMwAAA9EAZgIAAAACAAAAAAAAAAAA4AAK/1AAIX8AAAAhAAAAAEdPT0cAAQAA//0GAP4AAGYHmgIAIAABnwAAAAAEOgWwACAAIAACA5YAZAAKAAAACgAAAfkAAAH5AAACHwA3Ao4AoQTHADsEcwBCBb0AtQUAAC0BWgCQAr8AaALG/5QDeABnBF0APQG//4kClgA2AjUAMAMc/38EcwBgBHMA7wRzAAsEcwAmBHMACQRzAFoEcwBjBHMAhgRzADsEcwCOAhkAKwHi/5oD/AAyBGIAYgQUAC8D0ACVBvsAMgU0/6QE7wAnBRsAZQUcACcEbQAnBE0AJwVSAGsFjQAnAjsANQRZAAME7gAnBD0AJwbVACcFjAAnBWYAawUAACcFZgBkBOIAJwS5ACQEwACcBRkAWwUPAJsG3gC3BPP/wwTFAKEEtv/lAir/7wNIAKwCKv96A1sARAOK/3kCigDKBD0AIgRoABAEGgA4BGsAOwQ0ADsCygBfBHD/9wRZAA0CBQAfAfz/DAQXABECBQAfBssAEARbAA0EdQA5BGj/xwRyADsCxAAQBAsAHAKfADsEWgBKA+EAZAXOAHcD8f+5A9H/tQPx/+cCpAAwAf0AIAKk/5kFMgBbAfkAAAIY/+YEZQBMBJv/9gV8AAgExQBQAff/7ATc/9wDdADRBh4AXgOAAL4DzgBJBFUAgAKWADYGHgBeA8cA7wL9AOQEMwAbAukAVgLpAGcCkQDIBKH/3QPZAH0COwCeAgr/0wLpAOEDlQC+A84AAgWtALkGBgCxBjAAlgPQ/9IFNP+kBTT/pAU0/6QFNP+kBTT/pAU0/6QHVf+HBRsAZQRtACcEbQAnBG0AJwRtACcCOwA1AjsANQI7ADUCOwA1BTr//wWMACcFZgBrBWYAawVmAGsFZgBrBWYAawQtACMFZAAVBRkAWwUZAFsFGQBbBRkAWwTFAKEErwAnBMsAGwQ9ACIEPQAiBD0AIgQ9ACIEPQAiBD0AIgaXAA8EGgA4BDQAOwQ0ADsENAA7BDQAOwIUACICFAAiAhQAIgIUACIEjQBGBFsADQR1ADkEdQA5BHUAOQR1ADkEdQA5BHgAPQRvACoEWgBKBFoASgRaAEoEWgBKA9H/tQR+/80D0f+1BTT/pAQ9ACIFNP+kBD0AIgU0/6QEPQAiBRsAZQQaADgFGwBlBBoAOAUbAGUEGgA4BRsAZQQaADgFHAAnBQEAOwU6//8EiQA7BG0AJwQ0ADsEbQAnBDQAOwRtACcENAA7BG0AJwQ0ADwEbQAnBDQAOwVSAGsEcP/3BVIAawRw//cFUgBrBHD/9wVSAGsEcP/3BY0AJwRZAA0FjgAuBHcAKwI7ADUCFAAUAjsANQIUAB8COwA1AhQAIgI7/44CBf92AjsANQIUACIGlAA1BAEAHwRZAAMCIP8PBO4AJwQXABEEfwAhBD0AJwIFAB8EPQAnAgX/ogQ9ACcCmwAfBD0AJwLhAB8ETAAhAkcAHwWMACcEWwANBYwAJwRbAA0FjAAnBFsADQRbAA0FcgAjBG8AEQVmAGsEdQA5BWYAawR1ADkFZgBrBHUAOQeDAFAHDQBCBOIAJwLEABAE4gAnAsT/nATiACcCxAAQBLkAJAQLABwEuQAkBAsAHAS5ACQECwAcBLkAJAQLABwEwACcAp8AOwTAAJwCxwA7BMAAnAKf/+IFGQBbBFoASgUZAFsEWgBKBRkAWwRaAEoFGQBbBFoASgUZAFsEWgBKBRkAWwRaAEoG3gC3Bc4AdwTFAKED0f+1BMUAoQS2/+UD8f/nBLb/5QPx/+cEtv/lA/H/5wIGAB4FaABOAsT/SgVpAFsEhQA2BYMAWwTWAEoCIP8PBVIAawRw//cFjAAnBFsADQU0/6QEPQAiB1X/hwaXAA8FZAAVBG8AKgU0/6QEPQAiBG0AJwQ0ADsCO//JAhT/fgVmAGsEdQA5BOIAJwLEAAcFGQBbBFoASgS5ACQECwAcBMAAnAKfADsCIP8PBCUANgG5AIoD0gECA54BDQPIAO8DawD+AgUBAgKnAPoCRf+oA8QA3gMRAKwCY//uAAr9VAAK/dcACvz2AAr91gAK/L8ACvygAlUBLgQlAOgFNP+kAjsAngTR/74F8f/GAp//ygV6ABgFKf9YBVAAHQKgAAsFNP+kBO8AJwRdAC4Fnf+qBG0AJwS2/+UFjQAnBVoAXgI7ADUE7gAnBRr/sgbVACcFjAAnBHcAAAVmAGsFjwAuBQAAJwR3/9wEwACcBMUAoQXLAFIE8//DBYkAdQU8AAkCOwA1BMUAoQRrAD4ESAAoBG8AEQKgAG4ESABXBGsAPgSr/+UD+QB3BG8AOARIACgEBQBmBG8AEQSHAGwCoABuBH8AIQRS/6gEof/dA+EAZAP+AD4EdQA5BNcAXQRv/8sEIQA7BHcAOAQXAG4ESABXBa0AMgPx/7kFpwA/BmsAVAKgAEwESABXBHUAOQRIAFcGawBUBJkAUARjAG0Ex/8kBkoAVwRtACcEbQAnBdoAkQRdAC4FOgBnBLkAJAI7ADUCOwA1BFkAAwhQ/8oIVwAuBjQAoATuACcFhwAnBO0AmwWJACUFNP+kBOsAIwTvACcEXQAuBeL/hARtACcHcf+lBLsAHgWHACcFhwAnBQoALgWI/8oG1QAnBY0AJwVmAGsFjwAuBQAAJwUbAGUEwACcBO0AmwY4AFYE8//DBdUAJQVoAMUHawArB8YAKwX1AIkGzQAuBOoAIwUxAE8HJgAyBNv/sAQ9ACIEZQBDBHYAIgNKABgE2v+FBDQAOwZO/60EAQAWBH8AGQR/ABkEVgAiBIH/vwXfACIEfgAZBHUAOQR/ABkEaP/HBBoAOAPhAFMD0f+1BbAAPQPx/7kEuAAZBE4AcAZmABkGwQASBPoATwZIACIEUAAiBCUAIwZcACQEWP+2BDQAOwQ0ADsEWQANA0oAGAQlADsECwAcAgUAHwIUACIB/P8MBqf/vQa5ABkEcAANBFYAIgR/ABkD0f+1BH8AGQcbAGAGKQBEBOoAIwRPACEG+wArBd0AGQTv/64ESP+cBxQAPgYQADAGwgAUBcMAFgj1ADUHxgAiBAr/qgPc/7UFiQB1BacAPwVaAGIEbwA2BP0AqAP5AHcE/QCoA/kAdwk3AGsIRgA5BVoAZgRvADgHFwBiBh4ASwcbAGAGKQBEBP0AVgQzAEUE4wA4AAr85gAK/Q4ACv4rAAr+PAAK+kEACvpvBYcAJwR/ABkE6gAjBE8AIQT2ACcEbf/HBFIAIgOPABEEXf/8A0r/ywSdAC4ECgARB3H/pQZO/60EuwAeBAEAFgUKAC4EVgAiBQ4AIwSRACEFHgA3BC4AGQZsAKQFgwBsBY0AJwR+ABkHngAnBYkAEQgRAC4GygARBgUAZQTjAEsFGwBlBBoAOATAAJwD4QBTBMUAoQP5AHcExQChA/kAVATz/8MD8f+5BwQAnQVQAFYFaADFBE4AcAVUALkEWwCFBWcA5wRZAA0F/wBiBKj/9AX/AGIEqP/0AjsANQdx/6UGTv+tBQQAIwRgACEFiP/KBIH/vwWNAC4EbwARBY0AJwR+ABkFaADFBE4AcAbVACcF3wAiAjsANQU0/6QEPQAiBTT/pAQ9ACIHVf+HBpcADwRtACcENAA7BWgASAQlADYFaABIBCUANgdx/6UGTv+tBLsAHgQBABYEjAAvBIz/8AWHACcEfwAZBYcAJwR/ABkFZgBrBHUAOQVaAGIEbwA2BVoAYgRvADYFMQBPBCUAIwTtAJsD0f+1BO0AmwPR/7UE7QCbA9H/tQVoAMUETgBwBF0ALgNKABgGzQAuBkgAIgSsADMDQwAJBPP/wwPx/7kE8//DA/H/uQTqADAEawA7BsYARQayAEcGLACqBQoAYQRjAJIEJwCMB43/3gZ0/94HygAnBnUACwTnAEwEFgA9BYkAkAUAAHMFNgBWBEgAKAWI/8oEgf+/BTT/pAQ9ACIE7wAnBGgAEAUcACcEawA7BRwAJwRrADsFjQAnBFkADQTuACcEFwARBO4AJwQXABEEPQAnAgX/5AbVACcGywAQBtUAJwbLABAFjAAnBFsADQUAACcEaP/HBOIAJwLE/94EuQAkBAsAHATAAJwCnwA7BQ8AmwPhAGQFDwCbA+EAZAbeALcFzgB3Bt4AtwXOAHcG3gC3Bc4AdwbeALcFzgB3BLb/5QPx/+cFNP+kBD0AIgU0/6QEPQAiBTT/pAQ9ACIFNP+kBD0AIgU0/6QEPQAiBTT/pAQ9ACIFNP+kBD0AIgU0/6QEPQAiBTT/pAQ9ACIFNP+kBD0AIgU0/6QEPQAiBTT/pAQ9ACIEbQAnBDQAOwRtACcENAA7BG0AJwQ0ADsEbQAnBDQAOwRtACcENAA7BG0AJwQ0ADsEbQAnBDQAOwRtACcENAA7AjsANQIUACICO///AgX/5AVmAGsEdQA5BWYAawR1ADkFZgBrBHUAOQVmAGsEdQA5BWYAawR1ADkFZgBrBHUAOQVmAGsEdQA5BWkAWwSFADYFaQBbBIUANgVpAFsEhQA2BWkAWwSFADYFaQBbBIUANgUZAFsEWgBKBRkAWwRaAEoFgwBbBNYASgWDAFsE1gBKBYMAWwTWAEoFgwBbBNYASgWDAFsE1gBKBMUAoQPR/7UExQChA9H/tQTFAKED0f+1BMUAoQPR/7UFrP6zAx4A7AP/AAAH9AAAA/8AAAf0AAACrgAAAgQAAAFcAAAEZgAAAikAAAGfAAAA1QAAAAoAAAKXADYClwA2BQsAnAYKAIIGCgCCA4v/TgG9AK4BuQCKAcr/pAGlAM0DBgC3Aw0AlwL7/6EERQBpBID/+wLAAJ4D5QAzBYUAMwFrADYHdgCdAVoAkAKOAKECaQBdAmD/+QQ+ADcDiv/hAukAYwNMAG4ETf/DBJv/9gZJAA0GjgArCFsAJwdYACoGZAAQBIn/9ARzAE4F0QBCBB4AOwSIABAFP//kBV3/5gXBAMIDzgAxB/kAIwTsAO0E9wB9Bg8AtgayAIIGpwCIBnkAtQR4AEUFdQAfBL7/pwRqAJwEmAA0CA8ASQIm/xcEdQAwBGIAYgP8/9UEFAAXA/cAOgJTAGkCjgBmAez/zwT+AF8EjgBLBKIAXwb2AF8G9gBfBPQAXwaNABcACgAAB/v/qQg1AFwDhv/XBGP/pwSmADoEY/+nA6YACgQ2AC0ETgARBB4ADgQXABQFGwAuBBoAFAUKAC4FJgAuBKEAOwQl/4cCpwEGBL0ACgLpADMC6QAIAukAIwLpABYC6QAKAun/8QLp//QC6f/jAukAbQLpABcEBP/ZBXwAQwU1AHAEyAAAA6YAkwXjAIwEYwBwBGsAOQQlAGIEHgAOBEUACgSmADcEVQAKBKYAOgTCAAoF4gAKA6YACgREAAoDwv/yAfcAGATDAAoEjAA/A7IACgPMAAoEYgAKBGcAOQRIAAoEhf+bAf8A6wOPAQQD9gDcA/YAEwP2ANgD9gDXA48BBAOPAQUDjwEEBEb/pAQlAG0EZwA5BXAAYgQdAFUEegAqAgr/BwGw/7IEFP/WByb/wQcpAAoFdgBiBLwACgRZAAsFOv+DBhT/qQQvAAwEyAALBEUACgSw/8EELwByBT4ACgRzAF0GXAAKBt4ACgU7AEoF+wALBE8ACwRnABMGagAKBG//0gQM//UGav+pBIQACgT9AAoFTgBiBcwAQARDAG0Eqf+kBmwAYgRzAF0EcwAKBdoANwS3ADQELwAMBKYAOgROAAQD4wAeCAEACgTP/9kEbwAQBCYANwR/ADsDkgCkBIcANAR7/8cEhgA7BDQAOwRwADAFWgBvBYEAcQVmAC4FvQByBb8AcgQFAKsEaQAfA6YACgRA/38EpP/RAukAigLpAGQC6QB9AukAiQLpAJYC6QB7AukApgRT/9QEGAAnBm8AOgSaAEcEzwBOAiD/DwIg/w8CFQAiAhX/fQIVACIESAAKBGL/lwRi/5cEJQBiBIX/mwSF/5sEhf+bBIX/mwSF/5sEhf+bBIX/mwRnADkDzAAKA8wACgPMAAoDzAAKAfcAGAH3ABgB9wAYAfcAGATCAAoEpgA6BKYAOgSmADoEpgA6BKYAOgRrADkEmwB0BIcAjgRzAFoEcwAJBHMAJgRzAAsEawA5BGsAOQRrADkEJQBtBIX/mwSF/5sEhf+bBGcAOQRnADkEZwA5BGcAOQRiAAoDzAAKA8wACgPMAAoDzAAKA8wACgSMAD8EjAA/BIwAPwSMAD8EwwAKAfcADQH3ABgB9wAYAff/igH3ABgDwv/yBEQACgOmAAoDpgAKA6YACgOmAAoEwgAKBMIACgTCAAoEpgA6BKYAOgSmADoERQAKBEUACgRFAAoEHgAOBB4ADgQeAA4EHgAOBCUAYgQlAGIEJQBiBGsAOQRrADkEawA5BGsAOQRrADkEawA6BeMAjAQlAG0EJQBtBBT/1gQU/9YEFP/WBIX/mwQI/20E//94AjP/ewSw/9IEYf8sBNL/4gSF/5sESAAKA8wACgQU/9YEwwAKAfcAGAREAAoF4gAKBKYAOgRVAAoEJQBiBCUAbQRG/6QB9wAYBCUAbQPMAAoDpgAKBB4ADgH3ABgB9wAYA8L/8gREAAoELwByBIX/mwRIAAoDpgAKA8wACgTIAAsF4gAKBMMACgSmADoEvQAKBFUACgRnADkEJQBiBEb/pAQvAA0EwwAKBGcAOgQlAG0F2gA3BMgACwQvAHIFfABDBTT/pAQ9ACIEbQAnBDQAOwIU/+QAAAABAAAE5AkKBAAAAgICAwUFBgYCAwMEBQIDAgQFBQUFBQUFBQUFAgIEBQUECAYGBgYFBQYGAwUGBQgGBgYGBgUFBgYIBgUFAgQCBAQDBQUFBQUDBQUCAgUCCAUFBQUDBQMFBAcEBAQDAgMGAgIFBQYFAgUEBwQEBQMHBAMFAwMDBQQDAgMEBAYHBwQGBgYGBgYIBgUFBQUDAwMDBgYGBgYGBgUGBgYGBgUFBQUFBQUFBQcFBQUFBQICAgIFBQUFBQUFBQUFBQUFBAUEBgUGBQYFBgUGBQYFBgUGBgYFBQUFBQUFBQUFBQYFBgUGBQYFBgUGBQMCAwIDAgMCAwIHBQUCBgUFBQIFAgUDBQMFAwYFBgUGBQUGBQYFBgUGBQgIBgMGAwYDBQUFBQUFBQUFAwUDBQMGBQYFBgUGBQYFBgUIBwUEBQUEBQQFBAIGAwYFBgUCBgUGBQYFCAcGBQYFBQUDAgYFBgMGBQUFBQMCBQIEBAQEAgMDBAMDAAAAAAAAAwUGAwUHAwYGBgMGBgUGBQUGBgMGBggGBQYGBgUFBQcGBgYDBQUFBQMFBQUEBQUFBQUDBQUFBAQFBQUFBQUFBgQGBwMFBQUHBQUFBwUFBwUGBQMDBQkJBwYGBgYGBgYFBwUIBQYGBgYIBgYGBgYFBgcGBwYICQcIBgYIBQUFBQQFBQcFBQUFBQcFBQUFBQQEBgQFBQcIBgcFBQcFBQUFBAUFAgICBwgFBQUEBQgHBgUIBwYFCAcIBgoJBQQGBgYFBgQGBAoJBgUIBwgHBgUGAAAAAAAABgUGBQYFBQQFBAUFCAcFBQYFBgUGBQcGBgUJBgkIBwYGBQUEBQQFBAYECAYGBQYFBgUHBQcFAwgHBgUGBQYFBgUGBQgHAwYFBgUIBwUFBgUGBQgHBQUFBQYFBgUGBQYFBgUGBQYEBgQGBAYFBQQIBwUEBgQGBAYFCAgHBgUFCQcJBwYFBgYGBQYFBgUGBQYFBgUGBQYFBgUFAggICAgGBQYFBgMFBQUDBgQGBAgHCAcIBwgHBQQGBQYFBgUGBQYFBgUGBQYF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RvpHAkcKRzFHXkdmR25HdkgASAhIEEg9SEVITUiPSJdIx0jPSQ1JFUkdSZtJo0oDSnJKhUqYSqpKvErOSt9K9Et+S/lMLUytTT5Nm03qTnFOok6qTwVPDU8VT4xPlE/sUE9Qt1EnUW9RulIqUjJSlFMPUyJTNFNGU1hTalPqVERUUFTPVOZU+VVhVXhV91ZtVnVWiFaQVw5XhVfgV/dYDlggWF9YZ1jDWMtY01ksWTRZoVopWmRadlp+Wspa0lraWuJa6lryWvpbAltHW8JbylwCXElciVzVXTBdmF3pXmle9V9VX11f22BcYINg3GDkYVNh6WIkYjZiiGLRYxxjdWN9Y61jtWQLZDhkQGTgZOhlIGVoZahl8GZLZrFnAGdzZ/5oXWh0aIZpBWkcaYVpjWmVaahpsGopaqBrCmshazhrSWuIa/lsZWzSbUBty25YbqVu9G9hb9BwSHC6cUxx3HJ5cyhzMHM4c7V0JXRpdK50xnTedOp09nVqddh2s3eIeBh4qHkFeV95k3mweel6AHoXevJ7YXt8e5d8BHxzfM99S317faV95n4ofoR+037ffut+938Dfw9/G391f8yALICKgNyBM4E/gUuBmIHpgk+CqYNUg++D+4QHhBOEH4QnhC+Ee4TLhNeE44UshXKFfoWKheGGMYZ2hn6HAIeNh5mHpYeth7+H0YgziI6ImoimiQmJZ4lziX+Ji4mXiaOJr4m3icmJ24nuigGKCYoRiiOKNIqniq+KworUiueK+osNix+Lhovni/6MFIwnjDqMTYxfjGeMb4yCjJSMp4y5jMuM3IzvjQGNFI0sjT+NUY1djWmNhY2hjbCNwI3MjdiOMo6JjtyO5I9Oj+eQY5DakU2Ru5Iukp2TEJOCk+OUOpSTlOqVb5V3lYOVj5WblaeVs5W/lcuV15Xjle+V+5YHlhmWK5Y3lkOWT5ZblnKWhJaQlpyWqJa0lsaW2JbklvCW/JcIlxSXIJcyl0OXT5dbl3KXiZegl7eXypfdl+mX9ZgBmA2YGZglmDeYSZhhmHiYkJinmL+Y1pjumQWZIJk6mVKZaZl8mY6ZoZmzmcaZ2Jnzmg6aGpommjiaSppcmm2ahZqcmrSay5rjmvqbEpspm0SbXptwm4Kbjpuam6abspvEm9ab7pwFnB2cNJxMnGOce5ySnK2cx5zenPWdDJ0jnTqdUZ1o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A/wDXgAA////pP5sBK4FsAImACUAAAAHAXABbwAD//8AIv5wA9wEUAImAEUAAAAHAXAAqQAH//8AJ/6bBLwFsAImACYAAAAHAXYElwAK//8AEP6IBA8GAAImAEYAAAAHAXYEpf/3//8AJ/6bBOAFsAImACgAAAAHAXYEcwAK//8AO/6RBIgGAAImAEgAAAAHAXYEkAAA//8AJ/35BOAFsAImACgAAAAHA6sBAf6S//8AO/35BIgGAAImAEgAAAAHA6sBHv6S//8AJ/6bBYcFsAImACwAAAAHAXYFAAAK//8ADf6bA/kGAAImAEwAAAAHAXYEfwAK//8AJwAABXEHNgImAC8AAAEHAHcBpQE2AAkAsAQvsA/cMDEA//8AEQAABHUHPQImAE8AAAEHAHcBowE9AAkAsAQvsA/cMDEA//8AJ/7cBXEFsAImAC8AAAAHAXYE0QBL//8AEf7HBEoGAAImAE8AAAAHAXYEYAA2//8AJ/6bA8MFsAImADAAAAAHAXYElwAK////5P6bAhcGAAImAFAAAAAHAXYDRAAK//8AJwAABs4HNgImADEAAAEHAHcCvgE2ABMAsABFWLACLxuxAh8+WbAR3DAxAP//ABAAAAZoBgACJgBRAAABBwB3ApgAAAAJALADL7Ak3DAxAP//ACf+mwbOBbACJgAxAAAABwF2BasACv//ABD+mwZoBFICJgBRAAAABwF2Ba4ACv//ACf+lwWGBbACJgAyAAAABwF2BQIABv//AA3+mwP6BFICJgBSAAAABwF2BGwACv//ACcAAAUEB0ICJgA0AAABBwB3AasBQgAJALADL7AW3DAxAP///8f+YARtBfcCJgBUAAABBwB3AZv/9wAJALANL7Ah3DAxAP//ACf+mwTYBbACJgA2AAAABwF2BJgACv///97+mwLvBFMCJgBWAAAABwF2Az4ACv//ACT+kQS7BccCJgA3AAAABwF2BLAAAP//ABz+iAPEBFACJgBXAAAABwF2BGL/9///AJz+lAUiBbACJgA4AAAABwF2BJ8AA///ADv+kQKuBUECJgBYAAAABwF2A/UAAP//AJsAAAWBBzcCJgA6AAABBwFuAN0BQwAJALABL7AR3DAxAP//AGQAAAQNBewCJgBaAAABBgFuFvgACQCwAS+wEdwwMQD//wCb/psFgQWwAiYAOgAAAAcBdgTV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AesB7AHtAe4B7wHwAfEB8gJSAlQCWAJaAlwCXgJiAmQCagJsAnACcgJ0AnYCegJ8An4CgAKaAqICpAKqArADhwOOA5MDlgACAAAAAgAKO9oAAQNsAAQAAAGxBtI6+jr6BvwHUjfeI2I7mDuqOHYHWDiWOJY43jTeDqg4ljiWO6omhAqSCxQ1MDjeNI43uDdKOOQPYgt+OFQ2GjiMC8AM6gz0N643rji4NhoO1g3qOW4OTDeoOW4OZjfeN9433jfeN9433juYOHY4djh2OHY4ljiWOJY4ljuqOJY7qjuqO6o7qjuqON443jjeON445DhUOFQ4VDhUOFQ4VDiMOIw4jDiMN644uDi4OLg4uDi4OW42GjluN944VDfeOFQ33jhUO5g7mDuYO5g7qjuqOHY4jDh2OIw4djiMOHY4jDh2OIw4ljeuOJY4ljiWOJY4ljjeNN4OqA6oDqgOqDiWN644ljeuOJY3rjeuO6o4uDuqOLg7qji4DtYO1g7WNTA1MDUwON443jjeON443jjeN7g45DluOOQPYg9iD2I33jhUNTAO6Dr6N944djiWOJY7qjjkN94jYjZ+N944dg9iOJY7qjiWNN433jiWOJYPhDuqJoQQfjUwOOQRfDdKElo4ljjkN64S+DluEv43rhW8OW4Xlji4GKgYwhjIGM4ayBrOGwQbNji4OHY4dhu0Nn44ljiWON4dKh7cIJo03jY0OJY33iHQI2I2fiNsOHY3SiW6OJY03jiWOJY4ljuqJoQ7mDUwNjQ3SjiWOJYmpihAND4pHingKm44VCrMK6Y3QCwwOIw3qCz6LSQ4uDYaLoo5bjYaN6gxEDFOMoA0aDYaMwI4jDiMN0AziDOyNAg5bjQ+NGg33ji4NI45bjSOOW40tDYaNn43QDZ+N0o3qDTeNN403jTeOJY7mDUwOOQ5bjjkN0o3qDeuOJY3SjeoOJY4ljiWN944VDfeOFQ4djiMOIw4jDdKN6g7qji4OLg2GjY0OW42NDluNjQ5bjZ+N0A3QDdKN6g33jhUOJY3rje4N7g3uDfeOFQ33jhUN944VDfeOFQ33jhUN944VDfeOFQ33jhUN944VDfeOFQ33jhUN944VDh2OIw4djiMOHY4jDh2OIw4djiMOHY4jDh2OIw4djiMOJY4ljuqOLg7qji4O6o4uDuqOLg7qji4O6o4uDuqOLg4uDjeON445DluOOQ5bjjkOW445DluO6o6+jmIOvo6+jr6Ovo6+jsAOwo7HDsuO0A7XjtoO3I7mDuqO6oAAQGxAAQABgALAAwAEwAlACYAJwAoACkAKgAsAC0ALgAvADAAMQAyADMANAA1ADYAOAA5ADoAOwA8AD0APgA/AEUARgBJAEoATABPAFEAUgBTAFQAVgBYAFoAWwBcAF0AXwCDAIQAhQCGAIcAiACKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJwAnQCeAJ8AoACjAKQApQCmAKcAqACrAKwArQCuALQAtQC2ALcAuAC5AMAAwQDCAMMAxADFAMYAxwDIAMkAywDNAM8A0QDTANUA1gDXANgA2QDaANsA3ADdAN4A5wDoAOsA7QDvAPEA8wD3APkA/AD+AQABAgEGAQcBCAEJAQoBCwEMAQ8BEAERARIBEwEUARgBGgEcASUBJwEpASsBLQEvATEBMwE1ATcBOQE6ATsBPAE+AUABTgFPAWIBZQFmAXkBewF8AX0BfgF/AYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZIBkwGUAZUBlgGXAZgBmgGbAZ4BoQGjAaYBpwGpAa0BrgGvAbEBsgGzAbQBtQG2AbgBuQG8AcMBxAHFAcYByQHKAcsBzAHNAc4BzwHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3QHeAd8B4AHhAeMB5AHlAeYB6AHpAesB7AHtAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6Af0CAQIDAgUCBgIHAggCCQIMAg0CDwIQAhECEwIUAhYCFwIcAh0CIQIlAiYCKQI2AjcCOAI5AjoCRAJRAlICUwJUAlgCWQJcAl4CYAJiAmQCbAJuAnACcQJyAnQCdQJ9AoICgwKEAosCjwKRApICkwKUApUCmAKZApsCnQKeAp8CqAKpAq0CrwKwArECsgKzArQCtQK4ArkCvQK+Ar8C1gLXAuYC5wL4AvoC/AMCAwMDBAMFAwYDBwMIAwkDCgMLAwwDDQMOAw8DEAMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDLAMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDQwNGA0gDVANVA1YDVwNYA1kDWgNbA1wDcANxA3MDdAN1A34DfwPZA9sD3APeA+ED4gPpA+wEMQQzBDQACgA4/8QBJf/EASf/xAFi/8QBxf/EAc7/xAHl/8QCYv/EAm7/xAJ2/8QAFQA6ABQAOwAmAD0AFgCgABYBNwAmATkAFgE7ABYBfwAWAZUAFgGbABYCNwAUAjkAFAJwABYCcgAWAvgAJgL6ACYC/AAmA1QAFgNWABYDWAAWA1oAFgABABP/CADOABD+7gAS/u4AJf9AAC7/MAA4ABQARf/eAEf/6wBI/+sASf/rAEv/6wBT/+sAVf/rAFb/5gBZ/+oAWv/oAF3/6ACD/0AAhP9AAIX/QACG/0AAh/9AAIj/QACj/94ApP/eAKX/3gCm/94Ap//eAKj/3gCq/+sAq//rAKz/6wCt/+sArv/rALX/6wC2/+sAt//rALj/6wC5/+sAvP/qAL3/6gC+/+oAv//qAMD/6ADC/+gAw/9AAMT/3gDF/0AAxv/eAMf/QADI/94Ayv/rAMz/6wDO/+sA0P/rANL/6wDW/+sA2P/rANr/6wDc/+sA3v/rAOD/6wDi/+sA5P/rAOb/6wD3/zABEP/rARL/6wEU/+sBFv/rASUAFAEnABQBLP/qAS7/6gEw/+oBMv/qATT/6gE2/+oBOv/oAUb/6wFI/+oBTv9AAU//3gFiABQBef9AAYL/QAGF/0ABjP9AAZz/6wGg/+oBof/rAaP/6AGt/+gBr//rAbL/6wGz/+sBtf/qAbv/6gG8/+sBvf/qAcUAFAHL/zABzgAUAdP/QAHlABQB8//eAfj/6wIB/+sCBP/rAgb/6AIH/+sCE//rAhT/6wIX/+sCIf/oAin/QAI2/+sCOP/oAjr/6AI8/+sCQP/rAkT/6wJiABQCa//rAm3/6wJuABQCcf/oAnYAFAKS/0ACk//eApT/QAKV/94Cmf/rApv/6wKd/+sCqf/rAqv/6wKt/+sCsf/oArP/6AK1/+gCw//rAsT/6wLF/+sCz//rAtb/QALX/94DAv9AAwP/3gME/0ADBf/eAwb/QAMH/94DCP9AAwn/3gMK/0ADC//eAwz/QAMN/94DDv9AAw//3gMQ/0ADEf/eAxL/QAMT/94DFP9AAxX/3gMW/0ADF//eAxj/QAMZ/94DG//rAx3/6wMf/+sDIf/rAyP/6wMl/+sDJ//rAyn/6wMv/+sDMf/rAzP/6wM1/+sDN//rAzn/6wM7/+sDPf/rAz//6wNB/+sDQ//rA0X/6wNH/+oDSf/qA0v/6gNN/+oDT//qA1H/6gNT/+oDVf/oA1f/6ANZ/+gDW//oA3L+7gN2/u4Dev7uA3v+7gPs/8AAIAA4/98AOv/kADv/7AA9/90AoP/dASX/3wEn/98BN//sATn/3QE7/90BYv/fAX//3QGV/90Bm//dAcX/3wHO/98B5f/fAjf/5AI5/+QCYv/fAm7/3wJw/90Ccv/dAnb/3wL4/+wC+v/sAvz/7ANU/90DVv/dA1j/3QNa/90D7AAOABoAOP/OADr/7QA9/9AAoP/QASX/zgEn/84BOf/QATv/0AFi/84Bf//QAZX/0AGb/9ABxf/OAc7/zgHl/84CN//tAjn/7QJi/84Cbv/OAnD/0AJy/9ACdv/OA1T/0ANW/9ADWP/QA1r/0AAQAC7/7gA5/+4AnP/uAJ3/7gCe/+4An//uAPf/7gEr/+4BLf/uAS//7gEx/+4BM//uATX/7gHL/+4DRv/uA0j/7gBKAAYAEAALABAADQAUAEEAEgBH/+gASP/oAEn/6ABL/+gAVf/oAGEAEwCq/+gAq//oAKz/6ACt/+gArv/oAMr/6ADM/+gAzv/oAND/6ADS/+gA1v/oANj/6ADa/+gA3P/oAN7/6ADg/+gA4v/oAOT/6ADm/+gBFv/oAUb/6AFmABABnP/oAaH/6AGy/+gBs//oAfj/6AIE/+gCB//oAhP/6AIU/+gCF//oAjz/6AJA/+gCRP/oAmv/6AJt/+gCmf/oApv/6AKd/+gCq//oAsP/6ALE/+gCxf/oAs//6AMb/+gDHf/oAx//6AMh/+gDI//oAyX/6AMn/+gDKf/oAz3/6AM//+gDQf/oA0X/6ANwABADcQAQA3MAEAN0ABADdQAQA34AEAN/ABAAAgIF/9YDcf+YAD0AR//sAEj/7ABJ/+wAS//sAFX/7ACq/+wAq//sAKz/7ACt/+wArv/sAMr/7ADM/+wAzv/sAND/7ADS/+wA1v/sANj/7ADa/+wA3P/sAN7/7ADg/+wA4v/sAOT/7ADm/+wBFv/sAUb/7AGc/+wBof/sAbL/7AGz/+wB+P/sAgT/7AIH/+wCE//sAhT/7AIX/+wCPP/sAkD/7AJE/+wCa//sAm3/7AKZ/+wCm//sAp3/7AKr/+wCw//sAsT/7ALF/+wCz//sAxv/7AMd/+wDH//sAyH/7AMj/+wDJf/sAyf/7AMp/+wDPf/sAz//7ANB/+wDRf/sABgAU//iALX/4gC2/+IAt//iALj/4gC5/+IBEP/iARL/4gEU/+IBr//iAbz/4gIB/+ICNv/iAqn/4gKt/+IDL//iAzH/4gMz/+IDNf/iAzf/4gM5/+IDO//iA0P/4gNxABgABgAQ/4QAEv+EA3L/hAN2/4QDev+EA3v/hAAQAC7/7AA5/+wAnP/sAJ3/7ACe/+wAn//sAPf/7AEr/+wBLf/sAS//7AEx/+wBM//sATX/7AHL/+wDRv/sA0j/7AALAFv/zAPW/9cD1/+4A9j/7gPZ/70D3P/yA97/8gPm//ED6v/zA+wAEwP3/7cABABKABQAWAAyAFsAEQNxABAAHgAG//IAC//yAFr/8wBd//MAwP/zAML/8wE6//MBZv/yAaP/8wGt//MCBf/1Agb/8wIh//MCOP/zAjr/8wJx//MCsf/zArP/8wK1//MDVf/zA1f/8wNZ//MDW//zA3D/8gNx//IDc//yA3T/8gN1//IDfv/yA3//8gAIAFv/5QGW/8sBuP/kA9z/7APe/+wD5v/rA+r/7QPsAA0APgAn//MAK//zADP/8wA1//MAiv/zAJX/8wCW//MAl//zAJj/8wCZ//MAm//zAMn/8wDL//MAzf/zAM//8wDf//MA4f/zAOP/8wDl//MBD//zARH/8wET//MBFf/zAUX/8wFS//MBfv/zAYn/8wGQ//MBqwANAcf/8wHh//MB5P/zAiP/8wI1//MCO//zAj3/8wI///MCQf/zAkP/8wJq//MCbP/zAqj/8wKq//MCrP/zAs7/8wMu//MDMP/zAzL/8wM0//MDNv/zAzj/8wM6//MDPP/zAz7/8wNA//MDQv/zA0T/8wNc//MEMf/zBDL/8wQ0//MENf/zAD8AJ//mACv/5gAz/+YANf/mAIr/5gCV/+YAlv/mAJf/5gCY/+YAmf/mAJv/5gDJ/+YAy//mAM3/5gDP/+YA3//mAOH/5gDj/+YA5f/mAQ//5gER/+YBE//mARX/5gFF/+YBUv/mAX7/5gGJ/+YBkP/mAZb/wgGrABABx//mAeH/5gHk/+YCI//mAjX/5gI7/+YCPf/mAj//5gJB/+YCQ//mAmr/5gJs/+YCqP/mAqr/5gKs/+YCzv/mAy7/5gMw/+YDMv/mAzT/5gM2/+YDOP/mAzr/5gM8/+YDPv/mA0D/5gNC/+YDRP/mA1z/5gQx/+YEMv/mBDT/5gQ1/+YANwAl/+QAPP/SAD3/0wCD/+QAhP/kAIX/5ACG/+QAh//kAIj/5ACg/9MAw//kAMX/5ADH/+QBOf/TATv/0wFO/+QBef/kAX//0wGC/+QBhf/kAYz/5AGV/9MBl//SAZv/0wGr/+IB0//kAdn/0gHo/9ICKf/kAlj/0gJw/9MCcv/TAnT/0gKD/9ICkv/kApT/5AKe/9ICvv/SAtb/5AMC/+QDBP/kAwb/5AMI/+QDCv/kAwz/5AMO/+QDEP/kAxL/5AMU/+QDFv/kAxj/5ANU/9MDVv/TA1j/0wNa/9MAJwAQ/0YAEv9GACX/zQCD/80AhP/NAIX/zQCG/80Ah//NAIj/zQDD/80Axf/NAMf/zQFO/80Bef/NAYL/zQGF/80BjP/NAbH/8gHT/80CKf/NApL/zQKU/80C1v/NAwL/zQME/80DBv/NAwj/zQMK/80DDP/NAw7/zQMQ/80DEv/NAxT/zQMW/80DGP/NA3L/RgN2/0YDev9GA3v/RgABAasADgCvAEf/3ABI/9wASf/cAEv/3ABR/8EAUv/BAFP/1gBU/8EAVf/cAFn/3QBa/+EAXf/hAKr/3ACr/9wArP/cAK3/3ACu/9wAtP/BALX/1gC2/9YAt//WALj/1gC5/9YAvP/dAL3/3QC+/90Av//dAMD/4QDC/+EAyv/cAMz/3ADO/9wA0P/cANL/3ADW/9wA2P/cANr/3ADc/9wA3v/cAOD/3ADi/9wA5P/cAOb/3AEH/8EBCf/BAQv/wQEM/8EBEP/WARL/1gEU/9YBFv/cASz/3QEu/90BMP/dATL/3QE0/90BNv/dATr/4QFG/9wBSP/dAZz/3AGe/8EBoP/dAaH/3AGj/+EBpf/mAaf/wQGo/+sBqf/pAa3/4QGu//ABr//WAbD/5wGy/9wBs//cAbT/4wG1/90Btv/OAbj/1AG5/9sBu//dAbz/1gG9/90B9v/BAfj/3AH7/8EB/P/BAf3/wQH//8ECAP/BAgH/1gIC/8ECA//BAgT/3AIG/+ECB//cAgn/wQIL/8ECDP/BAg//wQIR/8ECE//cAhT/3AIW/8ECF//cAh3/wQIf/8ECIP/BAiH/4QI2/9YCOP/hAjr/4QI8/9wCQP/cAkT/3AJN/8ECXf/BAmX/wQJn/8ECa//cAm3/3AJx/+ECiv/BAoz/wQKQ/8ECmf/cApv/3AKd/9wCpf/BAqf/wQKp/9YCq//cAq3/1gKx/+ECs//hArX/4QK5/8ECu//BAr3/wQLD/9wCxP/cAsX/3ALP/9wC5//BAxv/3AMd/9wDH//cAyH/3AMj/9wDJf/cAyf/3AMp/9wDL//WAzH/1gMz/9YDNf/WAzf/1gM5/9YDO//WAz3/3AM//9wDQf/cA0P/1gNF/9wDR//dA0n/3QNL/90DTf/dA0//3QNR/90DU//dA1X/4QNX/+EDWf/hA1v/4QB2AAb/2gAL/9oAR//wAEj/8ABJ//AAS//wAFX/8ABZ/+8AWv/cAF3/3ACq//AAq//wAKz/8ACt//AArv/wALz/7wC9/+8Avv/vAL//7wDA/9wAwv/cAMr/8ADM//AAzv/wAND/8ADS//AA1v/wANj/8ADa//AA3P/wAN7/8ADg//AA4v/wAOT/8ADm//ABFv/wASz/7wEu/+8BMP/vATL/7wE0/+8BNv/vATr/3AFG//ABSP/vAWb/2gGc//ABoP/vAaH/8AGj/9wBqP/sAasADwGt/9wBsP/qAbL/8AGz//ABtP/OAbX/7wG2/+cBu//vAb3/7wH4//ACBP/wAgb/3AIH//ACE//wAhT/8AIX//ACIf/cAjj/3AI6/9wCPP/wAkD/8AJE//ACa//wAm3/8AJx/9wCmf/wApv/8AKd//ACq//wArH/3AKz/9wCtf/cAsP/8ALE//ACxf/wAs//8AMb//ADHf/wAx//8AMh//ADI//wAyX/8AMn//ADKf/wAz3/8AM///ADQf/wA0X/8ANH/+8DSf/vA0v/7wNN/+8DT//vA1H/7wNT/+8DVf/cA1f/3ANZ/9wDW//cA3D/2gNx/9oDc//aA3T/2gN1/9oDfv/aA3//2gBEABAADAASAAwAR//nAEj/5wBJ/+cAS//nAFX/5wCq/+cAq//nAKz/5wCt/+cArv/nAMr/5wDM/+cAzv/nAND/5wDS/+cA1v/nANj/5wDa/+cA3P/nAN7/5wDg/+cA4v/nAOT/5wDm/+cBFv/nAUb/5wGc/+cBof/nAasADwGy/+cBs//nAfj/5wIE/+cCB//nAhP/5wIU/+cCF//nAjz/5wJA/+cCRP/nAmv/5wJt/+cCmf/nApv/5wKd/+cCq//nAsP/5wLE/+cCxf/nAs//5wMb/+cDHf/nAx//5wMh/+cDI//nAyX/5wMn/+cDKf/nAz3/5wM//+cDQf/nA0X/5wNyAAwDdgAMA3oADAN7AAwABgG0/+oB9//uAgX/1QIP/+0CY//sAtH/7AABAgX/wAABAbQAIAB+AAYADAALAAwAR//oAEj/6ABJ/+gASgAMAEv/6ABT/+oAVf/oAFoACwBdAAsAqv/oAKv/6ACs/+gArf/oAK7/6AC1/+oAtv/qALf/6gC4/+oAuf/qAMAACwDCAAsAyv/oAMz/6ADO/+gA0P/oANL/6ADW/+gA2P/oANr/6ADc/+gA3v/oAOD/6ADi/+gA5P/oAOb/6AEQ/+oBEv/qART/6gEW/+gBOgALAUb/6AFmAAwBnP/oAaH/6AGjAAsBq/+QAa0ACwGv/+oBsAALAbL/6AGz/+gBtAAMAbz/6gH4/+gCAf/qAgT/6AIGAAsCB//oAhP/6AIU/+gCF//oAiEACwI2/+oCOAALAjoACwI8/+gCQP/oAkT/6AJr/+gCbf/oAnEACwKZ/+gCm//oAp3/6AKp/+oCq//oAq3/6gKxAAsCswALArUACwLD/+gCxP/oAsX/6ALP/+gDG//oAx3/6AMf/+gDIf/oAyP/6AMl/+gDJ//oAyn/6AMv/+oDMf/qAzP/6gM1/+oDN//qAzn/6gM7/+oDPf/oAz//6ANB/+gDQ//qA0X/6ANVAAsDVwALA1kACwNbAAsDcAAMA3EADANzAAwDdAAMA3UADAN+AAwDfwAMA9cADQPZAA4D2v/1A9z/7APe/+0D5v/sA+r/7gPs/78D9wANAAECBf/iAA0AXP/tAF7/7QE9/+0BP//tAUH/7QH5/+0CBf/AAgj/7QJZ/+0Cdf/tAoT/7QKf/+0Cv//tAAwAXP/yAF7/8gE9//IBP//yAUH/8gH5//ICCP/yAln/8gJ1//IChP/yAp//8gK///IAHwBa//QAXP/yAF3/9ABe//MAwP/0AML/9AE6//QBPf/zAT//8wFB//MBo//0Aa3/9AH5//ICBv/0Agj/8gIh//QCOP/0Ajr/9AJZ//ICcf/0AnX/8gKE//ICn//yArH/9AKz//QCtf/0Ar//8gNV//QDV//0A1n/9ANb//QAXQAG/8oAC//KADj/0gA6/9QAPP/0AD3/0wBa/+YAXP/vAF3/5gCg/9MAwP/mAML/5gEl/9IBJ//SATn/0wE6/+YBO//TAWL/0gFm/8oBf//TAZX/0wGX//QBm//TAaP/5gGt/+YBxf/SAc7/0gHR/+0B2f/0AeX/0gHm/+0B6P/0Aer/4QHv/9QB+f/vAgX/yQIG/+YCCP/vAg//0QIh/+YCJP/lAjf/1AI4/+YCOf/UAjr/5gJC/+MCWP/0Aln/7wJi/9ICY//EAm7/0gJw/9MCcf/mAnL/0wJ0//QCdf/vAnb/0gJ4/+ECev/hAoP/9AKE/+8Cjf/hAp7/9AKf/+8CsP/tArH/5gKy/+0Cs//mArT/7QK1/+YCtv/hAr7/9AK//+8Cxv/UAsf/9QLI/+cC0P9kAtH/yQNU/9MDVf/mA1b/0wNX/+YDWP/TA1n/5gNa/9MDW//mA3D/ygNx/8oDc//KA3T/ygN1/8oDfv/KA3//ygBsAAb/wAAL/8AAOP+dADr/xwA8//AAPf+rAFH/0gBS/9IAVP/SAKD/qwC0/9IBB//SAQn/0gEL/9IBDP/SASX/nQEn/50BOf+rATv/qwFi/50BZv/AAX//qwGV/6sBl//wAZv/qwGe/9IBp//SAcX/nQHM//UBzv+dAdH/6gHZ//AB3v/1AeX/nQHm/+oB6P/wAer/5QHv/8EB9v/SAfv/0gH8/9IB/f/SAf//0gIA/9ICAv/SAgP/0gIF/80CCf/SAgv/0gIM/9ICD//SAhH/0gIW/9ICHf/SAh//0gIg/9ICN//HAjn/xwJN/9ICWP/wAl3/0gJi/50CY//MAmX/0gJn/9ICbv+dAnD/qwJy/6sCdP/wAnb/nQJ4/+UCev/lAn7/3wKD//ACh//1Aor/0gKM/9ICjf/lApD/0gKe//ACpf/SAqf/0gKw/+oCsv/qArT/6gK2/+UCuf/SArv/0gK9/9ICvv/wAsb/zgLI/+oCyv/1AtD/ngLR/84C1P/1Auf/0gNU/6sDVv+rA1j/qwNa/6sDcP/AA3H/wANz/8ADdP/AA3X/wAN+/8ADf//AAG8ABv+xAAv/sQA4/54AOv/FADz/8gA9/6gAUf/PAFL/zwBU/88AXP/vAKD/qAC0/88BB//PAQn/zwEL/88BDP/PASX/ngEn/54BOf+oATv/qAFi/54BZv+xAX//qAGV/6gBl//yAZv/qAGe/88Bp//PAcX/ngHO/54B0f/sAdn/8gHl/54B5v/sAej/8gHq/+EB7//CAfb/zwH5/+8B+//PAfz/zwH9/88B///PAgD/zwIC/88CA//PAgX/xgII/+8CCf/PAgv/zwIM/88CD//PAhH/zwIW/88CHf/PAh//zwIg/88CN//FAjn/xQJN/88CWP/yAln/7wJd/88CYv+eAmP/wAJl/88CZ//PAm7/ngJw/6gCcv+oAnT/8gJ1/+8Cdv+eAnj/4QJ6/+ECfv/fAoP/8gKE/+8Civ/PAoz/zwKN/+ECkP/PAp7/8gKf/+8Cpf/PAqf/zwKw/+wCsv/sArT/7AK2/+ECuf/PArv/zwK9/88Cvv/yAr//7wLG/80CyP/oAtD/nwLR/8YC5//PA1T/qANW/6gDWP+oA1r/qANw/7EDcf+xA3P/sQN0/7EDdf+xA37/sQN//7EATQA4/74AUf/hAFL/4QBU/+EAWv/vAF3/7wC0/+EAwP/vAML/7wEH/+EBCf/hAQv/4QEM/+EBJf++ASf/vgE6/+8BYv++AZ7/4QGj/+8Bp//hAa3/7wHF/74Bzv++AeX/vgHv/8kB9v/hAfv/4QH8/+EB/f/hAf//4QIA/+ECAv/hAgP/4QIF/98CBv/vAgn/4QIL/+ECDP/hAg//4QIR/+ECFv/hAh3/4QIf/+ECIP/hAiH/7wIk/+0COP/vAjr/7wJC/+sCTf/hAl3/4QJi/74CY//fAmX/4QJn/+ECbv++AnH/7wJ2/74Cfv/pAor/4QKM/+ECkP/hAqX/4QKn/+ECsf/vArP/7wK1/+8Cuf/hArv/4QK9/+ECx//1AtH/4ALn/+EDVf/vA1f/7wNZ/+8DW//vAGQAOP/mADr/5wA8//IAPf/nAFH/1gBS/9YAVP/WAFz/8QCg/+cAtP/WAQf/1gEJ/9YBC//WAQz/1gEl/+YBJ//mATn/5wE7/+cBYv/mAX//5wGV/+cBl//yAZv/5wGe/9YBp//WAcX/5gHO/+YB0f/uAdn/8gHl/+YB5v/uAej/8gHq/+gB7//mAfb/1gH5//EB+//WAfz/1gH9/9YB///WAgD/1gIC/9YCA//WAgX/0AII//ECCf/WAgv/1gIM/9YCD//WAhH/1gIW/9YCHf/WAh//1gIg/9YCN//nAjn/5wJN/9YCWP/yAln/8QJd/9YCYv/mAmP/zgJl/9YCZ//WAm7/5gJw/+cCcv/nAnT/8gJ1//ECdv/mAnj/6AJ6/+gCg//yAoT/8QKK/9YCjP/WAo3/6AKQ/9YCnv/yAp//8QKl/9YCp//WArD/7gKy/+4CtP/uArb/6AK5/9YCu//WAr3/1gK+//ICv//xAsb/5wLI/+0C0P/mAtH/0ALn/9YDVP/nA1b/5wNY/+cDWv/nAAICLQALAtD/5gCTACUAEAAn/+gAK//oADP/6AA1/+gAOP/gADr/4AA9/98AgwAQAIQAEACFABAAhgAQAIcAEACIABAAiv/oAJX/6ACW/+gAl//oAJj/6ACZ/+gAm//oAKD/3wDDABAAxQAQAMcAEADJ/+gAy//oAM3/6ADP/+gA3//oAOH/6ADj/+gA5f/oAQ//6AER/+gBE//oARX/6AEl/+ABJ//gATn/3wE7/98BRf/oAU4AEAFS/+gBYv/gAXkAEAF+/+gBf//fAYIAEAGFABABif/oAYwAEAGQ/+gBlf/fAZv/3wHF/+ABx//oAcwAEAHO/+AB0wAQAdcAFAHeABAB4f/oAeT/6AHl/+AB6v/hAe//4AH3ABMB/gAQAgr/4AIcABACI//oAikAEAI1/+gCN//gAjn/4AI7/+gCPf/oAj//6AJB/+gCQ//oAmL/4AJq/+gCbP/oAm7/4AJw/98Ccv/fAnb/4AJ4/+ECef/gAnr/4QJ7/+ACf//hAocAEAKIABACjf/hAo7/4AKSABAClAAQApr/6QKo/+gCqv/oAqz/6AK2/+ECt//gAsb/3wLI/94CygAQAs7/6ALQ/98C0v/yAtQAEALVABAC1gAQAwIAEAMEABADBgAQAwgAEAMKABADDAAQAw4AEAMQABADEgAQAxQAEAMWABADGAAQAy7/6AMw/+gDMv/oAzT/6AM2/+gDOP/oAzr/6AM8/+gDPv/oA0D/6ANC/+gDRP/oA1T/3wNW/98DWP/fA1r/3wNc/+gEMf/oBDL/6AQ0/+gENf/oADIAG//yADj/8QA6//QAPP/0AD3/8ACg//ABJf/xASf/8QE5//ABO//wAWL/8QF///ABlf/wAZf/9AGb//ABxf/xAcz/9QHO//EB0f/zAdn/9AHe//UB5f/xAeb/8wHo//QB7//xAjf/9AI5//QCWP/0AmL/8QJu//ECcP/wAnL/8AJ0//QCdv/xAoP/9AKH//UCnv/0ArD/8wKy//MCtP/zAr7/9ALG//ICyP/yAsr/9QLQ//IC1P/1A1T/8ANW//ADWP/wA1r/8AAIAFgADgCJ/tcBq/+YAbH/xwHX/xIB9/9SAsL/zwPs/4AAZgAlAA8AOP/mADr/5gA8AA4APf/mAIMADwCEAA8AhQAPAIYADwCHAA8AiAAPAKD/5gDDAA8AxQAPAMcADwEl/+YBJ//mATn/5gE7/+YBTgAPAWL/5gF5AA8Bf//mAYIADwGFAA8BjAAPAZX/5gGXAA4Bm//mAcX/5gHMAA4Bzv/mAdEACwHTAA8B1wATAdkADgHeAA4B5f/mAeYACwHoAA4B6v/lAe//5gHw//QB9wASAf4ADwIF/+cCCv/oAg//5wIcAA8CKQAPAjf/5gI5/+YCWAAOAmL/5gJj/+cCbv/mAnD/5gJy/+YCdAAOAnb/5gJ4/+UCef/oAnr/5QJ7/+gCgwAOAocADgKIAA8Cjf/lAo7/6AKSAA8ClAAPAp4ADgKwAAsCsgALArQACwK2/+UCt//oAr4ADgLG/+YCyP/mAsoADgLQ/+YC0f/nAtQADgLVAA8C1gAPAwIADwMEAA8DBgAPAwgADwMKAA8DDAAPAw4ADwMQAA8DEgAPAxQADwMWAA8DGAAPA1T/5gNW/+YDWP/mA1r/5gA3AAb/vwAL/78AOP+fADr/yQA9/60AoP+tASX/nwEn/58BOf+tATv/rQFi/58BZv+/AX//rQGV/60Bm/+tAcX/nwHO/58B0f/sAeX/nwHm/+wB6v/mAe//xAIF/80CD//VAjf/yQI5/8kCYv+fAmP/zAJu/58CcP+tAnL/rQJ2/58CeP/mAnr/5gJ+/98Cjf/mArD/7AKy/+wCtP/sArb/5gLG/9ECyP/sAtD/oQLR/88DVP+tA1b/rQNY/60DWv+tA3D/vwNx/78Dc/+/A3T/vwN1/78Dfv+/A3//vwAwADj/4wA8/+UAPf/kAKD/5AEl/+MBJ//jATn/5AE7/+QBYv/jAX//5AGV/+QBl//lAZv/5AHF/+MBzP/lAc7/4wHR/+kB1//iAdn/5QHe/+UB5f/jAeb/6QHo/+UB/v/qAhz/6gJY/+UCYv/jAm7/4wJw/+QCcv/kAnT/5QJ2/+MCg//lAof/5QKI/+oCnv/lArD/6QKy/+kCtP/pAr7/5QLK/+UC0P/kAtT/5QLV/+oDVP/kA1b/5ANY/+QDWv/kACMAOP/iADz/5AEl/+IBJ//iAWL/4gGX/+QBxf/iAcz/5AHO/+IB0f/pAdf/4QHZ/+QB3v/kAeX/4gHm/+kB6P/kAff/5AH+/+sCHP/rAlj/5AJi/+ICbv/iAnT/5AJ2/+ICg//kAof/5AKI/+sCnv/kArD/6QKy/+kCtP/pAr7/5ALK/+QC1P/kAtX/6wAXADj/6wA9//MAoP/zASX/6wEn/+sBOf/zATv/8wFi/+sBf//zAZX/8wGb//MBxf/rAc7/6wHl/+sCYv/rAm7/6wJw//MCcv/zAnb/6wNU//MDVv/zA1j/8wNa//MANgBR/+8AUv/vAFT/7wBc//AAtP/vAQf/7wEJ/+8BC//vAQz/7wGe/+8Bp//vAfb/7wH3/+4B+f/wAfv/7wH8/+8B/f/vAf//7wIA/+8CAv/vAgP/7wIF/+4CCP/wAgn/7wIL/+8CDP/vAg//7wIR/+8CFv/vAh3/7wIf/+8CIP/vAiT/9AJC//ECTf/vAln/8AJd/+8CY//vAmX/7wJn/+8Cdf/wAoT/8AKK/+8CjP/vApD/7wKf//ACpf/vAqf/7wK5/+8Cu//vAr3/7wK///AC0f/vAuf/7wAiAAb/8gAL//IAWv/1AF3/9QDA//UAwv/1ATr/9QFm//IBo//1Aa3/9QIF//QCBv/1Ag//9AIh//UCJP/1Ajj/9QI6//UCY//1AnH/9QKx//UCs//1ArX/9QLR//UDVf/1A1f/9QNZ//UDW//1A3D/8gNx//IDc//yA3T/8gN1//IDfv/yA3//8gAyAFH/7gBS/+4AVP/uALT/7gEH/+4BCf/uAQv/7gEM/+4Bnv/uAaf/7gH2/+4B9wAUAfv/7gH8/+4B/f/uAf//7gIA/+4CAv/uAgP/7gIF/+0CCf/uAgr/7QIL/+4CDP/uAg3/0AIP/+4CEf/uAhb/7gId/+4CH//uAiD/7gJN/+4CXf/uAmP/7QJl/+4CZ//uAnn/7QJ7/+0Civ/uAoz/7gKO/+0CkP/uAqX/7gKn/+4Ct//tArn/7gK7/+4Cvf/uAtH/7QLn/+4ACgAG//UAC//1AWb/9QNw//UDcf/1A3P/9QN0//UDdf/1A37/9QN///UAWQBH//AASP/wAEn/8ABL//AAU//HAFX/8ACq//AAq//wAKz/8ACt//AArv/wALX/xwC2/8cAt//HALj/xwC5/8cAyv/wAMz/8ADO//AA0P/wANL/8ADW//AA2P/wANr/8ADc//AA3v/wAOD/8ADi//AA5P/wAOb/8AEQ/8cBEv/HART/xwEW//ABRv/wAZz/8AGh//ABr//HAbL/8AGz//ABvP/HAfj/8AIB/8cCBP/wAgf/8AIT//ACFP/wAhf/8AI2/8cCPP/wAj7/6wJA//ACRP/wAmv/8AJt//ACmf/wApv/8AKd//ACqf/HAqv/8AKt/8cCw//wAsT/8ALF//ACz//wAxv/8AMd//ADH//wAyH/8AMj//ADJf/wAyf/8AMp//ADL//HAzH/xwMz/8cDNf/HAzf/xwM5/8cDO//HAz3/8AM///ADQf/wA0P/xwNF//AD3P/rA97/6wPm/+kD6v/rAKEABgANAAsADQBF//AAR//AAEj/wABJ/8AASgANAEv/wABT/+IAVf/AAFoACwBdAAsAo//wAKT/8ACl//AApv/wAKf/8ACo//AAqv/AAKv/wACs/8AArf/AAK7/wAC1/+IAtv/iALf/4gC4/+IAuf/iAMAACwDCAAsAxP/wAMb/8ADI//AAyv/AAMz/wADO/8AA0P/AANL/wADW/8AA2P/AANr/wADc/8AA3v/AAOD/wADi/8AA5P/AAOb/wAEQ/+IBEv/iART/4gEW/8ABOgALAUb/wAFP//ABZgANAZz/wAGh/8ABowALAa0ACwGv/+IBsf/WAbL/wAGz/8ABtv/VAbz/4gHz//AB9//IAfj/wAH+/9cCAf/iAgT/wAIGAAsCB//AAhP/wAIU/8ACF//AAhz/1wIhAAsCNv/iAjgACwI6AAsCPP/AAj7/7AJA/8ACQgAMAkT/wAJr/8ACbf/AAnEACwKI/9cCk//wApX/8AKZ/8ACm//AAp3/wAKp/+ICq//AAq3/4gKxAAsCswALArUACwLD/8ACxP/AAsX/wALHAAsCyQALAs//wALV/9cC1//wAwP/8AMF//ADB//wAwn/8AML//ADDf/wAw//8AMR//ADE//wAxX/8AMX//ADGf/wAxv/wAMd/8ADH//AAyH/wAMj/8ADJf/AAyf/wAMp/8ADL//iAzH/4gMz/+IDNf/iAzf/4gM5/+IDO//iAz3/wAM//8ADQf/AA0P/4gNF/8ADVQALA1cACwNZAAsDWwALA3AADQNxAA0DcwANA3QADQN1AA0DfgANA38ADQPXAA0D2QAOA9r/9QPc/+wD3v/tA+b/7APq/+4D7P+/A/cADQAPAfcAFAH+ABACBf/wAgr/8AIP//ACEgAWAhwAEAJj/+YCef/wAnv/3AKIABACjv/wArf/8ALR//AC1QAQAEwAR//uAEj/7gBJ/+4AS//uAFX/7gCq/+4Aq//uAKz/7gCt/+4Arv/uAMr/7gDM/+4Azv/uAND/7gDS/+4A1v/uANj/7gDa/+4A3P/uAN7/7gDg/+4A4v/uAOT/7gDm/+4BFv/uAUb/7gGc/+4Bof/uAbL/7gGz/+4B9wASAfj/7gH+AA4CBP/uAgX/4wIH/+4CCv/jAg3/uAIP/+MCE//uAhT/7gIX/+4CHAAOAjz/7gJA/+4CRP/uAmP/ugJr/+4Cbf/uAnn/4wJ7/9kCiAAOAo7/4wKZ/+4Cm//uAp3/7gKr/+4Ct//jAsP/7gLE/+4Cxf/uAs//7gLR/+MC1QAOAxv/7gMd/+4DH//uAyH/7gMj/+4DJf/uAyf/7gMp/+4DPf/uAz//7gNB/+4DRf/uACAAWv/AAF3/wADA/8AAwv/AATr/wAGj/8ABrf/AAgX/gAIG/8ACCv/uAg//8AIh/8ACJP/bAjj/wAI6/8ACQv/cAmP/RwJx/8ACef/uAnv/7gKO/+4Csf/AArP/wAK1/8ACt//uAscABwLJ//QC0f9/A1X/wANX/8ADWf/AA1v/wAAhAFr/9ABc//AAXf/0AMD/9ADC//QBOv/0AaP/9AGt//QB9//vAfn/8AH+//MCBv/0Agj/8AIP/+4CHP/zAiH/9AI4//QCOv/0Aln/8AJx//QCdf/wAoT/8AKI//MCn//wArH/9AKz//QCtf/0Ar//8ALV//MDVf/0A1f/9ANZ//QDW//0AAoABv/WAAv/1gFm/9YDcP/WA3H/1gNz/9YDdP/WA3X/1gN+/9YDf//WABUAXP/gAfn/4AIF/3YCCP/gAgr/wgIP/9MCJP/ZAkL/2wJZ/+ACY/8eAnX/4AJ5/8ICe//tAoT/4AKO/8ICn//gArf/wgK//+ACx//wAsn/8gLR/1YADQIF/2QCCv/SAg//2QIk/9kCQv/bAmP/HgJ5/9ICe//tAo7/0gK3/9ICx//wAsn/8gLR/1YACgHv/8MCBf/PAg//1AJj/84Cev/nAn7/3wLG/9ECyP/sAtD/oALR/9EACQIF/2oCD//GAiT/2QJC/9sCY/8eAnv/7QLH//ACyf/yAtH/VgAJAA0AFABBABEAVv/iAGEAEwPc/9kD3v/ZA+b/2QPq/9kD7P+0AAoABv/XAAv/1wFm/9cDcP/XA3H/1wNz/9cDdP/XA3X/1wN+/9cDf//XABQAW//BAZb/xQG0/7QB9P/XAgX/uQIP/+kCJP+yAj7/0gJC/8gCY/+gAnv/xQKa/+QCx//MAsn/zALR/8sC0v/vA9z/5wPe/+cD5v/mA+r/6AA6AAT/xABW/78AW//RAG7/bAB+/24Aif9DAKn/rAC7/6EBlv+4AaX/fgGp/3sBsP+bAbH/eQG0/7IBtv9+Abj/fQG5/3wB1/+vAe8ADwH0/+QB9f+gAff/dAH6/4ACBf+yAg7/fQIP/7ICEP+AAhL/eQIVACgCIv99AiT/fwI+/2YCQv/aAlH/gQJT/5gCX/99AmP/swJp/6ACe/98An7/mgJ//2wCmv/mAsL/awLH/5ICyf+tAs3/ewLQAA8C0f+RAtL/8gPW//ED2f/xA9r/vAPc/7kD3v+5A+b/uQPq/7kD7P+vA/b/7QAGAbT/6gH3/+4CBf/WAg//7QJj/+wC0f/sABIB1/+uAe8AEgH1/+AB9/+tAfr/1gIO/98CEv/SAiL/4AI+/84CUf/dAlP/4gJf/+ACaf/gAnv/6QJ//9oCwv+9As3/3wLQABEAMABW/34AW/+dAG7+8QB+/vQAif6rAKn/XgC7/0sBlv9yAaX/DwGp/woBsP9BAbH/BwG0/2gBtv8PAbj/DgG5/wwB1/9jAe8ABQH0/70B9f9JAff+/gH6/xMCBf9oAg7/DgIP/2gCEP8TAhL/BwIVADACIv8OAiT/EQI+/ucCQv+sAlH/FQJT/zwCX/8OAmP/agJp/0kCe/8MAn7/PwJ//vECmv/AAsL+7wLH/zECyf9fAs3/CgLQAAUC0f8wAtL/1QACAff/aAI+/+4AFwGW/9QBqP/tAasAEQG0/+ABtv/nAbj/5QG5/+4B1wASAfT/6QIF/9cCY//XAnv/0wJ+/9YCf//FApr/5wLGAA0CyAAMAtH/1gLS//ID3P/pA97/5wPm/+cD6v/pAAECPv/xAAICBf/WA3H/iAAJAA0ADwBBAAwAVv/rAGEADgPc/+cD3v/nA+b/5wPq/+kD7P/LAB0AI/+vAFj/7wBb/98BR//u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AX4BfgAFAX8BfwAQAYIBggACAYMBgwADAYQBhAAcAYUBhQACAYYBhgAGAYcBhwARAYgBiAAHAYkBiQAFAYoBigAHAYsBiwAJAYwBjAACAY0BjgAHAZABkAAFAZIBkgALAZQBlAAMAZUBlQAQAZcBlwAPAZoBmgAHAZsBmwAQAZ4BngAWAaMBowAZAacBpwAWAa0BrQAZAa8BrwAXAbEBsQATAbwBvAAXAcMBxAAGAcYBxgAcAckBygAHAcsBywAIAcwBzQAdAc8BzwAJAdEB0QAeAdIB0gAHAdMB0wACAdUB1QADAdYB1gAcAdgB2AAGAdkB2QAPAdsB2wAHAd0B3QAJAd4B4AAHAeEB4QAFAeMB4wALAeQB5AAEAeUB5QAMAeYB5gAeAegB6AAPAekB6QAHAesB6wAHAe0B7QAdAe8B7wAdAfMB8wASAfYB9gAfAfgB+AAVAfkB+QAaAgECAQAXAgMCAwATAgQCBAAUAgYCBgAZAgcCBwATAggCCAAaAg0CDQAgAg8CDwAgAhACEAATAhMCFAAVAhYCFgAfAhwCHQAgAiECIQAZAiUCJQAdAiYCJgAgAikCKQACAjYCNgAXAjcCNwANAjgCOAAZAjkCOQANAjoCOgAZAlECUQATAlICUgAcAlMCUwAfAlQCVAAcAlgCWAAPAlkCWQAaAlwCXAAJAl4CXgAJAmACYAAJAmICYgAJAmQCZAAHAmwCbAAEAm0CbQAUAm4CbgAMAnACcAAQAnECcQAZAnICcgAQAnQCdAAPAnUCdQAaAn0CfQAWAoICggAHAoMCgwAPAoQChAAaAosCiwAHAo8CjwAHApECkQAHApICkgACApMCkwASApQClAACApUClQASApgCmAAGApkCmQAVApsCmwAVAp0CnQAVAp4CngAPAp8CnwAaAqgCqAAFAqkCqQAXAq0CrQAXAq8CrwATArACsAAeArECsQAZArICsgAeArMCswAZArQCtAAeArUCtQAZArgCuAAcArkCuQAfAr0CvQAfAr4CvgAPAr8CvwAaAtYC1gACAtcC1wASAuYC5gAHAucC5wAWAvgC+AAOAvoC+gAOAvwC/AAOAwIDAgACAwMDAwASAwQDBAACAwUDBQASAwYDBgACAwcDBwASAwgDCAACAwkDCQASAwoDCgACAwsDCwASAwwDDAACAw0DDQASAw4DDgACAw8DDwASAxADEAACAxEDEQASAxIDEgACAxMDEwASAxQDFAACAxUDFQASAxYDFgACAxcDFwASAxgDGAACAxkDGQASAxoDGgAGAxsDGwAVAxwDHAAGAx0DHQAVAx4DHgAGAx8DHwAVAyADIAAGAyEDIQAVAyIDIgAGAyMDIwAVAyQDJAAGAyUDJQAVAyYDJgAGAycDJwAVAygDKAAGAykDKQAVAyoDKgAHAywDLAAHAy4DLgAFAy8DLwAXAzADMAAFAzEDMQAXAzIDMgAFAzMDMwAXAzQDNAAFAzUDNQAXAzYDNgAFAzcDNwAXAzgDOAAFAzkDOQAXAzoDOgAFAzsDOwAXA0MDQwAXA0YDRgAIA0gDSAAIA1QDVAAQA1UDVQAZA1YDVgAQA1cDVwAZA1gDWAAQA1kDWQAZA1oDWgAQA1sDWwAZA1wDXAAFA3IDcgABA3YDdgABA3oDewABBDEEMQAEBDMENAAFAAEABgQwAAEAAAAAAAAAAAABAAAAAAAAAAAAFgAZABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAAAAAACAAAAAAAGgAAAAAAAAAAAAgAAAAIAAAAGwAJAAoACwAMABcADQAYAAAAAAAAAAAAAAAAAAMAAAAEAAQABAAAAAQAAAAAAAAAAAAAAAUABQAGAAUABAAAAAcAAAAOAA8AAAAcAA8AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgAAAAIAAoACgAKAAoADQAAAAAAAwADAAMAAwADAAMAAAAEAAQABAAEAAQAAAAAAAAAAAAAAAUABgAGAAYABgAGAAAAAAAOAA4ADgAOAA8AAAAPAAIAAwACAAMAAgADAAgABAAIAAQACAAEAAgABAAAAAQAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQACAAEAAgABAAIAAQACAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAUABQAAAAAACAAGAAgABgAIAAYACAAEAAAAAAAAAAAAAAAAABsABwAbAAcAGwAHABsABwAJAAAACQAAAAAAAAAKAA4ACgAOAAoADgAKAA4ACgAOAAoADgAMAAAADQAPAA0AGAAQABgAEAAYABAAAAAAAAAACAAEAAAADgAAAAAAAAAAAAAAAgADAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAHAAkAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAACAANAAAAAAACAAAAAAACAAAAGAAAAAgAAAAAAAIAAAAAAAAACAAAAAAAAAAAAA0AAAAXAAAAAAAAAA0ABAAAAAUAAAAOAAQAAAAPAAAAAAAAAAUAAAAAAAAAAAAAAA8AAAAGAAAAAAAEAAQAAAAOAAAAAAAAAAAAAAAOAAYADgAAAAAAAAAAAAAAAAAAAAkAAAAIAAAAAAAAABoAEQAAAAkAAAAAABUAAAACAAAAAAAAAAAAAAAXAAAAAAAAAAAAEQAAAAAACAAAAAAACAAJABUAAAAXAAAAEgAAAAAAAAAAAAAAAAAAAAAAAwAAAAAABQAAAAQAHAAAAAUABQAFABMABQAFAAYABQAFAAQAAAAPAAQAHAAFABQABQAFAAAAAAAFAAAABQAAAAQABAAAAAUABAAHAAAAAAAAABMABQAAAAUABQAPAAAACAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAGAAsADwALAA8ACAAEAAgAAAAIAAQACAAAAAgABAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAABcAHAAAAAAAAAAFAAAAAAAAAAAACQAAAAAABQAAAAUAAAAAAAgABAAIAAQACQAAAA0ADwANAAAAFwAcAAkAAAASABQAAAAAAAAAAAAAAAAAAAAAAAAAFwAcAAAAAAARABMAAAAFAAAABQASABQAAAAFAAAAAgADAAIAAwAAAAAAAAAEAAAABAAAAAQAFwAcAAAAAAAAAAAAAAAFAAAABQAIAAYACAAEAAgABgAAAAAAFQAPABUADwAVAA8AEgAUAAAABQAAAAUAAAAFABcAHAAAAAAAAAAEAAQABAAAAAAAAAAAABEAAAAAAAAACAAEAAAAAAAAAAAAEQATAAIAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAMAAAAAAAAAAAAAAACAAMAAgADAAIAAwACAAMAAgADAAIAAwACAAMAAgADAAIAAwACAAMAAgADAAIAAwAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAACAAGAAgABgAIAAYACAAGAAgABgAIAAYACAAGAAgABAAIAAQACAAEAAgABgAIAAQACgAOAAoADgAAAA4AAAAOAAAADgAAAA4AAAAOAA0ADwANAA8ADQAPAA0ADwAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAGQAZAAAAAQABABYAAQABAAEAFgAAAAAAAAAWABYAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgAAAAIAAgAAAABAAAACgIGCBAABERGTFQAGmN5cmwASGdyZWsAdmxhdG4ApAAEAAAAAP//ABIAAAAKABQAHgAoADQAQQBLAFUAXwBpAHMAfQCHAJEAmwClAK8ABAAAAAD//wASAAEACwAVAB8AKQA1AEIATABWAGAAagB0AH4AiACSAJwApgCwAAQAAAAA//8AEgACAAwAFgAgACoANgBDAE0AVwBhAGsAdQB/AIkAkwCdAKcAsQAoAAZBWkUgAFRDUlQgAH5NT0wgAKhOQVYgANRST00gAQBUVVIgASwAAP//ABMAAwANABcAIQArADIANwBEAE4AWABiAGwAdgCAAIoAlACeAKgAsgAA//8AEgAEAA4AGAAiACwAOABFAE8AWQBjAG0AdwCBAIsAlQCfAKkAswAA//8AEgAFAA8AGQAjAC0AOQBGAFAAWgBkAG4AeACCAIwAlgCgAKoAtAAA//8AEwAGABAAGgAkAC4AOgA+AEcAUQBbAGUAbwB5AIMAjQCXAKEAqwC1AAD//wATAAcAEQAbACUALwA7AD8ASABSAFwAZgBwAHoAhACOAJgAogCsALYAAP//ABMACAASABwAJgAwADwAQABJAFMAXQBnAHEAewCFAI8AmQCjAK0AtwAA//8AEwAJABMAHQAnADEAMwA9AEoAVABeAGgAcgB8AIYAkACaAKQArgC4ALljMnNjBFhjMnNjBF5jMnNjBGRjMnNjBGpjMnNjBGpjMnNjBGpjMnNjBGpjMnNjBGpjMnNjBGpjMnNjBGpjY21wBHBjY21wBHBjY21wBHBjY21wBHBjY21wBHBjY21wBHBjY21wBHBjY21wBHBjY21wBHBjY21wBHBkbGlnBHhkbGlnBH5kbGlnBIRkbGlnBIpkbGlnBIpkbGlnBIpkbGlnBIpkbGlnBIpkbGlnBIpkbGlnBIpkbm9tBJBkbm9tBJZkbm9tBJxkbm9tBKJkbm9tBKJkbm9tBKJkbm9tBKJkbm9tBKJkbm9tBKJkbm9tBKJmcmFjBKhmcmFjBKhmcmFjBKhmcmFjBKhmcmFjBKhmcmFjBKhmcmFjBKhmcmFjBKhmcmFjBKhmcmFjBKhsaWdhBLJsaWdhBLpsbnVtBMBsbnVtBMZsbnVtBMxsbnVtBNJsbnVtBNJsbnVtBNJsbnVtBNJsbnVtBNJsbnVtBNJsbnVtBNJsb2NsBNhsb2NsBN5sb2NsBORudW1yBOpudW1yBPBudW1yBPZudW1yBPxudW1yBPxudW1yBPxudW1yBPxudW1yBPxudW1yBPxudW1yBPxvbnVtBQJvbnVtBQhvbnVtBQ5vbnVtBRRvbnVtBRRvbnVtBRRvbnVtBRRvbnVtBRRvbnVtBRRvbnVtBRRwbnVtBRpwbnVtBSBwbnVtBSZwbnVtBSxwbnVtBSxwbnVtBSxwbnVtBSxwbnVtBSxwbnVtBSxwbnVtBSxzbWNwBTJzbWNwBThzbWNwBT5zbWNwBURzbWNwBURzbWNwBURzbWNwBURzbWNwBURzbWNwBURzbWNwBURzczAxBUpzczAxBVBzczAxBVZzczAxBVxzczAxBVxzczAxBVxzczAxBVxzczAxBVxzczAxBVxzczAxBVxzczAyBWJzczAyBWhzczAyBW5zczAyBXRzczAyBXRzczAyBXRzczAyBXRzczAyBXRzczAyBXRzczAyBXRzczAzBXpzczAzBYBzczAzBYZzczAzBYxzczAzBYxzczAzBYxzczAzBYxzczAzBYxzczAzBYxzczAzBYxzczA0BZJzczA0BZhzczA0BZ5zczA0BaRzczA0BaRzczA0BaRzczA0BaRzczA0BaRzczA0BaRzczA0BaRzczA1BapzczA1BbBzczA1BbZzczA1BbxzczA1BbxzczA1BbxzczA1BbxzczA1BbxzczA1BbxzczA1BbxzczA2BcJzczA2BchzczA2Bc5zczA2BdRzczA2BdRzczA2BdRzczA2BdRzczA2BdRzczA2BdRzczA2BdRzczA3BdpzczA3BeBzczA3BeZzczA3BexzczA3BexzczA3BexzczA3BexzczA3BexzczA3BexzczA3Bex0bnVtBfJ0bnVtBfh0bnVtBf50bnVtBgR0bnVtBgR0bnVtBgR0bnVtBgR0bnVtBgR0bnVtBgR0bnVtBgQAAAABAAEAAAABAAMAAAABAAIAAAABAAAAAAACAAgACQAAAAEADgAAAAEAEAAAAAEADwAAAAEADQAAAAEAQwAAAAEARQAAAAEARAAAAAEAQgAAAAMAPwBAAEEAAAACABEAEgAAAAEAEgAAAAEAPAAAAAEAPgAAAAEAPQAAAAEAOwAAAAEACgAAAAEADAAAAAEACwAAAAEARwAAAAEASQAAAAEASAAAAAEARgAAAAEAMAAAAAEAMgAAAAEAMQAAAAEALwAAAAEAOAAAAAEAOgAAAAEAOQAAAAEANwAAAAEABQAAAAEABwAAAAEABgAAAAEABAAAAAEAFAAAAAEAFgAAAAEAFQAAAAEAEwAAAAEAGAAAAAEAGgAAAAEAGQAAAAEAFwAAAAEAHAAAAAEAHgAAAAEAHQAAAAEAGwAAAAEAIAAAAAEAIgAAAAEAIQAAAAEAHwAAAAEAJAAAAAEAJgAAAAEAJQAAAAEAIwAAAAEAKAAAAAEAKgAAAAEAKQAAAAEAJwAAAAEALAAAAAEALgAAAAEALQAAAAEAKwAAAAEANAAAAAEANgAAAAEANQAAAAEAMwBLAJgAmACYAJgEJgQmBCYEJgcUB8AOUA5QDmYOiA6IDogOiA6+DuQPEg8SDxIPEg8mDyYPJg8mDzoPOg86DzoPTg9OD04PTg9gD2APYA9gD3oPeg96D3oPvA+8D7wPvA/aD9oP2g/aD/gP+A/4D/gQKhAqECoQKhBcEFwQXBBcEI4QohDuEMwQzBDMEMwQ7hDuEO4Q7hEaAAEAAAABAAgAAgHEAN8DvQPsA+sD6gPpA+gD5wPmA+UD5APjA+ID4QPgA98D3gPdA9wD2wPaA9kD2APXA9YD9gP3BKkDvAO7BFAEUQRSBFMEVARVBFcEWARZBFoEWwRcBF0EXgRfBE4EYARhBGIEYwRkBGUEZgRtBG4EbwRwBEwEcQRyBHMEdAR1BHYEdwR4BE0EeQR6BHsEfAR9BH4EfwSABIEEggSDBIQEhQSGBIcEiASJBIoEiwSMBI0EjgSPBJAEkQSSBJMERASUBJUElgSXBJgEmQSaBJ0EnARPBJ4EnwSgBKEEogSjBKQEpQSmBKcEqAP+BFYEmwSqBKsErAStBK4ErwSwBLEEsgO6A7kEswS0BLUDuAS2BLcDtwS4A7YEuQPGBLoD0QS7BLwD0gS9A9MD1AS+BL8EwAP5BMED+ATCBMMExATFA/8EAAQBBMYExwQCBMgEAwTJBMoEBATLBAUEBgQHBMwECAQJBM0EzgTPBNAE0QTSBNMECgTcBNQECwQMBA0EDgQPBBAEEQQSBBMEFAQ4BBUEFgTVBBcEGAQZBNYEGgTXBNgEGwQcBB0EHgQfBCAE2QQhBCIE2gQjBNsEJAQlBCcEJgABAN8ACAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4AZgBoAIMAhACFAIYAhwCIAIoAiwCMAI0AjgCPAJAAkQCSAJMAlACVAJYAlwCYAJkAnACdAJ4AnwCgAKIAwwDFAMcAyQDLAM0AzwDRANMA1QDXANkA2wDdAN8A4QDjAOUA5wDrAO0A7wDxAPMA9wD5APwA/gEAAQIBBgEIAQoBDwERARMBFQEXARkBGwEdAR8BIQEjASUBJwEpASsBLQEvATEBMwE1ATcBOQE7ATwBPgFAAU4BYgF5AXsBfAF9AX4BfwGAAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0QHSAdMB1AHVAdYB1wHYAdkB2gHbAdwB3QHeAd8B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gJSAlQCWAJaAlwCXgJiAmQCagJsAnACcgJ0AnYCegJ8An4CgAKaAqICpAKqArADhwOOA5MDlgABAAAAAQAIAAIBdAC3A+wD6wPqA+kD6APnA+YD5QPkA+MD4gPhA+AD3wPeA90D3APbA9oD2QPYA9cD1gP2A/cEqQRQBFEEUgRTBFQEVQRXBFgEWQRaBFsEXARdBF4EXwROBGAEYQRiBGMEZARlBGYEbQRuBG8EcASmBHEEcgRzBHQEdQR2BHcEeARNBHkEegR7BHwEfQR+BH8EgASBBIIEgwSEBIUEhgSHBIgEiQSKBIsEjASNBI4EjwSQBJEEkgSTBEQElASVBJYElwSYBJkEmgSdBJwETwSeBJ8EoAShBKIEowSkBKUEpwSoA/4EVgSbBMgEAwTJBMoEBATLBAUEBgQHBMwECAQJBM0EzgTPBNAE0QTSBNMECgTcBNQECwQMBA0EDgQPBBAEEQQSBBMEFATAA/kEwQP4BMIEwwTEBMUD/wQABAEExgTHBAIEOAQVBBYE1QQXBBgEGQTWBBoE1wTYBBsEHAQdBB4EHwQgBNkEIQQiBNoEIwTbAAEAtwBFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AowCkAKUApgCnAKgAqgCrAKwArQCuAK8AsACxALIAswC0ALUAtgC3ALgAuQC8AL0AvgC/AMAAwgDEAMYAyADKAMwAzgDQANIA1ADWANgA2gDcAN4A4ADiAOQA5gDoAOwA7gDwAPIA9AD4APoA/QD/AQEBAwEHAQkBCwEQARIBFAEWARgBGgEcAR4BIAEiASQBJgEoASoBLAEuATABMgE0ATYBOAE6AT0BPwFBAU8BYwHzAfQB9QH2AfcB+AH5AfoB+wH8Af0B/gH/AgACAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8CEAIRAhICFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIQIiAlMCVQJZAlsCXQJfAmMCZQJrAm0CcQJzAnUCdwJ7An0CfwKBApsCowKlAqsCsQAGAAAABgASACoAQgBaAHIAigADAAAAAQASAAEAkAABAAAASgABAAEATQADAAAAAQASAAEAeAABAAAASgABAAEATgADAAAAAQASAAEAYAABAAAASgABAAEA8gADAAAAAQASAAEASAABAAAASgABAAECGQADAAAAAQASAAEAMAABAAAASgABAAECGwADAAAAAQASAAEAGAABAAAASgABAAEDLQACAAEBcQF1AAAABAAAAAEACAABBh4ANgByAKQArgC4AMoA/AEOARgBSgFkAX4BkAG6AewB9gIYAjICRAJ2AogCogLMAt4DEAMaAyQDNgNoA3IDfAOGA6ADugPMA/YEKAQyBFQEbgSABLIExATeBQgFGgUkBS4FOAVCBWwFlgXABeoGFAAGAA4AFAAaACAAJgAsAIMAAgFxAIQAAgFyAIYAAgFzAwQAAgF0AVQAAgF1AwIAAgF2AAEABALYAAIBdgABAAQAyQACAXIAAgAGAAwC2gACAXYC3AACA6sABgAOABQAGgAgACYALACLAAIBcQCMAAIBcgMeAAIBcwMcAAIBdAFWAAIBdQMaAAIBdgACAAYADAFKAAIBcgDlAAIDqwABAAQC3gACAXYABgAOABQAGgAgACYALACPAAIBcQCQAAIBcgDrAAIBcwMqAAIBdAFYAAIBdQMsAAIBdgADAAgADgAUAuAAAgFyAuIAAgF2APkAAgOrAAMACAAOABQA/AACAXIC5AACAXYA/gACA6sAAgAGAAwC5gACAXIC6AACAXYABQAMABIAGAAeACQBTAACAXEBBgACAXIAlAACAXMC6gACAXYBCAACA6sABgAOABQAGgAgACYALACVAAIBcQCWAAIBcgCYAAIBcwMwAAIBdAFaAAIBdQMuAAIBdgABAAQC7AACAXIABAAKABAAFgAcARcAAgFyAVwAAgF1Au4AAgF2ARkAAgOrAAMACAAOABQBHQACAXIC8AACAXYBYAACA6sAAgAGAAwC8gACAXYBYgACA6sABgAOABQAGgAgACYALACcAAIBcQCdAAIBcgErAAIBcwNIAAIBdAFeAAIBdQNGAAIBdgACAAYADAL0AAIBcwL2AAIBdgADAAgADgAUAvgAAgFxAvoAAgFyAv4AAgF2AAUADAASABgAHgAkA1QAAgFxAKAAAgFyA1oAAgFzA1gAAgF0A1YAAgF2AAIABgAMATwAAgFyAwAAAgF2AAYADgAUABoAIAAmACwAowACAXEApAACAXIApgACAXMDBQACAXQBVQACAXUDAwACAXYAAQAEAtkAAgF2AAEABADKAAIBcgACAAYADALbAAIBdgLdAAIDqwAGAA4AFAAaACAAJgAsAKsAAgFxAKwAAgFyAx8AAgFzAx0AAgF0AVcAAgF1AxsAAgF2AAEABAFLAAIBcgABAAQC3wACAXYAAQAEAy0AAgF2AAMACAAOABQC4QACAXIC4wACAXYA+gACA6sAAwAIAA4AFAD9AAIBcgLlAAIBdgD/AAIDqwACAAYADALnAAIBcgLpAAIBdgAFAAwAEgAYAB4AJAFNAAIBcQEHAAIBcgC0AAIBcwLrAAIBdgEJAAIDqwAGAA4AFAAaACAAJgAsALUAAgFxALYAAgFyALgAAgFzAzEAAgF0AVsAAgF1Ay8AAgF2AAEABALtAAIBcgAEAAoAEAAWABwBGAACAXIBXQACAXUC7wACAXYBGgACA6sAAwAIAA4AFAEeAAIBcgLxAAIBdgFhAAIDqwACAAYADALzAAIBdgFjAAIDqwAGAA4AFAAaACAAJgAsALwAAgFxAL0AAgFyASwAAgFzA0kAAgF0AV8AAgF1A0cAAgF2AAIABgAMAvUAAgFzAvcAAgF2AAMACAAOABQC+QACAXEC+wACAXIC/wACAXYABQAMABIAGAAeACQDVQACAXEAwAACAXIDWwACAXMDWQACAXQDVwACAXYAAgAGAAwBPQACAXIDAQACAXYAAQAEAVAAAgFyAAEABAFSAAIBcgABAAQBUQACAXIAAQAEAVMAAgFyAAUADAASABgAHgAkAK8AAgFxALAAAgFyAOwAAgFzAysAAgF0AVkAAgF1AAUADAASABgAHgAkAz4AAgFxAzwAAgFyA0IAAgFzA0AAAgF0A0QAAgF2AAUADAASABgAHgAkAz8AAgFxAz0AAgFyA0MAAgFzA0EAAgF0A0UAAgF2AAUADAASABgAHgAkA0wAAgFxA0oAAgFyA1AAAgFzA04AAgF0A1IAAgF2AAUADAASABgAHgAkA00AAgFxA0sAAgFyA1EAAgFzA08AAgF0A1MAAgF2AAEABAHBAAIBcgACABEAJQApAAAAKwAtAAUALwA0AAgANgA7AA4APQA+ABQARQBJABYASwBNABsATwBUAB4AVgBbACQAXQBeACoAiQCJACwAmwCbAC0AqQCpAC4AuwC7AC8A9AD0ADABRQFIADEBwAHAADUAAQAAAAEACAABAAYAPwABAAIBIQEiAAEAAAABAAgAAgAOAAQE3QTeBN8E4AABAAQAxwDIANsA3AAEAAAAAQAIAAEAJgACAAoAHAACAAYADAOsAAIASgOxAAIAWAABAAQDsgACAFgAAQACAEoAVwAEAAAAAQAIAAEARAACAAoAFAABAAQDrQACAE0AAQAEA68AAgBNAAQAAAABAAgAAQAeAAIACgAUAAEABAOuAAIAUAABAAQDsAACAFAAAQACAEoDrAABAAAAAQAIAAEABgN5AAEAAQBLAAEAAAABAAgAAQAGAiIAAQABAaEAAQAAAAEACAABAAYDjAABAAEANgABAAAAAQAIAAIAHAACA8EDwAABAAAAAQAIAAIACgACA78DvgABAAIALwBPAAEAAAABAAgAAgAeAAwEMQQzBDIENAQ1BCgEKQQqA/sELAQtBC4AAQAMACcAKAArADMANQBGAEcASABLAFMAVABVAAEAAAABAAgAAgAMAAMELwQwBDAAAQADAEkASwP7AAEAAAABAAgAAgBmAAgERgQ2BDcEOQQ6BEIEQwRFAAEAAAABAAgAAgAWAAgAGwAVABQAHQAZABgAFwAWAAEACAP6BCsEZwRoBGkEagRrBGwAAQAAAAEACAACABYACARnBCsEbARrBGoEaQP6BGgAAQAIABQAFQAWABcAGAAZABsAHQABAAAAAQAIAAIAFgAIABUAFgAXABgAGQAbAB0AFAABAAgENgQ3BDkEOgRCBEMERQRGAAEAAAABAAgAAQAGA3AAAQABABMABgAAAAEACAADAAEAEgABAGYAAAABAAAASgACAAIDgwODAAADxwPQAAEAAQAAAAEACAACADwACgPQA88DzgPNA8wDywPKA8kDyAPHAAEAAAABAAgAAgAaAAoEOwB8AHUAdgQ8BD0EPgQ/BEAEQQACAAEAFAAdAAAAAQAAAAEACAACACYAEAPQA88DzgPNA8wDywPKA8kDyAPHBEkERwRKBEsESAThAAEAEAAUABUAFgAXABgAGQAaABsAHAAdAE0ATgDyAhkCGwMt",
59642   "Roboto-Regular.ttf": "AAEAAAASAQAABAAgR0RFRtRX1FkAAg/sAAACREdQT1NKcuCzAAISMAAAUiRHU1VCw4aZEQACZFQAABfoT1MvMqCnsaYAAAGoAAAAYGNtYXBAmkl2AAAafAAAEshjdnQgJEEG5QAAL9wAAABMZnBnbWf0XKsAAC1EAAABvGdhc3AACAATAAIP4AAAAAxnbHlmHN2bBQAAOfAAAdM2aGRteDc4ERcAABWQAAAE7GhlYWT4RqsOAAABLAAAADZoaGVhCroKggAAAWQAAAAkaG10eOiEiIgAAAIIAAATiGxvY2HgyGepAAAwKAAACcZtYXhwBxIC+QAAAYgAAAAgbmFtZTVTY1kAAg0oAAACmHBvc3T/bQBkAAIPwAAAACBwcmVwdKCP7AAALwAAAADbAAEAAAACAACEKlnoXw889QAbCAAAAAAAxPARLgAAAADQ206a+hv91QkwCHMAAAAJAAIAAAAAAAAAAQAAB2z+DAAACUn6G/5KCTAAAQAAAAAAAAAAAAAAAAAABOIAAQAABOIAjwAWAFQABQABAAAAAAAOAAACAAIUAAYAAQADBIUBkAAFAAAFmgUzAAABHwWaBTMAAAPRAGYCAAAAAgAAAAAAAAAAAOAACv9QACF/AAAAIQAAAABHT09HAEAAAP/9BgD+AABmB5oCACAAAZ8AAAAABDoFsAAgACAAAgOMAGQAAAAAAAAAAAH7AAAB+wAAAg8AoAKPAIgE7QB3BH4AbgXcAGkE+QBlAWUAZwK8AIUCyAAmA3IAHASJAE4BkgAdAjUAJQIbAJADTAASBH4AcwR+AKoEfgBdBH4AXgR+ADUEfgCaBH4AhAR+AE0EfgBwBH4AZAHwAIYBsQApBBEASARkAJgELgCGA8cASwcvAGoFOAAcBPsAqQU1AHcFPwCpBIwAqQRsAKkFcwB6BbQAqQItALcEagA1BQQAqQROAKkG/ACpBbQAqQWAAHYFDACpBYAAbQTtAKgEvwBQBMYAMQUwAIwFFwAcBxkAPQUEADkEzgAPBMoAVgIfAJIDSAAoAh8ACQNYAEADnAAEAnkAOQRaAG0EfQCMBDAAXASDAF8EPQBdAscAPAR9AGAEaACMAfEAjQHp/78EDgCNAfEAnAcDAIsEagCMBJAAWwR9AIwEjABfArUAjAQgAF8CnQAJBGkAiAPgACEGAwArA/cAKQPJABYD9wBYArUAQAHzAK8CtQATBXEAgwHzAIsEYABpBKYAWwW0AGkE2AAfAesAkwToAFoDWABmBkkAWwOTAJMDwQBmBG4AfwZKAFoDqgB4Av0AggRGAGEC7wBCAu8APgKCAHsEiACaA+kAQwIWAJMB+wB0Au8AegOjAHoDwABmBdwAVQY1AFAGOQBvA8kARAd6//IERABZBYAAdgS6AKYEwgCLBsEATgSwAH4EkQBHBIgAWwScAJUFmgAdAfoAmwRzAJoETwAiAikAIgWLAKIEiACRB6EAaAdEAGEB/ACgBYcAXQK5/+QFfgBlBJIAWwWQAIwE8wCIAgP/tAQ3AGIDxACpA40AjAOrAHgDagCBAfEAjQKtAHkCKgAyA8YAewL8AF4CWgB+AAD8pwAA/W8AAPyLAAD9XgAA/CcB7/04Ag0AtwQLAHECFwCTBHMAsQWkAB8FcQBnBT4AMgSRAHgFtQCyBJEARQW7AE0FiQBaBVIAcQSFAGQEvQCgBAIALgSIAGAEUABjBCUAbQSIAJEEjgB6ApcAwwRuACUD7ABlBMQAKQSIAJEETQBlBIgAYAQsAFEEXQCPBaMAVwWaAF8GlwB6BKEAeQRC/9oGSABKBf8AKgVkAHsIkQAxCKQAsQaCAD4FtACwBQsAogYEADIHQwAbBL8AUAW0ALEFqQAvBQcATQYsAFMF2QCvBXoAlgeHALAHwACwBhIAEAbrALIFBQCjBWQAkwcnALcFGABZBGwAYQSSAJ0DWwCaBNQALgYgABUEEABYBJ4AnARSAJwEoAAsBe8AnQSdAJwEngCcA9gAKAXNAGQEvQCcBFkAZwZ4AJwGngCRBPcAHgY2AJ0EWACdBE0AZAaHAJ0EZAAvBGj/6ARNAGcGyQAnBuQAnASJ//0EngCcBwgAnAYrAIEEVv/cBysAtwX4AJkE0gAoBEYADwcLAMkGCwC8BtEAkwXhAJYJBAC2B9EAmwQjAFAD2wBMBXEAZwSLAFsFCgAWBAMALgVxAGcEiABbBwEAnAYkAH4HCACcBisAgQUyAHUERwBkBP0AdAAA/GcAAPxxAAD9ZgAA/aQAAPobAAD6LARW/9wFGwCoBIkAjARjAKIDkACRBNsAsQQFAJEFCQCjBH4AmgaMAEQFgwA+B88AqAW0AJEIMQCwBvQAkQXuAHEE0wBtBywANAVcAB8FbwCWBGoAgwVwAIoGLwA/BL3/3gUJAKMEWgCaBbIAsQSIAJEFhwBdBKgAaASoAGkEtwA6A0kAOwT2AFcGlABZBuQAZAZWADYFKwAxBEkAUgQHAHkHwQBEBnUAPwf7AKkGoQCQBPYAdgQdAGUFrQAjBSAARgVkAJYDIABvBBQAAAgpAAAEFAAACCkAAAK5AAACCgAAAVwAAAR/AAACMAAAAaIAAADRAAAAAAAAAjQAJQI0ACUFQACiBj8AkAOmAA0BmQBgAZkAMAGXACQBmQBPAtQAaALbADwCwQAkBGkARgSPAFcCsgCKA8QAlAVaAJQA9gAmB6oARAJmAGwCZgBZA6MAOwLvADYDYAB6BKYAWwZVAB8GkACnCHYAqAdjADkGKwCMBH4AXwXaAB8EIgAqBHQAIAVIAF0FTwAfBecAegPOAGgIOgCiBQEAZwUXAJgGJgBUBtcAZAbPAGMGagBZBI8AagWOAKkErwBFBJIAqATFAD8IOgBiAgz/sASCAGUEZACYBBEAPgQvAIUECAArAkwAtQKPAG4CAwBcBPMAPARuAB8EiwA8BtQAPAbUADwE7gA8BpsAXwAAAAAIMwBbCDUAXAQgADsEngBaAfz/tgGRAGcDpACDA54AgQOfAIED9ABpBA4AaQPz/14D7wBuA6QAgQH9AJ8EhQATBFAAigR8AGAEgACKA+YAigPLAIoErABjBOMAigHoAJcDzwArBFQAigO0AIoGAgCKBOMAigS7AGAEXACKBLsAWQRKAIoEIABDBCYAKAR8AHQEZwAUBhUAMQRUACYEKwANBCMARwLvAFAC7wB6Au8AQgLvAD4C7wA2Au8AWwLvAFYC7wA6Au8ATwLvAEkDlgCPArUAngQ6AB4EwwBkBUwAsQUkALIEEwCSBT0AsgQPAJIEIABDBDMAMAQ8ABYDrwCKBGcAFAS7AGAEZwAUA4kAPgTOAIoD7wA/BWcAYAUXAGAE8gB1BXIAJgR8AGAHQQAnB08AigV0ACgEzQCKBFkAigUkAC4GCwAfBD8ARwTsAIoETgCLBMEAJwQfACIFKACKBGoAPQZRAIoGrACKBR0ACAXxAIoETgCKBHsASwZ2AIoEhwBQBBEACwZHAB8EeQCLBQkAiwU3ACMFwgBgBF8ADQSoACYGYQAmBGoAPQRqAIoFwwACBMoAXgQ/AEcEuwBgBDMAMAPjAEIIIgCKBKsAKAR9AIwEMgBcBJMAWwSMAFsDeQBXBI0AjAScAFsEPQBdBH0AYAWBAH4FrgB+BZMAsgXgAH4F4wB+A9UAoASCAIMDrwCKBFgADwTPAD4C7wBQAu8ANgLvAFsC7wBWAu8AOgLvAE8C7wBJBGsAZQQuAEoGpABgBLkAggUAAHgCBv+0AgT/tAH7AJsB+//6AfsAmwH7AIYEUACKAfsAAAI1ACUFXQAlBV0AJQSGAAAExgAxAp3/9AU4ABwFOAAcBTgAHAU4ABwFOAAcBTgAHAU4ABwFNQB3BIwAqQSMAKkEjACpBIwAqQIt/+ACLQCwAi3/6QIt/9YFtACpBYAAdgWAAHYFgAB2BYAAdgWAAHYFMACMBTAAjAUwAIwFMACMBM4ADwRaAG0EWgBtBFoAbQRaAG0EWgBtBFoAbQRaAG0EMABcBD0AXQQ9AF0EPQBdBD0AXQH6/8YB+gCWAfr/zwH6/7wEagCMBJAAWwSQAFsEkABbBJAAWwSQAFsEaQCIBGkAiARpAIgEaQCIA8kAFgPJABYFOAAcBFoAbQU4ABwEWgBtBTgAHARaAG0FNQB3BDAAXAU1AHcEMABcBTUAdwQwAFwFNQB3BDAAXAU/AKkFGQBfBIwAqQQ9AF0EjACpBD0AXQSMAKkEPQBdBIwAqQQ9AF0EjACpBD0AXQVzAHoEfQBgBXMAegR9AGAFcwB6BH0AYAVzAHoEfQBgBbQAqQRoAIwCLf+3Afr/nQIt/7YB+v+cAi3/7AH6/9ICLQAYAfH/+wItAKoGlwC3A9oAjQRqADUCA/+0BQQAqQQOAI0ETgChAfEAkwROAKkB8QBXBE4AqQKHAJwETgCpAs0AnAW0AKkEagCMBbQAqQRqAIwFtACpBGoAjARq/7wFgAB2BJAAWwWAAHYEkABbBYAAdgSQAFsE7QCoArUAjATtAKgCtQBTBO0AqAK1AGMEvwBQBCAAXwS/AFAEIABfBL8AUAQgAF8EvwBQBCAAXwS/AFAEIABfBMYAMQKdAAkExgAxAp0ACQTGADECxQAJBTAAjARpAIgFMACMBGkAiAUwAIwEaQCIBTAAjARpAIgFMACMBGkAiAUwAIwEaQCIBxkAPQYDACsEzgAPA8kAFgTOAA8EygBWA/cAWATKAFYD9wBYBMoAVgP3AFgHev/yBsEATgWAAHYEiABbBID/vgSA/74EJgAoBIUAEwSFABMEhQATBIUAEwSFABMEhQATBIUAEwR8AGAD5gCKA+YAigPmAIoD5gCKAej/vgHoAI4B6P/HAej/tATjAIoEuwBgBLsAYAS7AGAEuwBgBLsAYAR8AHQEfAB0BHwAdAR8AHQEKwANBIUAEwSFABMEhQATBHwAYAR8AGAEfABgBHwAYASAAIoD5gCKA+YAigPmAIoD5gCKA+YAigSsAGMErABjBKwAYwSsAGME4wCKAej/lQHo/5QB6P/KAegABgHoAIkDzwArBFQAigO0AIIDtACKA7QAigO0AIoE4wCKBOMAigTjAIoEuwBgBLsAYAS7AGAESgCKBEoAigRKAIoEIABDBCAAQwQgAEMEIABDBCYAKAQmACgEJgAoBHwAdAR8AHQEfAB0BHwAdAR8AHQEfAB0BhUAMQQrAA0EKwANBCMARwQjAEcEIwBHBTgAHATw//AGGP/+ApEABAWU//oFMv94BWb//QKX/5sFOAAcBPsAqQSMAKkEygBWBbQAqQItALcFBACpBvwAqQW0AKkFgAB2BQwAqQTGADEEzgAPBQQAOQIt/9YEzgAPBIUAZARQAGMEiACRApcAwwRdAI8EcwCaBJAAWwSIAJoD4AAhA/cAKQKX/+YEXQCPBJAAWwRdAI8GlwB6BIwAqQRzALEEvwBQAi0AtwIt/9YEagA1BSQAsgUEAKkFBwBNBTgAHAT7AKkEcwCxBIwAqQW0ALEG/ACpBbQAqQWAAHYFtQCyBQwAqQU1AHcExgAxBQQAOQRaAG0EPQBdBJ4AnASQAFsEfQCMBDAAXAPJABYD9wApBD0AXQNbAJoEIABfAfEAjQH6/7wB6f+/BFIAnAPJABYHGQA9BgMAKwcZAD0GAwArBxkAPQYDACsEzgAPA8kAFgFlAGcCjwCIBB4AoAID/7QBmQAwBvwAqQcDAIsFOAAcBFoAbQSMAKkFtACxBD0AXQSeAJwFiQBaBZoAXwUKABYEA//7CFkAWwlJAHYEvwBQBBAAWAU1AHcEMABcBM4ADwQCAC4CLQC3B0MAGwYgABUCLQC3BTgAHARaAG0FOAAcBFoAbQd6//IGwQBOBIwAqQQ9AF0FhwBdBDcAYgQ3AGIHQwAbBiAAFQS/AFAEEABYBbQAsQSeAJwFtACxBJ4AnAWAAHYEkABbBXEAZwSLAFsFcQBnBIsAWwVkAJMETQBkBQcATQPJABYFBwBNA8kAFgUHAE0DyQAWBXoAlgRZAGcG6wCyBjYAnQUEADkD9wApBIMAXwWpAC8EoAAsBTgAHARaAG0FOAAcBFoAbQU4ABwEWgBtBTgAHARa/8oFOAAcBFoAbQU4ABwEWgBtBTgAHARaAG0FOAAcBFoAbQU4ABwEWgBtBTgAHARaAG0FOAAcBFoAbQU4ABwEWgBtBIwAqQQ9AF0EjACpBD0AXQSMAKkEPQBdBIwAqQQ9AF0EjP/wBD3/ugSMAKkEPQBdBIwAqQQ9AF0EjACpBD0AXQItALcB+gCbAi0AowHxAIUFgAB2BJAAWwWAAHYEkABbBYAAdgSQAFsFgABHBJD/xAWAAHYEkABbBYAAdgSQAFsFgAB2BJAAWwV+AGUEkgBbBX4AZQSSAFsFfgBlBJIAWwV+AGUEkgBbBX4AZQSSAFsFMACMBGkAiAUwAIwEaQCIBZAAjATzAIgFkACMBPMAiAWQAIwE8wCIBZAAjATzAIgFkACMBPMAiATOAA8DyQAWBM4ADwPJABYEzgAPA8kAFgShAF8EoQBfBSQAsgRSAJwFtACpBJ0AnATGADED2AAoBQQAOQP3ACkFegCWBFkAZwV6AJYEWQBnBHMAsQNbAJoHQwAbBiAAFQYvAD8Evf/eBGgAjAUF/9QFBf/UBHMAAwNb//wFOAALBCf/0wW0ALEEngCcBbQAqQSdAJwG/ACpBe8AnQWpAC8EoAAsBM4ADwQCAC4FBAA5A/cAKQRQAGMEbAASBj8AkAR+AF0EfgBeBH4ANQR+AJoEkgBkBKYAhwVzAHoEfQBgBbQAqQRqAIwFOAAcBFoAOQSMAF8EPQApAi3/CgH6/vAFgAB2BJAAMwTtAFUCtf+LBTAAjARpACsEpv86BPsAqQR9AIwFPwCpBIMAXwU/AKkEgwBfBbQAqQRoAIwFBACpBA4AjQUEAKkEDgCNBE4AqQHxAIYG/ACpBwMAiwW0AKkEagCMBQwAqQR9AIwE7QCoArUAggS/AFAEIABfBMYAMQKdAAkFFwAcA+AAIQUXABwD4AAhBxkAPQYDACsEygBWA/cAWAXG/ngEhQATBCL/nwUf/7wCJP/ABMX/3wRn/1cE/P/4BIUAEwRQAIoD5gCKBCMARwTjAIoB6ACXBFQAigYCAIoEuwBgBFwAigQmACgEKwANBFQAJgHo/7QEKwANA+YAigOvAIoEIABDAegAlwHo/7QDzwArBFQAigQfACIEhQATBFAAigOvAIoD5gCKBOwAigYCAIoE4wCKBLsAYATOAIoEXACKBHwAYAQmACgEVAAmBD8ARwTjAIoEfABgBCsADQXDAAIE7ACKBB8AIgVnAGAFOAAcBFoAbQSMAKkEPQBdAAAAAQAABOQJCgQAAAICAgMGBQcGAgMDBAUCAgIEBQUFBQUFBQUFBQICBQUFBAgGBgYGBQUGBgIFBgUIBgYGBgYFBQYGCAYFBQIEAgQEAwUFBQUFAwUFAgIFAggFBQUFAwUDBQQHBAQEAwIDBgIFBQYFAgYEBwQEBQcEAwUDAwMFBAICAwQEBwcHBAgFBgUFCAUFBQUGAgUFAgYFCQgCBgMGBQYGAgUEBAQEAgMCBAMDAAAAAAACAgUCBQYGBgUGBQYGBgUFBQUFBQUFAwUEBQUFBQUFBgYHBQUHBwYKCgcGBgcIBQYGBgcHBggJBwgGBggGBQUEBQcFBQUFBwUFBAcFBQcHBgcFBQcFBQUICAUFCAcFCAcFBQgHCAcKCQUEBgUGBQYFCAcIBwYFBgAAAAAAAAUGBQUEBQUGBQcGCQYJCAcFCAYGBQYHBQYFBgUGBQUFBAYHCAcGBQUJBwkHBgUGBgYEBQkFCQMCAgUCAgEAAgIGBwQCAgICAwMDBQUDBAYBCQMDBAMEBQcHCggHBQcFBQYGBwQJBgYHCAgHBQYFBQUJAgUFBQUFAwMCBgUFCAgGBwAJCQUFAgIEBAQEBQQEBAIFBQUFBAQFBgIEBQQHBgUFBQUFBQUFBwUFBQMDAwMDAwMDAwMEAwUFBgYFBgUFBQUEBQUFBAUEBgYGBgUICAYFBQYHBQYFBQUGBQcIBgcFBQcFBQcFBgYGBQUHBQUGBQUFBQQJBQUFBQUEBQUFBQYGBgcHBAUEBQUDAwMDAwMDBQUHBQYCAgICAgIFAgIGBgUFAwYGBgYGBgYGBQUFBQICAgIGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQICAgIFBQUFBQUFBQUFBAQGBQYFBgUGBQYFBgUGBQYGBQUFBQUFBQUFBQYFBgUGBQYFBgUCAgICAgICAgIHBAUCBgUFAgUCBQMFAwYFBgUGBQUGBQYFBgUGAwYDBgMFBQUFBQUFBQUFBQMFAwUDBgUGBQYFBgUGBQYFCAcFBAUFBAUEBQQICAYFBQUFBQUF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sRCxUrG2sc2x5LH7shKyK7JEslCyXLJzsoqyobK6stGy6LL/sxizL7NGs12zdLOLs6Szu7PSs+m0ArQZtDC0R7RdtHO0jLSltLG0vbTUtOu1AbUatTC1RrVdtXa1jLWjtbq10LXmtf+2FrYttkO2XLZztou2ora4ts+25rdJt9+39rgNuCS4OrhRuGi4f7iVuKy43bj0uQq5Ibk4uU+5ZrnOulK6abp/upa6rLrDutq68bsIuxS7K7tCu1S7a7uCu5m7sLvHu9676bv0vAu8F7wjvDq8UbxdvGm8gLyXvKO8r7zEvPm9Bb0RvSi9P71LvVe9br2EvZS9q73Bvdi9774IviG+OL5Pvlu+Z75+vpS+q77Cvtm+7777vwe/E78fvza/TL9Yv2S/cL98v5O/n7+2v8y/47/5wBDAJ8BAwFnAcsCLwOjBTsFlwXzBk8GpwcLB2cHwwgfCHsI1wkvCYsJ5wpDCp8LKwvLDBcMcwzPDScNfw3jDkcOdw6nDwMPXw+3EBcQbxDHESMRhxHjEj8SmxL3E1MTtxQTFG8UxxUrFYcV3xY7F8cYIxh7GNcZMxmLGeMaOxqXHDsckxzrHUcdox3THi8eix7nH0Mfbx/HICMgUyCrINshLyFfIbsh6yJHIqMi/yNjI78j7yRHJKMk+yUrJYMlsyYLJjsmkybrJ0cnqygPKX8p2yozKpMq7ytLK6Mrzyv/LC8sXyyPLL8s7y1fLX8tny2/Ld8t/y4fLj8uXy5/Lp8uvy7fLv8vHy+DL+cwQzCfMPsxUzG/Md8x/zIfMj8yXzK/Mx8zezPXNDM0lzTzNp82vzcjN0M3Yze/OBs4OzhbOHs4mzj3ORc5NzlXOXc5lzm3Odc59zoXOjc6kzqzOtM8Hzw/PF88wz0fPT89Xz3DPeM+Pz6XPvM/Tz+rQAdAa0DPQStBh0GnQcdB90JTQnNCz0MrQ1tDi0PnRENEn0T7RRtFO0WfRgNGM0ZjRpNGw0bzRyNHQ0djR4NH30g7SFtIt0kTSW9J00nzShNKb0rLSy9LT0uzTBdMe0zfTT9Nm03zTldOu08fT4NPo0/DUCdQi1DvUU9Rq1IDUmdSx1MrU49T81RTVMdVO1VrVZtVu1XrVhtWS1Z7VtdXM1eXV/dYW1i7WR9Zf1njWkNar1sXW3tb31xDXKddC11vXdNeN16jXw9fP19vX8tgJ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AAUAJABIAAEA3gAIACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgBlAGcAkgCwALEAsgCzALQAtQC2ALcAuAC5ANEA0gDTANQA1QDWANcA2ADZANoA2wDcAN0A3gDfAOAA4QDiAOMA5ADlAOYA5wDoASwBMAEyATgBOgE8AT4BPwFFAUYBfwGFAYoBjQJHAkgCSgJMAk0CTgJPAlACUQJSAlMCVAJVAlYCVwJYAlkCWgJbAlwCXQJeAl8CYAJhAmICYwJkAmUCZgKDAoUChwKJAosCjQKPApECkwKVApcCmQKbAp0CnwKhAqMCpQKnAqkCqwKtAq8CsgK0ArYCuAK6ArwCvgLAAsICxQLHAskCywLNAs8C0QLTAtUC2QLbAt0C3wLhAuMC5QLnAukC6wLtAu8C8QLyAvQC9gNTA1QDVQNWA1cDWANZA1sDXANdA14DXwNgA2EDYgNkA2UDZgNnA2gDaQNqA3oDewN8A30DfgN/A4ADgQOCA4MDhAOFA4YDhwOIA4kDigOLA4wDjQOOA48DuwO9A78D1APaA+AESQRLBE8EVwRZBF4EagACAAAABAAOD84V8jViAAEDVAAEAAABpQrSCtIGggtwCoAK/g+aDAAGiA7uDu4MRg6gCiIO7g7uD5oKigaSDGYMRgrYCqwNUg8QCl4L4gsQDBYGmA22DbYNtgwgCxAKUAxMDbAMTAsQBqYN5gtwD5oLcAasBrIGvAbCBsgMTAbOBtgNtgb+BxQHKgcwB0YHTAdSB4QHigeQDcANwAe+Du4H4AgCDVIIMA7uDu4LJg7uDu4IRg3ADcAIeAiCCIwIpg1ICLgNsAjSCOgLEAkyCUwJaAloCxAJYgloCWgJaAtwDCAK2AxMCxAN5g1IDqAOoA1ICtIK0grSCtIK0gmKCbAJugnECeIJ9AoGChgK/g+aD5oPmg+aDGYLcAtwC3ALcAtwC3ALcAr+DAAMAAwADAAO7g7uDu4O7g7uD5oPmg+aD5oPmgxGDEYMRgxGDxAL4gviC+IL4gviC+IL4gwWDBYMFgwWDbYMIAwgDCAMIAwgDEwMTAtwC+ILcAviC3AL4gr+Cv4K/gr+D5oMAAwWDAAMFgwADBYMAAwWDAAMFg7uDbYO7g7uDu4O7g7uDEYOoAoiCiIKIgoiDu4Ntg7uDbYO7g22DbYPmgwgD5oMIA+aDCAKUApQClAMZgxmDGYMRgxGDEYMRgxGDEYKrA8QDEwPEApeCl4KXgtwDAAO7g7uD5oPEAtwCoAMAApeDu4O7g6gDu4O7g+aCooMZg8QDVIO7g8QDbYMIAxMDCAMAA3mDu4O7gxGDqAOoAsmC3AKgA3mDAAO7g7uD5oKigr+DGYNUgviDBYMIAsQDEwNsAwWDUgMTAqsCqwKrA8QDEwK0grSCtIO7g22C3AL4gwADBYK2AxMCv4PEAxMDu4NUg2wDu4LcAviC3AL4gwADBYMFgwWDVINsA+aDCAMIAsQCyYMTAsmDEwLJgxMDVINsAtwC+ILcAviC3AL4gtwC+ILcAviC3AL4gtwC+ILcAviC3AL4gtwC+ILcAviC3AL4gwADBYMAAwWDAAMFgwADBYMAAwWDAAMFgwADBYMAAwWDu4O7g+aDCAPmgwgD5oMIA+aDCAPmgwgD5oMIA+aDCAMIAxGDEYPEAxMDxAMTA8QDEwOoA7uDGYNUg2wDeYNSA1SDbANtg3ADeYOoA7uDu4PEA+aAAIAhwAGAAYAAAALAAsAAQATABMAAgAlACoAAwAsADUACQA4AD4AEwBFAEYAGgBJAEoAHABMAEwAHgBRAFQAHwBWAFYAIwBaAFoAJABcAF0AJQCKAIoAJwCcAJwAKACwALQAKQC2ALgALgC6ALoAMQC8AL0AMgC/AMAANADCAMQANgDGAMsAOQDRANEAPwDTAN0AQADfAN8ASwDhAOMATADlAOcATwDpAO0AUgDwAPAAVwD1APcAWAD6APsAWwD9AP8AXQEDAQQAYAEJAQkAYgEMAQwAYwEXARkAZAErAS0AZwEwATAAagEyATIAawFJAUkAbAFsAW0AbQFvAXEAbwG6AboAcgG9Ab0AcwHEAcUAdAHIAcgAdgHKAcsAdwHNAc0AeQIoAigAegIqAisAewJHAkgAfQJKAkoAfwJMAm0AgAJvAnIAogJ3AnwApgKBAokArAKLAosAtQKNAo0AtgKPAo8AtwKRApEAuAKTApwAuQKlAqcAwwKpAqkAxgKrAqsAxwKtAq0AyAKvAq8AyQKyArIAygK0ArQAywK2ArYAzAK4ArgAzQK6AroAzgK8ArwAzwK+AsoA0ALMAswA3QLOAs4A3gLQAtAA3wLbAtsA4ALdAt0A4QLfAt8A4gLh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BB7/6wQg/+sEIv/rBCT/6wQm/+sEKP/rBCr/6wQs/+sELv/rBDD/6wQy/+sENP/qBDb/6gQ4/+oEOv/qBDz/6gQ+/+oEQP/qBEL/6ARE/+gERv/oBE0AFAAfADj/1QA6/+QAO//sAD3/3QDR/9UA1f/VARj/5AEy/9UBOv/VAmb/3QLb/9UC3f/VAt//1QLt/+wC7//dAvH/3QNY/90DZ//dA2r/3QOO/9UDoP/sA6L/7AOk/+wDpv/dA7f/5AO//90EQf/dBEP/3QRF/90ETf/VBGr/3QAaADj/sAA6/+0APf/QANH/sADV/7ABGP/tATL/sAE6/7ACZv/QAtv/sALd/7AC3/+wAu//0ALx/9ADWP/QA2f/0ANq/9ADjv+wA6b/0AO3/+0Dv//QBEH/0ARD/9AERf/QBE3/sARq/9AAEAAu/+4AOf/uAmL/7gJj/+4CZP/uAmX/7gKy/+4C4f/uAuP/7gLl/+4C5//uAun/7gLr/+4Df//uBDP/7gQ1/+4ARwAGABAACwAQAEf/6ABI/+gASf/oAEv/6ABV/+gAk//oAJj/6AC6/+gAx//oAMj/6AD2/+gBAv/oAR3/6AEh/+gBOf/oAUv/6AFM/+gBVv/oAWwAEAFtABABbwAQAXAAEAFxABACbv/oAm//6AJw/+gCcf/oAnL/6AKK/+gCjP/oAo7/6AKQ/+gCkv/oApT/6AKW/+gCmP/oApr/6AKc/+gCnv/oAqD/6AKi/+gCpP/oA2v/6AOR/+gDlf/oA5j/6AOoABADqQAQA6wAEAOz/+gDuf/oA77/6APM/+gDzv/oA8//6APb/+gD7P/oBAj/6AQK/+gEDP/oBA7/6AQQ/+gEEv/oBBT/6AQW/+gEKv/oBCz/6AQu/+gEMv/oAAEAVgAEAAAAJgCmAZwB+gIUAlYCzAPCBLgFkgYsCMYKjAteDFQOGg5MDn4O/BDiEVgSKhRMFQIWaBciF6gYBhjIGT4ewBlQGqIc4B0CHhgelh7AHuoAAQAmAE8AWABbAF8AnAC0ALYAtwC4AL8AwgDDAMQAyQDLAMwAzQDRANUA1wDYANoA4gDmAOcA6ADpAOoA7ADuAPAA9QD3APoA/wECASEBbQA9AEf/7ABI/+wASf/sAEv/7ABV/+wAk//sAJj/7AC6/+wAx//sAMj/7AD2/+wBAv/sAR3/7AEh/+wBOf/sAUv/7AFM/+wBVv/sAm7/7AJv/+wCcP/sAnH/7AJy/+wCiv/sAoz/7AKO/+wCkP/sApL/7AKU/+wClv/sApj/7AKa/+wCnP/sAp7/7AKg/+wCov/sAqT/7ANr/+wDkf/sA5X/7AOY/+wDs//sA7n/7AO+/+wDzP/sA87/7APP/+wD2//sA+z/7AQI/+wECv/sBAz/7AQO/+wEEP/sBBL/7AQU/+wEFv/sBCr/7AQs/+wELv/sBDL/7AAXAFP/7AEX/+wCeP/sAnn/7AJ6/+wCe//sAnz/7ALG/+wCyP/sAsr/7ANx/+wDd//sA5P/7APZ/+wD3f/sBBz/7AQe/+wEIP/sBCL/7AQk/+wEJv/sBCj/7AQw/+wABgAQ/4QAEv+EAW7/hAFy/4QBdv+EAXf/hAAQAC7/7AA5/+wCYv/sAmP/7AJk/+wCZf/sArL/7ALh/+wC4//sAuX/7ALn/+wC6f/sAuv/7AN//+wEM//sBDX/7AAdAAb/8gAL//IAWv/zAF3/8wC8//MBGf/zAWz/8gFt//IBb//yAXD/8gFx//ICgf/zAoL/8wLw//MDc//zA5b/8wOf//MDp//zA6j/8gOp//IDrP/yA7j/8wPA//MD4f/zA+P/8wPl//MEQv/zBET/8wRG//MAPQAn//MAK//zADP/8wA1//MAg//zAJL/8wCX//MAsv/zANL/8wEH//MBFv/zARr/8wEc//MBHv/zASD/8wE4//MBVf/zAij/8wIp//MCK//zAiz/8wJT//MCXf/zAl7/8wJf//MCYP/zAmH/8wKJ//MCi//zAo3/8wKP//MCnf/zAp//8wKh//MCo//zAsX/8wLH//MCyf/zAvr/8wNX//MDZP/zA4r/8wON//MDuv/zA73/8wPY//MD2v/zA9z/8wQb//MEHf/zBB//8wQh//MEI//zBCX/8wQn//MEKf/zBCv/8wQt//MEL//zBDH/8wSq//MAPQAn/+YAK//mADP/5gA1/+YAg//mAJL/5gCX/+YAsv/mANL/5gEH/+YBFv/mARr/5gEc/+YBHv/mASD/5gE4/+YBVf/mAij/5gIp/+YCK//mAiz/5gJT/+YCXf/mAl7/5gJf/+YCYP/mAmH/5gKJ/+YCi//mAo3/5gKP/+YCnf/mAp//5gKh/+YCo//mAsX/5gLH/+YCyf/mAvr/5gNX/+YDZP/mA4r/5gON/+YDuv/mA73/5gPY/+YD2v/mA9z/5gQb/+YEHf/mBB//5gQh/+YEI//mBCX/5gQn/+YEKf/mBCv/5gQt/+YEL//mBDH/5gSq/+YANgAl/+QAPP/SAD3/0wCx/+QAs//kANn/0gEM/+QCTP/kAk3/5AJO/+QCT//kAlD/5AJR/+QCUv/kAmb/0wKD/+QChf/kAof/5ALv/9MC8f/TA1P/5ANY/9MDW//kA2f/0wNo/9IDav/TA4P/5AOP/9IDpv/TA6//5AO//9MDwv/SA8X/5APH/+QD0P/SA+r/0gPv/+QD8f/kA/P/5AP1/+QD9//kA/n/5AP7/+QD/f/kA///5AQB/+QEA//kBAX/5ARB/9MEQ//TBEX/0wRP/9IEV//SBGr/0wAmABD/HgAS/x4AJf/NALH/zQCz/80BDP/NAW7/HgFy/x4Bdv8eAXf/HgJM/80CTf/NAk7/zQJP/80CUP/NAlH/zQJS/80Cg//NAoX/zQKH/80DU//NA1v/zQOD/80Dr//NA8X/zQPH/80D7//NA/H/zQPz/80D9f/NA/f/zQP5/80D+//NA/3/zQP//80EAf/NBAP/zQQF/80ApgBH/9wASP/cAEn/3ABL/9wAUf/zAFL/8wBT/9YAVP/zAFX/3ABZ/90AWv/hAF3/4QCT/9wAmP/cAJr/3QC6/9wAvP/hAMD/8wDH/9wAyP/cAMr/3QDr//MA7//zAPD/8wDy//MA8//zAPT/8wD2/9wA9//zAPn/8wD6//MA/f/zAP//8wEC/9wBBP/zARf/1gEZ/+EBHf/cASH/3AE1//MBOf/cAUT/8wFJ//MBS//cAUz/3AFW/9wCbv/cAm//3AJw/9wCcf/cAnL/3AJ3//MCeP/WAnn/1gJ6/9YCe//WAnz/1gJ9/90Cfv/dAn//3QKA/90Cgf/hAoL/4QKK/9wCjP/cAo7/3AKQ/9wCkv/cApT/3AKW/9wCmP/cApr/3AKc/9wCnv/cAqD/3AKi/9wCpP/cAr//8wLB//MCw//zAsT/8wLG/9YCyP/WAsr/1gLi/90C5P/dAub/3QLo/90C6v/dAuz/3QLw/+EDa//cA23/8wNv/90Dcf/WA3P/4QN2/90Dd//WA3j/3QOR/9wDkv/zA5P/1gOU//MDlf/cA5b/4QOY/9wDmf/zA57/8wOf/+EDp//hA67/8wOz/9wDtP/zA7j/4QO5/9wDvv/cA8D/4QPM/9wDzv/cA8//3APV//MD1//zA9n/1gPb/9wD3f/WA+H/4QPj/+ED5f/hA+n/8wPs/9wECP/cBAr/3AQM/9wEDv/cBBD/3AQS/9wEFP/cBBb/3AQc/9YEHv/WBCD/1gQi/9YEJP/WBCb/1gQo/9YEKv/cBCz/3AQu/9wEMP/WBDL/3AQ0/90ENv/dBDj/3QQ6/90EPP/dBD7/3QRA/90EQv/hBET/4QRG/+EESv/zBEz/8wRW//MEY//zBGX/8wRn//MAcQAG/9oAC//aAEf/8ABI//AASf/wAEv/8ABV//AAWf/vAFr/3ABd/9wAk//wAJj/8ACa/+8Auv/wALz/3ADH//AAyP/wAMr/7wD2//ABAv/wARn/3AEd//ABIf/wATn/8AFL//ABTP/wAVb/8AFs/9oBbf/aAW//2gFw/9oBcf/aAm7/8AJv//ACcP/wAnH/8AJy//ACff/vAn7/7wJ//+8CgP/vAoH/3AKC/9wCiv/wAoz/8AKO//ACkP/wApL/8AKU//AClv/wApj/8AKa//ACnP/wAp7/8AKg//ACov/wAqT/8ALi/+8C5P/vAub/7wLo/+8C6v/vAuz/7wLw/9wDa//wA2//7wNz/9wDdv/vA3j/7wOR//ADlf/wA5b/3AOY//ADn//cA6f/3AOo/9oDqf/aA6z/2gOz//ADuP/cA7n/8AO+//ADwP/cA8z/8APO//ADz//wA9v/8APh/9wD4//cA+X/3APs//AECP/wBAr/8AQM//AEDv/wBBD/8AQS//AEFP/wBBb/8AQq//AELP/wBC7/8AQy//AENP/vBDb/7wQ4/+8EOv/vBDz/7wQ+/+8EQP/vBEL/3ARE/9wERv/cADQABv+gAAv/oABZ//EAWv/FAF3/xQCa//EAvP/FAMr/8QEZ/8UBbP+gAW3/oAFv/6ABcP+gAXH/oAJ9//ECfv/xAn//8QKA//ECgf/FAoL/xQLi//EC5P/xAub/8QLo//EC6v/xAuz/8QLw/8UDb//xA3P/xQN2//EDeP/xA5b/xQOf/8UDp//FA6j/oAOp/6ADrP+gA7j/xQPA/8UD4f/FA+P/xQPl/8UENP/xBDb/8QQ4//EEOv/xBDz/8QQ+//EEQP/xBEL/xQRE/8UERv/FAD0AR//nAEj/5wBJ/+cAS//nAFX/5wCT/+cAmP/nALr/5wDH/+cAyP/nAPb/5wEC/+cBHf/nASH/5wE5/+cBS//nAUz/5wFW/+cCbv/nAm//5wJw/+cCcf/nAnL/5wKK/+cCjP/nAo7/5wKQ/+cCkv/nApT/5wKW/+cCmP/nApr/5wKc/+cCnv/nAqD/5wKi/+cCpP/nA2v/5wOR/+cDlf/nA5j/5wOz/+cDuf/nA77/5wPM/+cDzv/nA8//5wPb/+cD7P/nBAj/5wQK/+cEDP/nBA7/5wQQ/+cEEv/nBBT/5wQW/+cEKv/nBCz/5wQu/+cEMv/nAHEABgAMAAsADABH/+gASP/oAEn/6ABL/+gAU//qAFX/6ABaAAsAXQALAJP/6ACY/+gAuv/oALwACwDH/+gAyP/oAPb/6AEC/+gBF//qARkACwEd/+gBIf/oATn/6AFL/+gBTP/oAVb/6AFsAAwBbQAMAW8ADAFwAAwBcQAMAm7/6AJv/+gCcP/oAnH/6AJy/+gCeP/qAnn/6gJ6/+oCe//qAnz/6gKBAAsCggALAor/6AKM/+gCjv/oApD/6AKS/+gClP/oApb/6AKY/+gCmv/oApz/6AKe/+gCoP/oAqL/6AKk/+gCxv/qAsj/6gLK/+oC8AALA2v/6ANx/+oDcwALA3f/6gOR/+gDk//qA5X/6AOWAAsDmP/oA58ACwOnAAsDqAAMA6kADAOsAAwDs//oA7gACwO5/+gDvv/oA8AACwPM/+gDzv/oA8//6APZ/+oD2//oA93/6gPhAAsD4wALA+UACwPs/+gECP/oBAr/6AQM/+gEDv/oBBD/6AQS/+gEFP/oBBb/6AQc/+oEHv/qBCD/6gQi/+oEJP/qBCb/6gQo/+oEKv/oBCz/6AQu/+gEMP/qBDL/6ARCAAsERAALBEYACwAMAFz/7QBe/+0A7f/tAvP/7QL1/+0C9//tA5f/7QPD/+0D0f/tA+v/7QRQ/+0EWP/tAAwAXP/yAF7/8gDt//IC8//yAvX/8gL3//IDl//yA8P/8gPR//ID6//yBFD/8gRY//IAHwBa//QAXP/yAF3/9ABe//MAvP/0AO3/8gEZ//QCgf/0AoL/9ALw//QC8//zAvX/8wL3//MDc//0A5b/9AOX//IDn//0A6f/9AO4//QDwP/0A8P/8gPR//ID4f/0A+P/9APl//QD6//yBEL/9ARE//QERv/0BFD/8gRY//IAeQAG/8oAC//KADj/0gA6/9QAPP/0AD3/0wBR/9EAUv/RAFT/0QBa/+YAXP/vAF3/5gC8/+YAwP/RANH/0gDV/9IA2f/0AN3/7QDg/+EA6//RAO3/7wDv/9EA8P/RAPL/0QDz/9EA9P/RAPf/0QD5/9EA+v/RAP3/0QD//9EBBP/RARj/1AEZ/+YBMv/SATX/0QE6/9IBRP/RAUn/0QFs/8oBbf/KAW//ygFw/8oBcf/KAmb/0wJ3/9ECgf/mAoL/5gK//9ECwf/RAsP/0QLE/9EC2//SAt3/0gLf/9IC7//TAvD/5gLx/9MDWP/TA2f/0wNo//QDav/TA23/0QNz/+YDgv/tA47/0gOP//QDkv/RA5T/0QOW/+YDl//vA5n/0QOe/9EDn//mA6b/0wOn/+YDqP/KA6n/ygOs/8oDrv/RA7T/0QO3/9QDuP/mA7//0wPA/+YDwv/0A8P/7wPQ//QD0f/vA9X/0QPX/9ED4P/tA+H/5gPi/+0D4//mA+T/7QPl/+YD5v/hA+n/0QPq//QD6//vBEH/0wRC/+YEQ//TBET/5gRF/9MERv/mBEr/0QRM/9EETf/SBE//9ARQ/+8EUf/hBFP/4QRW/9EEV//0BFj/7wRj/9EEZf/RBGf/0QRq/9MAHQA4/74AWv/vAF3/7wC8/+8A0f++ANX/vgEZ/+8BMv++ATr/vgKB/+8Cgv/vAtv/vgLd/74C3/++AvD/7wNz/+8Djv++A5b/7wOf/+8Dp//vA7j/7wPA/+8D4f/vA+P/7wPl/+8EQv/vBET/7wRG/+8ETf++ADQAOP/mADr/5wA8//IAPf/nAFz/8QDR/+YA1f/mANn/8gDd/+4A4P/oAO3/8QEY/+cBMv/mATr/5gJm/+cC2//mAt3/5gLf/+YC7//nAvH/5wNY/+cDZ//nA2j/8gNq/+cDgv/uA47/5gOP//IDl//xA6b/5wO3/+cDv//nA8L/8gPD//ED0P/yA9H/8QPg/+4D4v/uA+T/7gPm/+gD6v/yA+v/8QRB/+cEQ//nBEX/5wRN/+YET//yBFD/8QRR/+gEU//oBFf/8gRY//EEav/nAIgAJQAQACf/6AAr/+gAM//oADX/6AA4/+AAOv/gAD3/3wCD/+gAkv/oAJf/6ACxABAAsv/oALMAEADR/+AA0v/oANMAEADV/+AA3AAQAOD/4QDxABAA+P/gAQMAEAEH/+gBDAAQARb/6AEY/+ABGv/oARz/6AEe/+gBIP/oATL/4AE4/+gBOv/gAVEAEAFV/+gCKP/oAin/6AIr/+gCLP/oAkwAEAJNABACTgAQAk8AEAJQABACUQAQAlIAEAJT/+gCXf/oAl7/6AJf/+gCYP/oAmH/6AJm/98CgwAQAoUAEAKHABACif/oAov/6AKN/+gCj//oAp3/6AKf/+gCof/oAqP/6ALF/+gCx//oAsn/6ALb/+AC3f/gAt//4ALv/98C8f/fAvr/6ANTABADV//oA1j/3wNbABADZP/oA2f/3wNq/98DgwAQA4r/6AON/+gDjv/gA6b/3wOvABADt//gA7r/6AO9/+gDv//fA8UAEAPHABAD2P/oA9r/6APc/+gD5v/hA+f/4APtABAD7gAQA+8AEAPxABAD8wAQA/UAEAP3ABAD+QAQA/sAEAP9ABAD/wAQBAEAEAQDABAEBQAQBBv/6AQd/+gEH//oBCH/6AQj/+gEJf/oBCf/6AQp/+gEK//oBC3/6AQv/+gEMf/oBEH/3wRD/98ERf/fBE3/4ARR/+EEUv/gBFP/4QRU/+AEaAAQBGkAEARq/98Eqv/oAC0AOP/xADr/9AA8//QAPf/wANH/8QDT//UA1f/xANn/9ADc//UA3f/zARj/9AEy//EBOv/xAVH/9QJm//AC2//xAt3/8QLf//EC7//wAvH/8ANY//ADZ//wA2j/9ANq//ADgv/zA47/8QOP//QDpv/wA7f/9AO///ADwv/0A9D/9APg//MD4v/zA+T/8wPq//QD7f/1BEH/8ARD//AERf/wBE3/8QRP//QEV//0BGj/9QRq//AAWQAlAA8AOP/mADr/5gA8AA4APf/mALEADwCzAA8A0f/mANMADgDV/+YA2QAOANwADgDdAAsA4P/lAPEADwD4/+gBAwAPAQwADwEY/+YBMv/mATr/5gFRAA4CTAAPAk0ADwJOAA8CTwAPAlAADwJRAA8CUgAPAmb/5gKDAA8ChQAPAocADwLb/+YC3f/mAt//5gLv/+YC8f/mA1MADwNY/+YDWwAPA2f/5gNoAA4Dav/mA4IACwODAA8Djv/mA48ADgOm/+YDrwAPA7f/5gO//+YDwgAOA8UADwPHAA8D0AAOA+AACwPiAAsD5AALA+b/5QPn/+gD6gAO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ABADogOiABADpAOkABADpgOmAA8DpwOnABkDqAOpAB0DrAOsAB0DrQOtAAIDrgOuABcDsAOwABMDsQOxAAUDswOzABYDtwO3AA0DuAO4ABkDvQO9AAQDvgO+ABQDvwO/AA8DwAPAABkDwQPBAAIDwgPCAA4DwwPDABsDxAPEAAIDxgPGABMDyAPIABMDywPLAAUDzAPMABYDzgPPABYD0APQAA4D0QPRABsD2APYAAMD2QPZABgD3QPdABgD3wPfABUD4APgABID4QPhABkD4gPiABID4wPjABkD5APkABID5QPlABkD6gPqAA4D6wPrABsD8APwABMD8gPyABMD9AP0ABMD9gP2ABMD+AP4ABMD+gP6ABMD/AP8ABMD/gP+ABMEAAQAABMEAgQCABMEBAQEABMEBgQGABMEBwQHAAUECAQIABYECQQJAAUECgQKABYECwQLAAUEDAQMABYEDQQNAAUEDgQOABYEDwQPAAUEEAQQABYEEQQRAAUEEgQSABYEEwQTAAUEFAQUABYEFQQVAAUEFgQWABYEFwQXAAIEGQQZAAIEGwQbAAMEHAQcABgEHQQdAAMEHgQeABgEHwQfAAMEIAQgABgEIQQhAAMEIgQiABgEIwQjAAMEJAQkABgEJQQlAAMEJgQmABgEJwQnAAMEKAQoABgEMAQwABgEMwQzAAwENQQ1AAwEQQRBAA8EQgRCABkEQwRDAA8ERAREABkERQRFAA8ERgRGABkESQRJAAkESwRLAAIETQRNAAYETwRPAA4EUARQABsEVQRVAAcEVgRWAAgEVwRXAA4EWARYABsEWwRbABcEXQRdAB8EXgReAAcEYARgAAkEZARkAAIEZgRmAAIEagRqAA8EqgSqAAMAAgFtAAYABgAHAAsACwAHABAAEAATABEAEQAXABIAEgATACUAJQARACcAJwAFACsAKwAFAC4ALgAcADMAMwAFADUANQAFADcANwAZADgAOAAKADkAOQAGADoAOgANADsAOwAJADwAPAASAD0APQAOAD4APgAUAEUARQAaAEcASQAVAEsASwAVAFEAUgAYAFMAUwAIAFQAVAAYAFUAVQAVAFcAVwAbAFkAWQALAFoAWgACAFwAXAAWAF0AXQACAF4AXgAMAIMAgwAFAJIAkgAFAJMAkwAVAJcAlwAFAJgAmAAVAJoAmgALALEAsQAR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b20EbGRub20EbGRub20EbGZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmxpZ2EEfGxpZ2EEhGxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxvY2wEkGxvY2wElmxvY2wEnG51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqHBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5AAAAAEAAAAAAAIAAgADAAAAAQAHAAAAAQAYAAAAAwAVABYAFwAAAAIACAAJAAAAAQAJAAAAAQAUAAAAAQAEAAAAAQAGAAAAAQAFAAAAAQAZAAAAAQARAAAAAQATAAAAAQABAAAAAQAKAAAAAQALAAAAAQAMAAAAAQANAAAAAQAOAAAAAQAPAAAAAQAQAAAAAQASABsAOAPGBrQHYA3wDfAOBg4oDl4OhA6yDsYO2g7uDwAPGg9cD3oPmA/KD/wQLhBCEHoQbBB6EKYAAQAAAAEACAACAcQA3wHnAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHoAekCRAI7AeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QH+AgACAQTdAgICAwIEAgUCBgIHAggCCQIKAgsCLwIPAhACEQIUAhUCFgIXAhgCGQIbAhwCHgIdAvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRgNFA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSBKsErAStBK4ErwSwBLEEsgSzBLQEtQS2BLcEuAS5BLoEuwS8BL0EvgS/BMAEwQTCBMMExATFBMYB/wTHBMgEyQTKBMsEzATNBM4EzwTQBNEE0gTTBNQE1QTWBNgE2QTbAhoE3AIOBNcCEwINBNoCDAISAAEA3wAIACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgBlAGcAhQCSALAAsQCyALMAtAC1ALYAtwC4ALkA0QDSANMA1ADVANYA1wDYANkA2gDbANwA3QDeAN8A4ADhAOIA4wDkAOUA5gDnAOgBLAEwATIBOAE6ATwBPgE/AUUBRgF/AYUBigGNAkcCSAJKAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAoMChQKHAokCiwKNAo8CkQKTApUClwKZApsCnQKfAqECowKlAqcCqQKrAq0CrwKyArQCtgK4AroCvAK+AsACwgLFAscCyQLLAs0CzwLRAtMC1QLZAtsC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvIC9AL2A1MDVANVA1YDVwNYA1kDWwNcA10DXgNfA2ADYQNiA2QDZQNmA2cDaANpA2oDegN7A3wDfQN+A38DgAOBA4IDgwOEA4UDhgOHA4gDiQOKA4sDjAONA44DjwO7A70DvwPUA9oD4ARJBEsETwRXBFkEXgRqAAEAAAABAAgAAgF0ALcBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAv0DMAI7AfoEygTLAfsB/AH9Af4B/wIABM4EzwTRBNQE3QICAgMCBAIFAgYCBwIIAgkCCgILAfQB9QH2AfcB+AH5Ai8CDwIQAhECFAIVAhcCGQL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZA08DGgMbAxwDHQMeAx8DIAMhAyIDIwMkAyUDJgMnAygDKQMqAysDLAMtAy4DLwMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRgNFA0cDSANJA0oDSwNMA00DTgNQA1EDUgTJBMwEzQTQBNIE0wIBBNUEwQTCBMMExATFBMYExwTIBNYE2ATZAhgE2wIaBNwC/AIOBNcCEwINBNoCFgIMAhIAAQC3AEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgCHAIwAkwDpAOoA6wDsAO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+AP8BAAEBAQIBAwEEAQUBBgEtATEBMwE5ATsBPQFAAUcCSwJnAmgCaQJqAmsCbAJtAm4CbwJwAnECcgJzAnQCdQJ2AncCeAJ5AnoCewJ8An0CfgJ/AoACgQKCAoQChgKIAooCjAKOApACkgKUApYCmAKaApwCngKgAqICpAKmAqgCqgKsAq4CswK1ArcCuQK7Ar0CvwLBAsMCxgLIAsoCzALOAtAC0gLUAtYC2gLcAt4C4ALiAuQC5gLoAuoC7ALuAvAC8wL1AvcDkAORA5IDkwOUA5UDlgOXA5gDmQOaA5sDnAOdA54DnwO8A74DwAPOA9UD2wPhBEcESgRMBFAEWARaBFsEXwRrAAYAAAAGABIAKgBCAFoAcgCKAAMAAAABABIAAQCQAAEAAAAaAAEAAQBNAAMAAAABABIAAQB4AAEAAAAaAAEAAQBOAAMAAAABABIAAQBgAAEAAAAaAAEAAQKuAAMAAAABABIAAQBIAAEAAAAaAAEAAQObAAMAAAABABIAAQAwAAEAAAAaAAEAAQOdAAMAAAABABIAAQAYAAEAAAAaAAEAAQQaAAIAAQCnAKsAAAAEAAAAAQAIAAEGHgA2AHIApACuALgAygD8AQ4BGAFKAWQBfgGQAboB7AH2AhgCMgJEAnYCiAKiAswC3gMQAxoDJAM2A2gDcgN8A4YDoAO6A8wD9gQoBDIEVARuBIAEsgTEBN4FCAUaBSQFLgU4BUIFbAWWBcAF6gYUAAYADgAUABoAIAAmACwCTAACAKcCTQACAKgCTwACAKkD8QACAKoEewACAKsD7wACAKwAAQAEBIgAAgCsAAEABAKJAAIAqAACAAYADASKAAIArASMAAIBogAGAA4AFAAaACAAJgAsAlQAAgCnAlUAAgCoBAsAAgCpBAkAAgCqBH0AAgCrBAcAAgCsAAIABgAMBHcAAgCoAqMAAgGiAAEABASOAAIArAAGAA4AFAAaACAAJgAsAlgAAgCnAlkAAgCoAqcAAgCpBBcAAgCqBH8AAgCrBBkAAgCsAAMACAAOABQEkAACAKgEkgACAKwCtAACAaIAAwAIAA4AFAK2AAIAqASUAAIArAK4AAIBogACAAYADAOtAAIAqASWAAIArAAFAAwAEgAYAB4AJAR5AAIApwK+AAIAqAJcAAIAqQSYAAIArALAAAIBogAGAA4AFAAaACAAJgAsAl0AAgCnAl4AAgCoAmAAAgCpBB0AAgCqBIEAAgCrBBsAAgCsAAEABASaAAIAqAAEAAoAEAAWABwCywACAKgEgwACAKsEnAACAKwCzQACAaIAAwAIAA4AFALRAAIAqASeAAIArALXAAIBogACAAYADASgAAIArALbAAIBogAGAA4AFAAaACAAJgAsAmIAAgCnAmMAAgCoAuEAAgCpBDUAAgCqBIUAAgCrBDMAAgCsAAIABgAMBKIAAgCpBKQAAgCsAAMACAAOABQDoAACAKcDogACAKgEpgACAKwABQAMABIAGAAeACQDpgACAKcCZgACAKgERQACAKkEQwACAKoEQQACAKwAAgAGAAwC8gACAKgEqAACAKwABgAOABQAGgAgACYALAJnAAIApwJoAAIAqAJqAAIAqQPyAAIAqgR8AAIAqwPwAAIArAABAAQEiQACAKwAAQAEAooAAgCoAAIABgAMBIsAAgCsBI0AAgGiAAYADgAUABoAIAAmACwCbwACAKcCcAACAKgEDAACAKkECgACAKoEfgACAKsECAACAKwAAQAEBHgAAgCoAAEABASPAAIArAABAAQEGgACAKwAAwAIAA4AFASRAAIAqASTAAIArAK1AAIBogADAAgADgAUArcAAgCoBJUAAgCsArkAAgGiAAIABgAMA64AAgCoBJcAAgCsAAUADAASABgAHgAkBHoAAgCnAr8AAgCoAncAAgCpBJkAAgCsAsEAAgGiAAYADgAUABoAIAAmACwCeAACAKcCeQACAKgCewACAKkEHgACAKoEggACAKsEHAACAKwAAQAEBJsAAgCoAAQACgAQABYAHALMAAIAqASEAAIAqwSdAAIArALOAAIBogADAAgADgAUAtIAAgCoBJ8AAgCsAtgAAgGiAAIABgAMBKEAAgCsAtwAAgGiAAYADgAUABoAIAAmACwCfQACAKcCfgACAKgC4gACAKkENgACAKoEhgACAKsENAACAKwAAgAGAAwEowACAKkEpQACAKwAAwAIAA4AFAOhAAIApwOjAAIAqASnAAIArAAFAAwAEgAYAB4AJAOnAAIApwKBAAIAqARGAAIAqQREAAIAqgRCAAIArAACAAYADALzAAIAqASpAAIArAABAAQC+AACAKgAAQAEAvoAAgCoAAEABAL5AAIAqAABAAQC+wACAKgABQAMABIAGAAeACQCcwACAKcCdAACAKgCqAACAKkEGAACAKoEgAACAKsABQAMABIAGAAeACQEKwACAKcEKQACAKgELwACAKkELQACAKoEMQACAKwABQAMABIAGAAeACQELAACAKcEKgACAKgEMAACAKkELgACAKoEMgACAKwABQAMABIAGAAeACQEOQACAKcENwACAKgEPQACAKkEOwACAKoEPwACAKwABQAMABIAGAAeACQEOgACAKcEOAACAKgEPgACAKkEPAACAKoEQAACAKwAAQAEBIcAAgCoAAIAEQAlACkAAAArAC0ABQAvADQACAA2ADsADgA9AD4AFABFAEkAFgBLAE0AGwBPAFQAHgBWAFsAJABdAF4AKgCBAIEALACDAIMALQCGAIYALgCJAIkALwCMAIwAMACXAJoAMQDPAM8ANQABAAAAAQAIAAEABgACAAEAAgLVAtYAAQAAAAEACAACAA4ABATeBN8E4AThAAEABAKHAogCmQKaAAQAAAABAAgAAQAmAAIACgAcAAIABgAMAaMAAgBKAagAAgBYAAEABAGpAAIAWAABAAIASgBXAAQAAAABAAgAAQBEAAIACgAUAAEABAGkAAIATQABAAQBpgACAE0ABAAAAAEACAABAB4AAgAKABQAAQAEAaUAAgBQAAEABAGnAAIAUAABAAIASgGjAAEAAAABAAgAAQAGAZUAAQABAEsAAQAAAAEACAABAAYBJwABAAEAugABAAAAAQAIAAEABgGsAAEAAQA2AAEAAAABAAgAAgAcAAIB4wHkAAEAAAABAAgAAgAKAAIB5QHmAAEAAgAvAE8AAQAAAAEACAACAB4ADAIoAioCKQIrAiwCHwIgAiECIgGuAiQCJQABAAwAJwAoACsAMwA1AEYARwBIAEsAUwBUAFUAAQAAAAEACAACAAwAAwImAicCJwABAAMASQBLAiIAAQAAAAEACAACAGYACAI9Ai0CLgIwAjECOQI6AjwAAQAAAAEACAACABYACAAbABUAFgAXABgAGQAdABQAAQAIAa0CIwRxBHIEcwR0BHUEdgABAAAAAQAIAAIAFgAIBHYCIwRxBHIEcwR0Aa0EdQABAAgAFAAVABYAFwAYABkAGwAdAAEAAAABAAgAAgAWAAgAFQAWABcAGAAZABsAHQAUAAEACAItAi4CMAIxAjkCOgI8Aj0AAQAAAAEACAABAAYBaQABAAEAEwAGAAAAAQAIAAMAAQASAAEAUgAAAAEAAAAaAAIAAgF8AXwAAAHUAd0AAQABAAAAAQAIAAEAKAHAAAEAAAABAAgAAgAaAAoCMgB6AHMAdAIzAjQCNQI2AjcCOAACAAEAFAAdAAAAAQAAAAEACAACACYAEAHUAdUB1gHXAdgB2QHaAdsB3AHdAkACPgJBAkICPwJDAAEAEAAUABUAFgAXABgAGQAaABsAHAAdAE0ATgKuA5sDnQQa"
59645 /*! DataTables 1.10.18
59646  * ©2008-2018 SpryMedia Ltd - datatables.net/license
59647  */
59650  * @summary     DataTables
59651  * @description Paginate, search and order HTML tables
59652  * @version     1.10.18
59653  * @file        jquery.dataTables.js
59654  * @author      SpryMedia Ltd
59655  * @contact     www.datatables.net
59656  * @copyright   Copyright 2008-2018 SpryMedia Ltd.
59658  * This source file is free software, available under the following license:
59659  *   MIT license - http://datatables.net/license
59661  * This source file is distributed in the hope that it will be useful, but
59662  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
59663  * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
59665  * For details please refer to: http://www.datatables.net
59666  */
59668 /*jslint evil: true, undef: true, browser: true */
59669 /*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/
59671 (function( factory ) {
59672         "use strict";
59674         if ( typeof define === 'function' && define.amd ) {
59675                 // AMD
59676                 define( ['jquery'], function ( $ ) {
59677                         return factory( $, window, document );
59678                 } );
59679         }
59680         else if ( typeof exports === 'object' ) {
59681                 // CommonJS
59682                 module.exports = function (root, $) {
59683                         if ( ! root ) {
59684                                 // CommonJS environments without a window global must pass a
59685                                 // root. This will give an error otherwise
59686                                 root = window;
59687                         }
59689                         if ( ! $ ) {
59690                                 $ = typeof window !== 'undefined' ? // jQuery's factory checks for a global window
59691                                         require('jquery') :
59692                                         require('jquery')( root );
59693                         }
59695                         return factory( $, root, root.document );
59696                 };
59697         }
59698         else {
59699                 // Browser
59700                 factory( jQuery, window, document );
59701         }
59703 (function( $, window, document, undefined ) {
59704         "use strict";
59706         /**
59707          * DataTables is a plug-in for the jQuery Javascript library. It is a highly
59708          * flexible tool, based upon the foundations of progressive enhancement,
59709          * which will add advanced interaction controls to any HTML table. For a
59710          * full list of features please refer to
59711          * [DataTables.net](href="http://datatables.net).
59712          *
59713          * Note that the `DataTable` object is not a global variable but is aliased
59714          * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may
59715          * be  accessed.
59716          *
59717          *  @class
59718          *  @param {object} [init={}] Configuration object for DataTables. Options
59719          *    are defined by {@link DataTable.defaults}
59720          *  @requires jQuery 1.7+
59721          *
59722          *  @example
59723          *    // Basic initialisation
59724          *    $(document).ready( function {
59725          *      $('#example').dataTable();
59726          *    } );
59727          *
59728          *  @example
59729          *    // Initialisation with configuration options - in this case, disable
59730          *    // pagination and sorting.
59731          *    $(document).ready( function {
59732          *      $('#example').dataTable( {
59733          *        "paginate": false,
59734          *        "sort": false
59735          *      } );
59736          *    } );
59737          */
59738         var DataTable = function ( options )
59739         {
59740                 /**
59741                  * Perform a jQuery selector action on the table's TR elements (from the tbody) and
59742                  * return the resulting jQuery object.
59743                  *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
59744                  *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
59745                  *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter
59746                  *    criterion ("applied") or all TR elements (i.e. no filter).
59747                  *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.
59748                  *    Can be either 'current', whereby the current sorting of the table is used, or
59749                  *    'original' whereby the original order the data was read into the table is used.
59750                  *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
59751                  *    ("current") or not ("all"). If 'current' is given, then order is assumed to be
59752                  *    'current' and filter is 'applied', regardless of what they might be given as.
59753                  *  @returns {object} jQuery object, filtered by the given selector.
59754                  *  @dtopt API
59755                  *  @deprecated Since v1.10
59756                  *
59757                  *  @example
59758                  *    $(document).ready(function() {
59759                  *      var oTable = $('#example').dataTable();
59760                  *
59761                  *      // Highlight every second row
59762                  *      oTable.$('tr:odd').css('backgroundColor', 'blue');
59763                  *    } );
59764                  *
59765                  *  @example
59766                  *    $(document).ready(function() {
59767                  *      var oTable = $('#example').dataTable();
59768                  *
59769                  *      // Filter to rows with 'Webkit' in them, add a background colour and then
59770                  *      // remove the filter, thus highlighting the 'Webkit' rows only.
59771                  *      oTable.fnFilter('Webkit');
59772                  *      oTable.$('tr', {"search": "applied"}).css('backgroundColor', 'blue');
59773                  *      oTable.fnFilter('');
59774                  *    } );
59775                  */
59776                 this.$ = function ( sSelector, oOpts )
59777                 {
59778                         return this.api(true).$( sSelector, oOpts );
59779                 };
59782                 /**
59783                  * Almost identical to $ in operation, but in this case returns the data for the matched
59784                  * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
59785                  * rather than any descendants, so the data can be obtained for the row/cell. If matching
59786                  * rows are found, the data returned is the original data array/object that was used to
59787                  * create the row (or a generated array if from a DOM source).
59788                  *
59789                  * This method is often useful in-combination with $ where both functions are given the
59790                  * same parameters and the array indexes will match identically.
59791                  *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
59792                  *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
59793                  *  @param {string} [oOpts.filter=none] Select elements that meet the current filter
59794                  *    criterion ("applied") or all elements (i.e. no filter).
59795                  *  @param {string} [oOpts.order=current] Order of the data in the processed array.
59796                  *    Can be either 'current', whereby the current sorting of the table is used, or
59797                  *    'original' whereby the original order the data was read into the table is used.
59798                  *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
59799                  *    ("current") or not ("all"). If 'current' is given, then order is assumed to be
59800                  *    'current' and filter is 'applied', regardless of what they might be given as.
59801                  *  @returns {array} Data for the matched elements. If any elements, as a result of the
59802                  *    selector, were not TR, TD or TH elements in the DataTable, they will have a null
59803                  *    entry in the array.
59804                  *  @dtopt API
59805                  *  @deprecated Since v1.10
59806                  *
59807                  *  @example
59808                  *    $(document).ready(function() {
59809                  *      var oTable = $('#example').dataTable();
59810                  *
59811                  *      // Get the data from the first row in the table
59812                  *      var data = oTable._('tr:first');
59813                  *
59814                  *      // Do something useful with the data
59815                  *      alert( "First cell is: "+data[0] );
59816                  *    } );
59817                  *
59818                  *  @example
59819                  *    $(document).ready(function() {
59820                  *      var oTable = $('#example').dataTable();
59821                  *
59822                  *      // Filter to 'Webkit' and get all data for
59823                  *      oTable.fnFilter('Webkit');
59824                  *      var data = oTable._('tr', {"search": "applied"});
59825                  *
59826                  *      // Do something with the data
59827                  *      alert( data.length+" rows matched the search" );
59828                  *    } );
59829                  */
59830                 this._ = function ( sSelector, oOpts )
59831                 {
59832                         return this.api(true).rows( sSelector, oOpts ).data();
59833                 };
59836                 /**
59837                  * Create a DataTables Api instance, with the currently selected tables for
59838                  * the Api's context.
59839                  * @param {boolean} [traditional=false] Set the API instance's context to be
59840                  *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was
59841                  *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),
59842                  *   or if all tables captured in the jQuery object should be used.
59843                  * @return {DataTables.Api}
59844                  */
59845                 this.api = function ( traditional )
59846                 {
59847                         return traditional ?
59848                                 new _Api(
59849                                         _fnSettingsFromNode( this[ _ext.iApiIndex ] )
59850                                 ) :
59851                                 new _Api( this );
59852                 };
59855                 /**
59856                  * Add a single new row or multiple rows of data to the table. Please note
59857                  * that this is suitable for client-side processing only - if you are using
59858                  * server-side processing (i.e. "bServerSide": true), then to add data, you
59859                  * must add it to the data source, i.e. the server-side, through an Ajax call.
59860                  *  @param {array|object} data The data to be added to the table. This can be:
59861                  *    <ul>
59862                  *      <li>1D array of data - add a single row with the data provided</li>
59863                  *      <li>2D array of arrays - add multiple rows in a single call</li>
59864                  *      <li>object - data object when using <i>mData</i></li>
59865                  *      <li>array of objects - multiple data objects when using <i>mData</i></li>
59866                  *    </ul>
59867                  *  @param {bool} [redraw=true] redraw the table or not
59868                  *  @returns {array} An array of integers, representing the list of indexes in
59869                  *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to
59870                  *    the table.
59871                  *  @dtopt API
59872                  *  @deprecated Since v1.10
59873                  *
59874                  *  @example
59875                  *    // Global var for counter
59876                  *    var giCount = 2;
59877                  *
59878                  *    $(document).ready(function() {
59879                  *      $('#example').dataTable();
59880                  *    } );
59881                  *
59882                  *    function fnClickAddRow() {
59883                  *      $('#example').dataTable().fnAddData( [
59884                  *        giCount+".1",
59885                  *        giCount+".2",
59886                  *        giCount+".3",
59887                  *        giCount+".4" ]
59888                  *      );
59889                  *
59890                  *      giCount++;
59891                  *    }
59892                  */
59893                 this.fnAddData = function( data, redraw )
59894                 {
59895                         var api = this.api( true );
59897                         /* Check if we want to add multiple rows or not */
59898                         var rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ?
59899                                 api.rows.add( data ) :
59900                                 api.row.add( data );
59902                         if ( redraw === undefined || redraw ) {
59903                                 api.draw();
59904                         }
59906                         return rows.flatten().toArray();
59907                 };
59910                 /**
59911                  * This function will make DataTables recalculate the column sizes, based on the data
59912                  * contained in the table and the sizes applied to the columns (in the DOM, CSS or
59913                  * through the sWidth parameter). This can be useful when the width of the table's
59914                  * parent element changes (for example a window resize).
59915                  *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to
59916                  *  @dtopt API
59917                  *  @deprecated Since v1.10
59918                  *
59919                  *  @example
59920                  *    $(document).ready(function() {
59921                  *      var oTable = $('#example').dataTable( {
59922                  *        "sScrollY": "200px",
59923                  *        "bPaginate": false
59924                  *      } );
59925                  *
59926                  *      $(window).on('resize', function () {
59927                  *        oTable.fnAdjustColumnSizing();
59928                  *      } );
59929                  *    } );
59930                  */
59931                 this.fnAdjustColumnSizing = function ( bRedraw )
59932                 {
59933                         var api = this.api( true ).columns.adjust();
59934                         var settings = api.settings()[0];
59935                         var scroll = settings.oScroll;
59937                         if ( bRedraw === undefined || bRedraw ) {
59938                                 api.draw( false );
59939                         }
59940                         else if ( scroll.sX !== "" || scroll.sY !== "" ) {
59941                                 /* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
59942                                 _fnScrollDraw( settings );
59943                         }
59944                 };
59947                 /**
59948                  * Quickly and simply clear a table
59949                  *  @param {bool} [bRedraw=true] redraw the table or not
59950                  *  @dtopt API
59951                  *  @deprecated Since v1.10
59952                  *
59953                  *  @example
59954                  *    $(document).ready(function() {
59955                  *      var oTable = $('#example').dataTable();
59956                  *
59957                  *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
59958                  *      oTable.fnClearTable();
59959                  *    } );
59960                  */
59961                 this.fnClearTable = function( bRedraw )
59962                 {
59963                         var api = this.api( true ).clear();
59965                         if ( bRedraw === undefined || bRedraw ) {
59966                                 api.draw();
59967                         }
59968                 };
59971                 /**
59972                  * The exact opposite of 'opening' a row, this function will close any rows which
59973                  * are currently 'open'.
59974                  *  @param {node} nTr the table row to 'close'
59975                  *  @returns {int} 0 on success, or 1 if failed (can't find the row)
59976                  *  @dtopt API
59977                  *  @deprecated Since v1.10
59978                  *
59979                  *  @example
59980                  *    $(document).ready(function() {
59981                  *      var oTable;
59982                  *
59983                  *      // 'open' an information row when a row is clicked on
59984                  *      $('#example tbody tr').click( function () {
59985                  *        if ( oTable.fnIsOpen(this) ) {
59986                  *          oTable.fnClose( this );
59987                  *        } else {
59988                  *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
59989                  *        }
59990                  *      } );
59991                  *
59992                  *      oTable = $('#example').dataTable();
59993                  *    } );
59994                  */
59995                 this.fnClose = function( nTr )
59996                 {
59997                         this.api( true ).row( nTr ).child.hide();
59998                 };
60001                 /**
60002                  * Remove a row for the table
60003                  *  @param {mixed} target The index of the row from aoData to be deleted, or
60004                  *    the TR element you want to delete
60005                  *  @param {function|null} [callBack] Callback function
60006                  *  @param {bool} [redraw=true] Redraw the table or not
60007                  *  @returns {array} The row that was deleted
60008                  *  @dtopt API
60009                  *  @deprecated Since v1.10
60010                  *
60011                  *  @example
60012                  *    $(document).ready(function() {
60013                  *      var oTable = $('#example').dataTable();
60014                  *
60015                  *      // Immediately remove the first row
60016                  *      oTable.fnDeleteRow( 0 );
60017                  *    } );
60018                  */
60019                 this.fnDeleteRow = function( target, callback, redraw )
60020                 {
60021                         var api = this.api( true );
60022                         var rows = api.rows( target );
60023                         var settings = rows.settings()[0];
60024                         var data = settings.aoData[ rows[0][0] ];
60026                         rows.remove();
60028                         if ( callback ) {
60029                                 callback.call( this, settings, data );
60030                         }
60032                         if ( redraw === undefined || redraw ) {
60033                                 api.draw();
60034                         }
60036                         return data;
60037                 };
60040                 /**
60041                  * Restore the table to it's original state in the DOM by removing all of DataTables
60042                  * enhancements, alterations to the DOM structure of the table and event listeners.
60043                  *  @param {boolean} [remove=false] Completely remove the table from the DOM
60044                  *  @dtopt API
60045                  *  @deprecated Since v1.10
60046                  *
60047                  *  @example
60048                  *    $(document).ready(function() {
60049                  *      // This example is fairly pointless in reality, but shows how fnDestroy can be used
60050                  *      var oTable = $('#example').dataTable();
60051                  *      oTable.fnDestroy();
60052                  *    } );
60053                  */
60054                 this.fnDestroy = function ( remove )
60055                 {
60056                         this.api( true ).destroy( remove );
60057                 };
60060                 /**
60061                  * Redraw the table
60062                  *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.
60063                  *  @dtopt API
60064                  *  @deprecated Since v1.10
60065                  *
60066                  *  @example
60067                  *    $(document).ready(function() {
60068                  *      var oTable = $('#example').dataTable();
60069                  *
60070                  *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
60071                  *      oTable.fnDraw();
60072                  *    } );
60073                  */
60074                 this.fnDraw = function( complete )
60075                 {
60076                         // Note that this isn't an exact match to the old call to _fnDraw - it takes
60077                         // into account the new data, but can hold position.
60078                         this.api( true ).draw( complete );
60079                 };
60082                 /**
60083                  * Filter the input based on data
60084                  *  @param {string} sInput String to filter the table on
60085                  *  @param {int|null} [iColumn] Column to limit filtering to
60086                  *  @param {bool} [bRegex=false] Treat as regular expression or not
60087                  *  @param {bool} [bSmart=true] Perform smart filtering or not
60088                  *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)
60089                  *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)
60090                  *  @dtopt API
60091                  *  @deprecated Since v1.10
60092                  *
60093                  *  @example
60094                  *    $(document).ready(function() {
60095                  *      var oTable = $('#example').dataTable();
60096                  *
60097                  *      // Sometime later - filter...
60098                  *      oTable.fnFilter( 'test string' );
60099                  *    } );
60100                  */
60101                 this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )
60102                 {
60103                         var api = this.api( true );
60105                         if ( iColumn === null || iColumn === undefined ) {
60106                                 api.search( sInput, bRegex, bSmart, bCaseInsensitive );
60107                         }
60108                         else {
60109                                 api.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );
60110                         }
60112                         api.draw();
60113                 };
60116                 /**
60117                  * Get the data for the whole table, an individual row or an individual cell based on the
60118                  * provided parameters.
60119                  *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as
60120                  *    a TR node then the data source for the whole row will be returned. If given as a
60121                  *    TD/TH cell node then iCol will be automatically calculated and the data for the
60122                  *    cell returned. If given as an integer, then this is treated as the aoData internal
60123                  *    data index for the row (see fnGetPosition) and the data for that row used.
60124                  *  @param {int} [col] Optional column index that you want the data of.
60125                  *  @returns {array|object|string} If mRow is undefined, then the data for all rows is
60126                  *    returned. If mRow is defined, just data for that row, and is iCol is
60127                  *    defined, only data for the designated cell is returned.
60128                  *  @dtopt API
60129                  *  @deprecated Since v1.10
60130                  *
60131                  *  @example
60132                  *    // Row data
60133                  *    $(document).ready(function() {
60134                  *      oTable = $('#example').dataTable();
60135                  *
60136                  *      oTable.$('tr').click( function () {
60137                  *        var data = oTable.fnGetData( this );
60138                  *        // ... do something with the array / object of data for the row
60139                  *      } );
60140                  *    } );
60141                  *
60142                  *  @example
60143                  *    // Individual cell data
60144                  *    $(document).ready(function() {
60145                  *      oTable = $('#example').dataTable();
60146                  *
60147                  *      oTable.$('td').click( function () {
60148                  *        var sData = oTable.fnGetData( this );
60149                  *        alert( 'The cell clicked on had the value of '+sData );
60150                  *      } );
60151                  *    } );
60152                  */
60153                 this.fnGetData = function( src, col )
60154                 {
60155                         var api = this.api( true );
60157                         if ( src !== undefined ) {
60158                                 var type = src.nodeName ? src.nodeName.toLowerCase() : '';
60160                                 return col !== undefined || type == 'td' || type == 'th' ?
60161                                         api.cell( src, col ).data() :
60162                                         api.row( src ).data() || null;
60163                         }
60165                         return api.data().toArray();
60166                 };
60169                 /**
60170                  * Get an array of the TR nodes that are used in the table's body. Note that you will
60171                  * typically want to use the '$' API method in preference to this as it is more
60172                  * flexible.
60173                  *  @param {int} [iRow] Optional row index for the TR element you want
60174                  *  @returns {array|node} If iRow is undefined, returns an array of all TR elements
60175                  *    in the table's body, or iRow is defined, just the TR element requested.
60176                  *  @dtopt API
60177                  *  @deprecated Since v1.10
60178                  *
60179                  *  @example
60180                  *    $(document).ready(function() {
60181                  *      var oTable = $('#example').dataTable();
60182                  *
60183                  *      // Get the nodes from the table
60184                  *      var nNodes = oTable.fnGetNodes( );
60185                  *    } );
60186                  */
60187                 this.fnGetNodes = function( iRow )
60188                 {
60189                         var api = this.api( true );
60191                         return iRow !== undefined ?
60192                                 api.row( iRow ).node() :
60193                                 api.rows().nodes().flatten().toArray();
60194                 };
60197                 /**
60198                  * Get the array indexes of a particular cell from it's DOM element
60199                  * and column index including hidden columns
60200                  *  @param {node} node this can either be a TR, TD or TH in the table's body
60201                  *  @returns {int} If nNode is given as a TR, then a single index is returned, or
60202                  *    if given as a cell, an array of [row index, column index (visible),
60203                  *    column index (all)] is given.
60204                  *  @dtopt API
60205                  *  @deprecated Since v1.10
60206                  *
60207                  *  @example
60208                  *    $(document).ready(function() {
60209                  *      $('#example tbody td').click( function () {
60210                  *        // Get the position of the current data from the node
60211                  *        var aPos = oTable.fnGetPosition( this );
60212                  *
60213                  *        // Get the data array for this row
60214                  *        var aData = oTable.fnGetData( aPos[0] );
60215                  *
60216                  *        // Update the data array and return the value
60217                  *        aData[ aPos[1] ] = 'clicked';
60218                  *        this.innerHTML = 'clicked';
60219                  *      } );
60220                  *
60221                  *      // Init DataTables
60222                  *      oTable = $('#example').dataTable();
60223                  *    } );
60224                  */
60225                 this.fnGetPosition = function( node )
60226                 {
60227                         var api = this.api( true );
60228                         var nodeName = node.nodeName.toUpperCase();
60230                         if ( nodeName == 'TR' ) {
60231                                 return api.row( node ).index();
60232                         }
60233                         else if ( nodeName == 'TD' || nodeName == 'TH' ) {
60234                                 var cell = api.cell( node ).index();
60236                                 return [
60237                                         cell.row,
60238                                         cell.columnVisible,
60239                                         cell.column
60240                                 ];
60241                         }
60242                         return null;
60243                 };
60246                 /**
60247                  * Check to see if a row is 'open' or not.
60248                  *  @param {node} nTr the table row to check
60249                  *  @returns {boolean} true if the row is currently open, false otherwise
60250                  *  @dtopt API
60251                  *  @deprecated Since v1.10
60252                  *
60253                  *  @example
60254                  *    $(document).ready(function() {
60255                  *      var oTable;
60256                  *
60257                  *      // 'open' an information row when a row is clicked on
60258                  *      $('#example tbody tr').click( function () {
60259                  *        if ( oTable.fnIsOpen(this) ) {
60260                  *          oTable.fnClose( this );
60261                  *        } else {
60262                  *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
60263                  *        }
60264                  *      } );
60265                  *
60266                  *      oTable = $('#example').dataTable();
60267                  *    } );
60268                  */
60269                 this.fnIsOpen = function( nTr )
60270                 {
60271                         return this.api( true ).row( nTr ).child.isShown();
60272                 };
60275                 /**
60276                  * This function will place a new row directly after a row which is currently
60277                  * on display on the page, with the HTML contents that is passed into the
60278                  * function. This can be used, for example, to ask for confirmation that a
60279                  * particular record should be deleted.
60280                  *  @param {node} nTr The table row to 'open'
60281                  *  @param {string|node|jQuery} mHtml The HTML to put into the row
60282                  *  @param {string} sClass Class to give the new TD cell
60283                  *  @returns {node} The row opened. Note that if the table row passed in as the
60284                  *    first parameter, is not found in the table, this method will silently
60285                  *    return.
60286                  *  @dtopt API
60287                  *  @deprecated Since v1.10
60288                  *
60289                  *  @example
60290                  *    $(document).ready(function() {
60291                  *      var oTable;
60292                  *
60293                  *      // 'open' an information row when a row is clicked on
60294                  *      $('#example tbody tr').click( function () {
60295                  *        if ( oTable.fnIsOpen(this) ) {
60296                  *          oTable.fnClose( this );
60297                  *        } else {
60298                  *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
60299                  *        }
60300                  *      } );
60301                  *
60302                  *      oTable = $('#example').dataTable();
60303                  *    } );
60304                  */
60305                 this.fnOpen = function( nTr, mHtml, sClass )
60306                 {
60307                         return this.api( true )
60308                                 .row( nTr )
60309                                 .child( mHtml, sClass )
60310                                 .show()
60311                                 .child()[0];
60312                 };
60315                 /**
60316                  * Change the pagination - provides the internal logic for pagination in a simple API
60317                  * function. With this function you can have a DataTables table go to the next,
60318                  * previous, first or last pages.
60319                  *  @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
60320                  *    or page number to jump to (integer), note that page 0 is the first page.
60321                  *  @param {bool} [bRedraw=true] Redraw the table or not
60322                  *  @dtopt API
60323                  *  @deprecated Since v1.10
60324                  *
60325                  *  @example
60326                  *    $(document).ready(function() {
60327                  *      var oTable = $('#example').dataTable();
60328                  *      oTable.fnPageChange( 'next' );
60329                  *    } );
60330                  */
60331                 this.fnPageChange = function ( mAction, bRedraw )
60332                 {
60333                         var api = this.api( true ).page( mAction );
60335                         if ( bRedraw === undefined || bRedraw ) {
60336                                 api.draw(false);
60337                         }
60338                 };
60341                 /**
60342                  * Show a particular column
60343                  *  @param {int} iCol The column whose display should be changed
60344                  *  @param {bool} bShow Show (true) or hide (false) the column
60345                  *  @param {bool} [bRedraw=true] Redraw the table or not
60346                  *  @dtopt API
60347                  *  @deprecated Since v1.10
60348                  *
60349                  *  @example
60350                  *    $(document).ready(function() {
60351                  *      var oTable = $('#example').dataTable();
60352                  *
60353                  *      // Hide the second column after initialisation
60354                  *      oTable.fnSetColumnVis( 1, false );
60355                  *    } );
60356                  */
60357                 this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
60358                 {
60359                         var api = this.api( true ).column( iCol ).visible( bShow );
60361                         if ( bRedraw === undefined || bRedraw ) {
60362                                 api.columns.adjust().draw();
60363                         }
60364                 };
60367                 /**
60368                  * Get the settings for a particular table for external manipulation
60369                  *  @returns {object} DataTables settings object. See
60370                  *    {@link DataTable.models.oSettings}
60371                  *  @dtopt API
60372                  *  @deprecated Since v1.10
60373                  *
60374                  *  @example
60375                  *    $(document).ready(function() {
60376                  *      var oTable = $('#example').dataTable();
60377                  *      var oSettings = oTable.fnSettings();
60378                  *
60379                  *      // Show an example parameter from the settings
60380                  *      alert( oSettings._iDisplayStart );
60381                  *    } );
60382                  */
60383                 this.fnSettings = function()
60384                 {
60385                         return _fnSettingsFromNode( this[_ext.iApiIndex] );
60386                 };
60389                 /**
60390                  * Sort the table by a particular column
60391                  *  @param {int} iCol the data index to sort on. Note that this will not match the
60392                  *    'display index' if you have hidden data entries
60393                  *  @dtopt API
60394                  *  @deprecated Since v1.10
60395                  *
60396                  *  @example
60397                  *    $(document).ready(function() {
60398                  *      var oTable = $('#example').dataTable();
60399                  *
60400                  *      // Sort immediately with columns 0 and 1
60401                  *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
60402                  *    } );
60403                  */
60404                 this.fnSort = function( aaSort )
60405                 {
60406                         this.api( true ).order( aaSort ).draw();
60407                 };
60410                 /**
60411                  * Attach a sort listener to an element for a given column
60412                  *  @param {node} nNode the element to attach the sort listener to
60413                  *  @param {int} iColumn the column that a click on this node will sort on
60414                  *  @param {function} [fnCallback] callback function when sort is run
60415                  *  @dtopt API
60416                  *  @deprecated Since v1.10
60417                  *
60418                  *  @example
60419                  *    $(document).ready(function() {
60420                  *      var oTable = $('#example').dataTable();
60421                  *
60422                  *      // Sort on column 1, when 'sorter' is clicked on
60423                  *      oTable.fnSortListener( document.getElementById('sorter'), 1 );
60424                  *    } );
60425                  */
60426                 this.fnSortListener = function( nNode, iColumn, fnCallback )
60427                 {
60428                         this.api( true ).order.listener( nNode, iColumn, fnCallback );
60429                 };
60432                 /**
60433                  * Update a table cell or row - this method will accept either a single value to
60434                  * update the cell with, an array of values with one element for each column or
60435                  * an object in the same format as the original data source. The function is
60436                  * self-referencing in order to make the multi column updates easier.
60437                  *  @param {object|array|string} mData Data to update the cell/row with
60438                  *  @param {node|int} mRow TR element you want to update or the aoData index
60439                  *  @param {int} [iColumn] The column to update, give as null or undefined to
60440                  *    update a whole row.
60441                  *  @param {bool} [bRedraw=true] Redraw the table or not
60442                  *  @param {bool} [bAction=true] Perform pre-draw actions or not
60443                  *  @returns {int} 0 on success, 1 on error
60444                  *  @dtopt API
60445                  *  @deprecated Since v1.10
60446                  *
60447                  *  @example
60448                  *    $(document).ready(function() {
60449                  *      var oTable = $('#example').dataTable();
60450                  *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
60451                  *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row
60452                  *    } );
60453                  */
60454                 this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
60455                 {
60456                         var api = this.api( true );
60458                         if ( iColumn === undefined || iColumn === null ) {
60459                                 api.row( mRow ).data( mData );
60460                         }
60461                         else {
60462                                 api.cell( mRow, iColumn ).data( mData );
60463                         }
60465                         if ( bAction === undefined || bAction ) {
60466                                 api.columns.adjust();
60467                         }
60469                         if ( bRedraw === undefined || bRedraw ) {
60470                                 api.draw();
60471                         }
60472                         return 0;
60473                 };
60476                 /**
60477                  * Provide a common method for plug-ins to check the version of DataTables being used, in order
60478                  * to ensure compatibility.
60479                  *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
60480                  *    formats "X" and "X.Y" are also acceptable.
60481                  *  @returns {boolean} true if this version of DataTables is greater or equal to the required
60482                  *    version, or false if this version of DataTales is not suitable
60483                  *  @method
60484                  *  @dtopt API
60485                  *  @deprecated Since v1.10
60486                  *
60487                  *  @example
60488                  *    $(document).ready(function() {
60489                  *      var oTable = $('#example').dataTable();
60490                  *      alert( oTable.fnVersionCheck( '1.9.0' ) );
60491                  *    } );
60492                  */
60493                 this.fnVersionCheck = _ext.fnVersionCheck;
60496                 var _that = this;
60497                 var emptyInit = options === undefined;
60498                 var len = this.length;
60500                 if ( emptyInit ) {
60501                         options = {};
60502                 }
60504                 this.oApi = this.internal = _ext.internal;
60506                 // Extend with old style plug-in API methods
60507                 for ( var fn in DataTable.ext.internal ) {
60508                         if ( fn ) {
60509                                 this[fn] = _fnExternApiFunc(fn);
60510                         }
60511                 }
60513                 this.each(function() {
60514                         // For each initialisation we want to give it a clean initialisation
60515                         // object that can be bashed around
60516                         var o = {};
60517                         var oInit = len > 1 ? // optimisation for single table case
60518                                 _fnExtend( o, options, true ) :
60519                                 options;
60521                         /*global oInit,_that,emptyInit*/
60522                         var i=0, iLen, j, jLen, k, kLen;
60523                         var sId = this.getAttribute( 'id' );
60524                         var bInitHandedOff = false;
60525                         var defaults = DataTable.defaults;
60526                         var $this = $(this);
60529                         /* Sanity check */
60530                         if ( this.nodeName.toLowerCase() != 'table' )
60531                         {
60532                                 _fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );
60533                                 return;
60534                         }
60536                         /* Backwards compatibility for the defaults */
60537                         _fnCompatOpts( defaults );
60538                         _fnCompatCols( defaults.column );
60540                         /* Convert the camel-case defaults to Hungarian */
60541                         _fnCamelToHungarian( defaults, defaults, true );
60542                         _fnCamelToHungarian( defaults.column, defaults.column, true );
60544                         /* Setting up the initialisation object */
60545                         _fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ) );
60549                         /* Check to see if we are re-initialising a table */
60550                         var allSettings = DataTable.settings;
60551                         for ( i=0, iLen=allSettings.length ; i<iLen ; i++ )
60552                         {
60553                                 var s = allSettings[i];
60555                                 /* Base check on table node */
60556                                 if (
60557                                         s.nTable == this ||
60558                                         (s.nTHead && s.nTHead.parentNode == this) ||
60559                                         (s.nTFoot && s.nTFoot.parentNode == this)
60560                                 ) {
60561                                         var bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;
60562                                         var bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;
60564                                         if ( emptyInit || bRetrieve )
60565                                         {
60566                                                 return s.oInstance;
60567                                         }
60568                                         else if ( bDestroy )
60569                                         {
60570                                                 s.oInstance.fnDestroy();
60571                                                 break;
60572                                         }
60573                                         else
60574                                         {
60575                                                 _fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );
60576                                                 return;
60577                                         }
60578                                 }
60580                                 /* If the element we are initialising has the same ID as a table which was previously
60581                                  * initialised, but the table nodes don't match (from before) then we destroy the old
60582                                  * instance by simply deleting it. This is under the assumption that the table has been
60583                                  * destroyed by other methods. Anyone using non-id selectors will need to do this manually
60584                                  */
60585                                 if ( s.sTableId == this.id )
60586                                 {
60587                                         allSettings.splice( i, 1 );
60588                                         break;
60589                                 }
60590                         }
60592                         /* Ensure the table has an ID - required for accessibility */
60593                         if ( sId === null || sId === "" )
60594                         {
60595                                 sId = "DataTables_Table_"+(DataTable.ext._unique++);
60596                                 this.id = sId;
60597                         }
60599                         /* Create the settings object for this table and set some of the default parameters */
60600                         var oSettings = $.extend( true, {}, DataTable.models.oSettings, {
60601                                 "sDestroyWidth": $this[0].style.width,
60602                                 "sInstance":     sId,
60603                                 "sTableId":      sId
60604                         } );
60605                         oSettings.nTable = this;
60606                         oSettings.oApi   = _that.internal;
60607                         oSettings.oInit  = oInit;
60609                         allSettings.push( oSettings );
60611                         // Need to add the instance after the instance after the settings object has been added
60612                         // to the settings array, so we can self reference the table instance if more than one
60613                         oSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();
60615                         // Backwards compatibility, before we apply all the defaults
60616                         _fnCompatOpts( oInit );
60617                         _fnLanguageCompat( oInit.oLanguage );
60619                         // If the length menu is given, but the init display length is not, use the length menu
60620                         if ( oInit.aLengthMenu && ! oInit.iDisplayLength )
60621                         {
60622                                 oInit.iDisplayLength = $.isArray( oInit.aLengthMenu[0] ) ?
60623                                         oInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];
60624                         }
60626                         // Apply the defaults and init options to make a single init object will all
60627                         // options defined from defaults and instance options.
60628                         oInit = _fnExtend( $.extend( true, {}, defaults ), oInit );
60631                         // Map the initialisation options onto the settings object
60632                         _fnMap( oSettings.oFeatures, oInit, [
60633                                 "bPaginate",
60634                                 "bLengthChange",
60635                                 "bFilter",
60636                                 "bSort",
60637                                 "bSortMulti",
60638                                 "bInfo",
60639                                 "bProcessing",
60640                                 "bAutoWidth",
60641                                 "bSortClasses",
60642                                 "bServerSide",
60643                                 "bDeferRender"
60644                         ] );
60645                         _fnMap( oSettings, oInit, [
60646                                 "asStripeClasses",
60647                                 "ajax",
60648                                 "fnServerData",
60649                                 "fnFormatNumber",
60650                                 "sServerMethod",
60651                                 "aaSorting",
60652                                 "aaSortingFixed",
60653                                 "aLengthMenu",
60654                                 "sPaginationType",
60655                                 "sAjaxSource",
60656                                 "sAjaxDataProp",
60657                                 "iStateDuration",
60658                                 "sDom",
60659                                 "bSortCellsTop",
60660                                 "iTabIndex",
60661                                 "fnStateLoadCallback",
60662                                 "fnStateSaveCallback",
60663                                 "renderer",
60664                                 "searchDelay",
60665                                 "rowId",
60666                                 [ "iCookieDuration", "iStateDuration" ], // backwards compat
60667                                 [ "oSearch", "oPreviousSearch" ],
60668                                 [ "aoSearchCols", "aoPreSearchCols" ],
60669                                 [ "iDisplayLength", "_iDisplayLength" ]
60670                         ] );
60671                         _fnMap( oSettings.oScroll, oInit, [
60672                                 [ "sScrollX", "sX" ],
60673                                 [ "sScrollXInner", "sXInner" ],
60674                                 [ "sScrollY", "sY" ],
60675                                 [ "bScrollCollapse", "bCollapse" ]
60676                         ] );
60677                         _fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
60679                         /* Callback functions which are array driven */
60680                         _fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );
60681                         _fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );
60682                         _fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );
60683                         _fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );
60684                         _fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );
60685                         _fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );
60686                         _fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );
60687                         _fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );
60688                         _fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );
60689                         _fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );
60690                         _fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );
60692                         oSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );
60694                         /* Browser support detection */
60695                         _fnBrowserDetect( oSettings );
60697                         var oClasses = oSettings.oClasses;
60699                         $.extend( oClasses, DataTable.ext.classes, oInit.oClasses );
60700                         $this.addClass( oClasses.sTable );
60703                         if ( oSettings.iInitDisplayStart === undefined )
60704                         {
60705                                 /* Display start point, taking into account the save saving */
60706                                 oSettings.iInitDisplayStart = oInit.iDisplayStart;
60707                                 oSettings._iDisplayStart = oInit.iDisplayStart;
60708                         }
60710                         if ( oInit.iDeferLoading !== null )
60711                         {
60712                                 oSettings.bDeferLoading = true;
60713                                 var tmp = $.isArray( oInit.iDeferLoading );
60714                                 oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;
60715                                 oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;
60716                         }
60718                         /* Language definitions */
60719                         var oLanguage = oSettings.oLanguage;
60720                         $.extend( true, oLanguage, oInit.oLanguage );
60722                         if ( oLanguage.sUrl )
60723                         {
60724                                 /* Get the language definitions from a file - because this Ajax call makes the language
60725                                  * get async to the remainder of this function we use bInitHandedOff to indicate that
60726                                  * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor
60727                                  */
60728                                 $.ajax( {
60729                                         dataType: 'json',
60730                                         url: oLanguage.sUrl,
60731                                         success: function ( json ) {
60732                                                 _fnLanguageCompat( json );
60733                                                 _fnCamelToHungarian( defaults.oLanguage, json );
60734                                                 $.extend( true, oLanguage, json );
60735                                                 _fnInitialise( oSettings );
60736                                         },
60737                                         error: function () {
60738                                                 // Error occurred loading language file, continue on as best we can
60739                                                 _fnInitialise( oSettings );
60740                                         }
60741                                 } );
60742                                 bInitHandedOff = true;
60743                         }
60745                         /*
60746                          * Stripes
60747                          */
60748                         if ( oInit.asStripeClasses === null )
60749                         {
60750                                 oSettings.asStripeClasses =[
60751                                         oClasses.sStripeOdd,
60752                                         oClasses.sStripeEven
60753                                 ];
60754                         }
60756                         /* Remove row stripe classes if they are already on the table row */
60757                         var stripeClasses = oSettings.asStripeClasses;
60758                         var rowOne = $this.children('tbody').find('tr').eq(0);
60759                         if ( $.inArray( true, $.map( stripeClasses, function(el, i) {
60760                                 return rowOne.hasClass(el);
60761                         } ) ) !== -1 ) {
60762                                 $('tbody tr', this).removeClass( stripeClasses.join(' ') );
60763                                 oSettings.asDestroyStripes = stripeClasses.slice();
60764                         }
60766                         /*
60767                          * Columns
60768                          * See if we should load columns automatically or use defined ones
60769                          */
60770                         var anThs = [];
60771                         var aoColumnsInit;
60772                         var nThead = this.getElementsByTagName('thead');
60773                         if ( nThead.length !== 0 )
60774                         {
60775                                 _fnDetectHeader( oSettings.aoHeader, nThead[0] );
60776                                 anThs = _fnGetUniqueThs( oSettings );
60777                         }
60779                         /* If not given a column array, generate one with nulls */
60780                         if ( oInit.aoColumns === null )
60781                         {
60782                                 aoColumnsInit = [];
60783                                 for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
60784                                 {
60785                                         aoColumnsInit.push( null );
60786                                 }
60787                         }
60788                         else
60789                         {
60790                                 aoColumnsInit = oInit.aoColumns;
60791                         }
60793                         /* Add the columns */
60794                         for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
60795                         {
60796                                 _fnAddColumn( oSettings, anThs ? anThs[i] : null );
60797                         }
60799                         /* Apply the column definitions */
60800                         _fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {
60801                                 _fnColumnOptions( oSettings, iCol, oDef );
60802                         } );
60804                         /* HTML5 attribute detection - build an mData object automatically if the
60805                          * attributes are found
60806                          */
60807                         if ( rowOne.length ) {
60808                                 var a = function ( cell, name ) {
60809                                         return cell.getAttribute( 'data-'+name ) !== null ? name : null;
60810                                 };
60812                                 $( rowOne[0] ).children('th, td').each( function (i, cell) {
60813                                         var col = oSettings.aoColumns[i];
60815                                         if ( col.mData === i ) {
60816                                                 var sort = a( cell, 'sort' ) || a( cell, 'order' );
60817                                                 var filter = a( cell, 'filter' ) || a( cell, 'search' );
60819                                                 if ( sort !== null || filter !== null ) {
60820                                                         col.mData = {
60821                                                                 _:      i+'.display',
60822                                                                 sort:   sort !== null   ? i+'.@data-'+sort   : undefined,
60823                                                                 type:   sort !== null   ? i+'.@data-'+sort   : undefined,
60824                                                                 filter: filter !== null ? i+'.@data-'+filter : undefined
60825                                                         };
60827                                                         _fnColumnOptions( oSettings, i );
60828                                                 }
60829                                         }
60830                                 } );
60831                         }
60833                         var features = oSettings.oFeatures;
60834                         var loadedInit = function () {
60835                                 /*
60836                                  * Sorting
60837                                  * @todo For modularisation (1.11) this needs to do into a sort start up handler
60838                                  */
60840                                 // If aaSorting is not defined, then we use the first indicator in asSorting
60841                                 // in case that has been altered, so the default sort reflects that option
60842                                 if ( oInit.aaSorting === undefined ) {
60843                                         var sorting = oSettings.aaSorting;
60844                                         for ( i=0, iLen=sorting.length ; i<iLen ; i++ ) {
60845                                                 sorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];
60846                                         }
60847                                 }
60849                                 /* Do a first pass on the sorting classes (allows any size changes to be taken into
60850                                  * account, and also will apply sorting disabled classes if disabled
60851                                  */
60852                                 _fnSortingClasses( oSettings );
60854                                 if ( features.bSort ) {
60855                                         _fnCallbackReg( oSettings, 'aoDrawCallback', function () {
60856                                                 if ( oSettings.bSorted ) {
60857                                                         var aSort = _fnSortFlatten( oSettings );
60858                                                         var sortedColumns = {};
60860                                                         $.each( aSort, function (i, val) {
60861                                                                 sortedColumns[ val.src ] = val.dir;
60862                                                         } );
60864                                                         _fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );
60865                                                         _fnSortAria( oSettings );
60866                                                 }
60867                                         } );
60868                                 }
60870                                 _fnCallbackReg( oSettings, 'aoDrawCallback', function () {
60871                                         if ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {
60872                                                 _fnSortingClasses( oSettings );
60873                                         }
60874                                 }, 'sc' );
60877                                 /*
60878                                  * Final init
60879                                  * Cache the header, body and footer as required, creating them if needed
60880                                  */
60882                                 // Work around for Webkit bug 83867 - store the caption-side before removing from doc
60883                                 var captions = $this.children('caption').each( function () {
60884                                         this._captionSide = $(this).css('caption-side');
60885                                 } );
60887                                 var thead = $this.children('thead');
60888                                 if ( thead.length === 0 ) {
60889                                         thead = $('<thead/>').appendTo($this);
60890                                 }
60891                                 oSettings.nTHead = thead[0];
60893                                 var tbody = $this.children('tbody');
60894                                 if ( tbody.length === 0 ) {
60895                                         tbody = $('<tbody/>').appendTo($this);
60896                                 }
60897                                 oSettings.nTBody = tbody[0];
60899                                 var tfoot = $this.children('tfoot');
60900                                 if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) {
60901                                         // If we are a scrolling table, and no footer has been given, then we need to create
60902                                         // a tfoot element for the caption element to be appended to
60903                                         tfoot = $('<tfoot/>').appendTo($this);
60904                                 }
60906                                 if ( tfoot.length === 0 || tfoot.children().length === 0 ) {
60907                                         $this.addClass( oClasses.sNoFooter );
60908                                 }
60909                                 else if ( tfoot.length > 0 ) {
60910                                         oSettings.nTFoot = tfoot[0];
60911                                         _fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );
60912                                 }
60914                                 /* Check if there is data passing into the constructor */
60915                                 if ( oInit.aaData ) {
60916                                         for ( i=0 ; i<oInit.aaData.length ; i++ ) {
60917                                                 _fnAddData( oSettings, oInit.aaData[ i ] );
60918                                         }
60919                                 }
60920                                 else if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' ) {
60921                                         /* Grab the data from the page - only do this when deferred loading or no Ajax
60922                                          * source since there is no point in reading the DOM data if we are then going
60923                                          * to replace it with Ajax data
60924                                          */
60925                                         _fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );
60926                                 }
60928                                 /* Copy the data index array */
60929                                 oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
60931                                 /* Initialisation complete - table can be drawn */
60932                                 oSettings.bInitialised = true;
60934                                 /* Check if we need to initialise the table (it might not have been handed off to the
60935                                  * language processor)
60936                                  */
60937                                 if ( bInitHandedOff === false ) {
60938                                         _fnInitialise( oSettings );
60939                                 }
60940                         };
60942                         /* Must be done after everything which can be overridden by the state saving! */
60943                         if ( oInit.bStateSave )
60944                         {
60945                                 features.bStateSave = true;
60946                                 _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );
60947                                 _fnLoadState( oSettings, oInit, loadedInit );
60948                         }
60949                         else {
60950                                 loadedInit();
60951                         }
60953                 } );
60954                 _that = null;
60955                 return this;
60956         };
60959         /*
60960          * It is useful to have variables which are scoped locally so only the
60961          * DataTables functions can access them and they don't leak into global space.
60962          * At the same time these functions are often useful over multiple files in the
60963          * core and API, so we list, or at least document, all variables which are used
60964          * by DataTables as private variables here. This also ensures that there is no
60965          * clashing of variable names and that they can easily referenced for reuse.
60966          */
60969         // Defined else where
60970         //  _selector_run
60971         //  _selector_opts
60972         //  _selector_first
60973         //  _selector_row_indexes
60975         var _ext; // DataTable.ext
60976         var _Api; // DataTable.Api
60977         var _api_register; // DataTable.Api.register
60978         var _api_registerPlural; // DataTable.Api.registerPlural
60980         var _re_dic = {};
60981         var _re_new_lines = /[\r\n]/g;
60982         var _re_html = /<.*?>/g;
60984         // This is not strict ISO8601 - Date.parse() is quite lax, although
60985         // implementations differ between browsers.
60986         var _re_date = /^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/;
60988         // Escape regular expression special characters
60989         var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ].join('|\\') + ')', 'g' );
60991         // http://en.wikipedia.org/wiki/Foreign_exchange_market
60992         // - \u20BD - Russian ruble.
60993         // - \u20a9 - South Korean Won
60994         // - \u20BA - Turkish Lira
60995         // - \u20B9 - Indian Rupee
60996         // - R - Brazil (R$) and South Africa
60997         // - fr - Swiss Franc
60998         // - kr - Swedish krona, Norwegian krone and Danish krone
60999         // - \u2009 is thin space and \u202F is narrow no-break space, both used in many
61000         // - Ƀ - Bitcoin
61001         // - Ξ - Ethereum
61002         //   standards as thousands separators.
61003         var _re_formatted_numeric = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi;
61006         var _empty = function ( d ) {
61007                 return !d || d === true || d === '-' ? true : false;
61008         };
61011         var _intVal = function ( s ) {
61012                 var integer = parseInt( s, 10 );
61013                 return !isNaN(integer) && isFinite(s) ? integer : null;
61014         };
61016         // Convert from a formatted number with characters other than `.` as the
61017         // decimal place, to a Javascript number
61018         var _numToDecimal = function ( num, decimalPoint ) {
61019                 // Cache created regular expressions for speed as this function is called often
61020                 if ( ! _re_dic[ decimalPoint ] ) {
61021                         _re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );
61022                 }
61023                 return typeof num === 'string' && decimalPoint !== '.' ?
61024                         num.replace( /\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :
61025                         num;
61026         };
61029         var _isNumber = function ( d, decimalPoint, formatted ) {
61030                 var strType = typeof d === 'string';
61032                 // If empty return immediately so there must be a number if it is a
61033                 // formatted string (this stops the string "k", or "kr", etc being detected
61034                 // as a formatted number for currency
61035                 if ( _empty( d ) ) {
61036                         return true;
61037                 }
61039                 if ( decimalPoint && strType ) {
61040                         d = _numToDecimal( d, decimalPoint );
61041                 }
61043                 if ( formatted && strType ) {
61044                         d = d.replace( _re_formatted_numeric, '' );
61045                 }
61047                 return !isNaN( parseFloat(d) ) && isFinite( d );
61048         };
61051         // A string without HTML in it can be considered to be HTML still
61052         var _isHtml = function ( d ) {
61053                 return _empty( d ) || typeof d === 'string';
61054         };
61057         var _htmlNumeric = function ( d, decimalPoint, formatted ) {
61058                 if ( _empty( d ) ) {
61059                         return true;
61060                 }
61062                 var html = _isHtml( d );
61063                 return ! html ?
61064                         null :
61065                         _isNumber( _stripHtml( d ), decimalPoint, formatted ) ?
61066                                 true :
61067                                 null;
61068         };
61071         var _pluck = function ( a, prop, prop2 ) {
61072                 var out = [];
61073                 var i=0, ien=a.length;
61075                 // Could have the test in the loop for slightly smaller code, but speed
61076                 // is essential here
61077                 if ( prop2 !== undefined ) {
61078                         for ( ; i<ien ; i++ ) {
61079                                 if ( a[i] && a[i][ prop ] ) {
61080                                         out.push( a[i][ prop ][ prop2 ] );
61081                                 }
61082                         }
61083                 }
61084                 else {
61085                         for ( ; i<ien ; i++ ) {
61086                                 if ( a[i] ) {
61087                                         out.push( a[i][ prop ] );
61088                                 }
61089                         }
61090                 }
61092                 return out;
61093         };
61096         // Basically the same as _pluck, but rather than looping over `a` we use `order`
61097         // as the indexes to pick from `a`
61098         var _pluck_order = function ( a, order, prop, prop2 )
61099         {
61100                 var out = [];
61101                 var i=0, ien=order.length;
61103                 // Could have the test in the loop for slightly smaller code, but speed
61104                 // is essential here
61105                 if ( prop2 !== undefined ) {
61106                         for ( ; i<ien ; i++ ) {
61107                                 if ( a[ order[i] ][ prop ] ) {
61108                                         out.push( a[ order[i] ][ prop ][ prop2 ] );
61109                                 }
61110                         }
61111                 }
61112                 else {
61113                         for ( ; i<ien ; i++ ) {
61114                                 out.push( a[ order[i] ][ prop ] );
61115                         }
61116                 }
61118                 return out;
61119         };
61122         var _range = function ( len, start )
61123         {
61124                 var out = [];
61125                 var end;
61127                 if ( start === undefined ) {
61128                         start = 0;
61129                         end = len;
61130                 }
61131                 else {
61132                         end = start;
61133                         start = len;
61134                 }
61136                 for ( var i=start ; i<end ; i++ ) {
61137                         out.push( i );
61138                 }
61140                 return out;
61141         };
61144         var _removeEmpty = function ( a )
61145         {
61146                 var out = [];
61148                 for ( var i=0, ien=a.length ; i<ien ; i++ ) {
61149                         if ( a[i] ) { // careful - will remove all falsy values!
61150                                 out.push( a[i] );
61151                         }
61152                 }
61154                 return out;
61155         };
61158         var _stripHtml = function ( d ) {
61159                 return d.replace( _re_html, '' );
61160         };
61163         /**
61164          * Determine if all values in the array are unique. This means we can short
61165          * cut the _unique method at the cost of a single loop. A sorted array is used
61166          * to easily check the values.
61167          *
61168          * @param  {array} src Source array
61169          * @return {boolean} true if all unique, false otherwise
61170          * @ignore
61171          */
61172         var _areAllUnique = function ( src ) {
61173                 if ( src.length < 2 ) {
61174                         return true;
61175                 }
61177                 var sorted = src.slice().sort();
61178                 var last = sorted[0];
61180                 for ( var i=1, ien=sorted.length ; i<ien ; i++ ) {
61181                         if ( sorted[i] === last ) {
61182                                 return false;
61183                         }
61185                         last = sorted[i];
61186                 }
61188                 return true;
61189         };
61192         /**
61193          * Find the unique elements in a source array.
61194          *
61195          * @param  {array} src Source array
61196          * @return {array} Array of unique items
61197          * @ignore
61198          */
61199         var _unique = function ( src )
61200         {
61201                 if ( _areAllUnique( src ) ) {
61202                         return src.slice();
61203                 }
61205                 // A faster unique method is to use object keys to identify used values,
61206                 // but this doesn't work with arrays or objects, which we must also
61207                 // consider. See jsperf.com/compare-array-unique-versions/4 for more
61208                 // information.
61209                 var
61210                         out = [],
61211                         val,
61212                         i, ien=src.length,
61213                         j, k=0;
61215                 again: for ( i=0 ; i<ien ; i++ ) {
61216                         val = src[i];
61218                         for ( j=0 ; j<k ; j++ ) {
61219                                 if ( out[j] === val ) {
61220                                         continue again;
61221                                 }
61222                         }
61224                         out.push( val );
61225                         k++;
61226                 }
61228                 return out;
61229         };
61232         /**
61233          * DataTables utility methods
61234          *
61235          * This namespace provides helper methods that DataTables uses internally to
61236          * create a DataTable, but which are not exclusively used only for DataTables.
61237          * These methods can be used by extension authors to save the duplication of
61238          * code.
61239          *
61240          *  @namespace
61241          */
61242         DataTable.util = {
61243                 /**
61244                  * Throttle the calls to a function. Arguments and context are maintained
61245                  * for the throttled function.
61246                  *
61247                  * @param {function} fn Function to be called
61248                  * @param {integer} freq Call frequency in mS
61249                  * @return {function} Wrapped function
61250                  */
61251                 throttle: function ( fn, freq ) {
61252                         var
61253                                 frequency = freq !== undefined ? freq : 200,
61254                                 last,
61255                                 timer;
61257                         return function () {
61258                                 var
61259                                         that = this,
61260                                         now  = +new Date(),
61261                                         args = arguments;
61263                                 if ( last && now < last + frequency ) {
61264                                         clearTimeout( timer );
61266                                         timer = setTimeout( function () {
61267                                                 last = undefined;
61268                                                 fn.apply( that, args );
61269                                         }, frequency );
61270                                 }
61271                                 else {
61272                                         last = now;
61273                                         fn.apply( that, args );
61274                                 }
61275                         };
61276                 },
61279                 /**
61280                  * Escape a string such that it can be used in a regular expression
61281                  *
61282                  *  @param {string} val string to escape
61283                  *  @returns {string} escaped string
61284                  */
61285                 escapeRegex: function ( val ) {
61286                         return val.replace( _re_escape_regex, '\\$1' );
61287                 }
61288         };
61292         /**
61293          * Create a mapping object that allows camel case parameters to be looked up
61294          * for their Hungarian counterparts. The mapping is stored in a private
61295          * parameter called `_hungarianMap` which can be accessed on the source object.
61296          *  @param {object} o
61297          *  @memberof DataTable#oApi
61298          */
61299         function _fnHungarianMap ( o )
61300         {
61301                 var
61302                         hungarian = 'a aa ai ao as b fn i m o s ',
61303                         match,
61304                         newKey,
61305                         map = {};
61307                 $.each( o, function (key, val) {
61308                         match = key.match(/^([^A-Z]+?)([A-Z])/);
61310                         if ( match && hungarian.indexOf(match[1]+' ') !== -1 )
61311                         {
61312                                 newKey = key.replace( match[0], match[2].toLowerCase() );
61313                                 map[ newKey ] = key;
61315                                 if ( match[1] === 'o' )
61316                                 {
61317                                         _fnHungarianMap( o[key] );
61318                                 }
61319                         }
61320                 } );
61322                 o._hungarianMap = map;
61323         }
61326         /**
61327          * Convert from camel case parameters to Hungarian, based on a Hungarian map
61328          * created by _fnHungarianMap.
61329          *  @param {object} src The model object which holds all parameters that can be
61330          *    mapped.
61331          *  @param {object} user The object to convert from camel case to Hungarian.
61332          *  @param {boolean} force When set to `true`, properties which already have a
61333          *    Hungarian value in the `user` object will be overwritten. Otherwise they
61334          *    won't be.
61335          *  @memberof DataTable#oApi
61336          */
61337         function _fnCamelToHungarian ( src, user, force )
61338         {
61339                 if ( ! src._hungarianMap ) {
61340                         _fnHungarianMap( src );
61341                 }
61343                 var hungarianKey;
61345                 $.each( user, function (key, val) {
61346                         hungarianKey = src._hungarianMap[ key ];
61348                         if ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )
61349                         {
61350                                 // For objects, we need to buzz down into the object to copy parameters
61351                                 if ( hungarianKey.charAt(0) === 'o' )
61352                                 {
61353                                         // Copy the camelCase options over to the hungarian
61354                                         if ( ! user[ hungarianKey ] ) {
61355                                                 user[ hungarianKey ] = {};
61356                                         }
61357                                         $.extend( true, user[hungarianKey], user[key] );
61359                                         _fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );
61360                                 }
61361                                 else {
61362                                         user[hungarianKey] = user[ key ];
61363                                 }
61364                         }
61365                 } );
61366         }
61369         /**
61370          * Language compatibility - when certain options are given, and others aren't, we
61371          * need to duplicate the values over, in order to provide backwards compatibility
61372          * with older language files.
61373          *  @param {object} oSettings dataTables settings object
61374          *  @memberof DataTable#oApi
61375          */
61376         function _fnLanguageCompat( lang )
61377         {
61378                 // Note the use of the Hungarian notation for the parameters in this method as
61379                 // this is called after the mapping of camelCase to Hungarian
61380                 var defaults = DataTable.defaults.oLanguage;
61382                 // Default mapping
61383                 var defaultDecimal = defaults.sDecimal;
61384                 if ( defaultDecimal ) {
61385                         _addNumericSort( defaultDecimal );
61386                 }
61388                 if ( lang ) {
61389                         var zeroRecords = lang.sZeroRecords;
61391                         // Backwards compatibility - if there is no sEmptyTable given, then use the same as
61392                         // sZeroRecords - assuming that is given.
61393                         if ( ! lang.sEmptyTable && zeroRecords &&
61394                                 defaults.sEmptyTable === "No data available in table" )
61395                         {
61396                                 _fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );
61397                         }
61399                         // Likewise with loading records
61400                         if ( ! lang.sLoadingRecords && zeroRecords &&
61401                                 defaults.sLoadingRecords === "Loading..." )
61402                         {
61403                                 _fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );
61404                         }
61406                         // Old parameter name of the thousands separator mapped onto the new
61407                         if ( lang.sInfoThousands ) {
61408                                 lang.sThousands = lang.sInfoThousands;
61409                         }
61411                         var decimal = lang.sDecimal;
61412                         if ( decimal && defaultDecimal !== decimal ) {
61413                                 _addNumericSort( decimal );
61414                         }
61415                 }
61416         }
61419         /**
61420          * Map one parameter onto another
61421          *  @param {object} o Object to map
61422          *  @param {*} knew The new parameter name
61423          *  @param {*} old The old parameter name
61424          */
61425         var _fnCompatMap = function ( o, knew, old ) {
61426                 if ( o[ knew ] !== undefined ) {
61427                         o[ old ] = o[ knew ];
61428                 }
61429         };
61432         /**
61433          * Provide backwards compatibility for the main DT options. Note that the new
61434          * options are mapped onto the old parameters, so this is an external interface
61435          * change only.
61436          *  @param {object} init Object to map
61437          */
61438         function _fnCompatOpts ( init )
61439         {
61440                 _fnCompatMap( init, 'ordering',      'bSort' );
61441                 _fnCompatMap( init, 'orderMulti',    'bSortMulti' );
61442                 _fnCompatMap( init, 'orderClasses',  'bSortClasses' );
61443                 _fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );
61444                 _fnCompatMap( init, 'order',         'aaSorting' );
61445                 _fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );
61446                 _fnCompatMap( init, 'paging',        'bPaginate' );
61447                 _fnCompatMap( init, 'pagingType',    'sPaginationType' );
61448                 _fnCompatMap( init, 'pageLength',    'iDisplayLength' );
61449                 _fnCompatMap( init, 'searching',     'bFilter' );
61451                 // Boolean initialisation of x-scrolling
61452                 if ( typeof init.sScrollX === 'boolean' ) {
61453                         init.sScrollX = init.sScrollX ? '100%' : '';
61454                 }
61455                 if ( typeof init.scrollX === 'boolean' ) {
61456                         init.scrollX = init.scrollX ? '100%' : '';
61457                 }
61459                 // Column search objects are in an array, so it needs to be converted
61460                 // element by element
61461                 var searchCols = init.aoSearchCols;
61463                 if ( searchCols ) {
61464                         for ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {
61465                                 if ( searchCols[i] ) {
61466                                         _fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );
61467                                 }
61468                         }
61469                 }
61470         }
61473         /**
61474          * Provide backwards compatibility for column options. Note that the new options
61475          * are mapped onto the old parameters, so this is an external interface change
61476          * only.
61477          *  @param {object} init Object to map
61478          */
61479         function _fnCompatCols ( init )
61480         {
61481                 _fnCompatMap( init, 'orderable',     'bSortable' );
61482                 _fnCompatMap( init, 'orderData',     'aDataSort' );
61483                 _fnCompatMap( init, 'orderSequence', 'asSorting' );
61484                 _fnCompatMap( init, 'orderDataType', 'sortDataType' );
61486                 // orderData can be given as an integer
61487                 var dataSort = init.aDataSort;
61488                 if ( typeof dataSort === 'number' && ! $.isArray( dataSort ) ) {
61489                         init.aDataSort = [ dataSort ];
61490                 }
61491         }
61494         /**
61495          * Browser feature detection for capabilities, quirks
61496          *  @param {object} settings dataTables settings object
61497          *  @memberof DataTable#oApi
61498          */
61499         function _fnBrowserDetect( settings )
61500         {
61501                 // We don't need to do this every time DataTables is constructed, the values
61502                 // calculated are specific to the browser and OS configuration which we
61503                 // don't expect to change between initialisations
61504                 if ( ! DataTable.__browser ) {
61505                         var browser = {};
61506                         DataTable.__browser = browser;
61508                         // Scrolling feature / quirks detection
61509                         var n = $('<div/>')
61510                                 .css( {
61511                                         position: 'fixed',
61512                                         top: 0,
61513                                         left: $(window).scrollLeft()*-1, // allow for scrolling
61514                                         height: 1,
61515                                         width: 1,
61516                                         overflow: 'hidden'
61517                                 } )
61518                                 .append(
61519                                         $('<div/>')
61520                                                 .css( {
61521                                                         position: 'absolute',
61522                                                         top: 1,
61523                                                         left: 1,
61524                                                         width: 100,
61525                                                         overflow: 'scroll'
61526                                                 } )
61527                                                 .append(
61528                                                         $('<div/>')
61529                                                                 .css( {
61530                                                                         width: '100%',
61531                                                                         height: 10
61532                                                                 } )
61533                                                 )
61534                                 )
61535                                 .appendTo( 'body' );
61537                         var outer = n.children();
61538                         var inner = outer.children();
61540                         // Numbers below, in order, are:
61541                         // inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth
61542                         //
61543                         // IE6 XP:                           100 100 100  83
61544                         // IE7 Vista:                        100 100 100  83
61545                         // IE 8+ Windows:                     83  83 100  83
61546                         // Evergreen Windows:                 83  83 100  83
61547                         // Evergreen Mac with scrollbars:     85  85 100  85
61548                         // Evergreen Mac without scrollbars: 100 100 100 100
61550                         // Get scrollbar width
61551                         browser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;
61553                         // IE6/7 will oversize a width 100% element inside a scrolling element, to
61554                         // include the width of the scrollbar, while other browsers ensure the inner
61555                         // element is contained without forcing scrolling
61556                         browser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;
61558                         // In rtl text layout, some browsers (most, but not all) will place the
61559                         // scrollbar on the left, rather than the right.
61560                         browser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;
61562                         // IE8- don't provide height and width for getBoundingClientRect
61563                         browser.bBounding = n[0].getBoundingClientRect().width ? true : false;
61565                         n.remove();
61566                 }
61568                 $.extend( settings.oBrowser, DataTable.__browser );
61569                 settings.oScroll.iBarWidth = DataTable.__browser.barWidth;
61570         }
61573         /**
61574          * Array.prototype reduce[Right] method, used for browsers which don't support
61575          * JS 1.6. Done this way to reduce code size, since we iterate either way
61576          *  @param {object} settings dataTables settings object
61577          *  @memberof DataTable#oApi
61578          */
61579         function _fnReduce ( that, fn, init, start, end, inc )
61580         {
61581                 var
61582                         i = start,
61583                         value,
61584                         isSet = false;
61586                 if ( init !== undefined ) {
61587                         value = init;
61588                         isSet = true;
61589                 }
61591                 while ( i !== end ) {
61592                         if ( ! that.hasOwnProperty(i) ) {
61593                                 continue;
61594                         }
61596                         value = isSet ?
61597                                 fn( value, that[i], i, that ) :
61598                                 that[i];
61600                         isSet = true;
61601                         i += inc;
61602                 }
61604                 return value;
61605         }
61607         /**
61608          * Add a column to the list used for the table with default values
61609          *  @param {object} oSettings dataTables settings object
61610          *  @param {node} nTh The th element for this column
61611          *  @memberof DataTable#oApi
61612          */
61613         function _fnAddColumn( oSettings, nTh )
61614         {
61615                 // Add column to aoColumns array
61616                 var oDefaults = DataTable.defaults.column;
61617                 var iCol = oSettings.aoColumns.length;
61618                 var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
61619                         "nTh": nTh ? nTh : document.createElement('th'),
61620                         "sTitle":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',
61621                         "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
61622                         "mData": oDefaults.mData ? oDefaults.mData : iCol,
61623                         idx: iCol
61624                 } );
61625                 oSettings.aoColumns.push( oCol );
61627                 // Add search object for column specific search. Note that the `searchCols[ iCol ]`
61628                 // passed into extend can be undefined. This allows the user to give a default
61629                 // with only some of the parameters defined, and also not give a default
61630                 var searchCols = oSettings.aoPreSearchCols;
61631                 searchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );
61633                 // Use the default column options function to initialise classes etc
61634                 _fnColumnOptions( oSettings, iCol, $(nTh).data() );
61635         }
61638         /**
61639          * Apply options for a column
61640          *  @param {object} oSettings dataTables settings object
61641          *  @param {int} iCol column index to consider
61642          *  @param {object} oOptions object with sType, bVisible and bSearchable etc
61643          *  @memberof DataTable#oApi
61644          */
61645         function _fnColumnOptions( oSettings, iCol, oOptions )
61646         {
61647                 var oCol = oSettings.aoColumns[ iCol ];
61648                 var oClasses = oSettings.oClasses;
61649                 var th = $(oCol.nTh);
61651                 // Try to get width information from the DOM. We can't get it from CSS
61652                 // as we'd need to parse the CSS stylesheet. `width` option can override
61653                 if ( ! oCol.sWidthOrig ) {
61654                         // Width attribute
61655                         oCol.sWidthOrig = th.attr('width') || null;
61657                         // Style attribute
61658                         var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/);
61659                         if ( t ) {
61660                                 oCol.sWidthOrig = t[1];
61661                         }
61662                 }
61664                 /* User specified column options */
61665                 if ( oOptions !== undefined && oOptions !== null )
61666                 {
61667                         // Backwards compatibility
61668                         _fnCompatCols( oOptions );
61670                         // Map camel case parameters to their Hungarian counterparts
61671                         _fnCamelToHungarian( DataTable.defaults.column, oOptions );
61673                         /* Backwards compatibility for mDataProp */
61674                         if ( oOptions.mDataProp !== undefined && !oOptions.mData )
61675                         {
61676                                 oOptions.mData = oOptions.mDataProp;
61677                         }
61679                         if ( oOptions.sType )
61680                         {
61681                                 oCol._sManualType = oOptions.sType;
61682                         }
61684                         // `class` is a reserved word in Javascript, so we need to provide
61685                         // the ability to use a valid name for the camel case input
61686                         if ( oOptions.className && ! oOptions.sClass )
61687                         {
61688                                 oOptions.sClass = oOptions.className;
61689                         }
61690                         if ( oOptions.sClass ) {
61691                                 th.addClass( oOptions.sClass );
61692                         }
61694                         $.extend( oCol, oOptions );
61695                         _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
61697                         /* iDataSort to be applied (backwards compatibility), but aDataSort will take
61698                          * priority if defined
61699                          */
61700                         if ( oOptions.iDataSort !== undefined )
61701                         {
61702                                 oCol.aDataSort = [ oOptions.iDataSort ];
61703                         }
61704                         _fnMap( oCol, oOptions, "aDataSort" );
61705                 }
61707                 /* Cache the data get and set functions for speed */
61708                 var mDataSrc = oCol.mData;
61709                 var mData = _fnGetObjectDataFn( mDataSrc );
61710                 var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
61712                 var attrTest = function( src ) {
61713                         return typeof src === 'string' && src.indexOf('@') !== -1;
61714                 };
61715                 oCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (
61716                         attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)
61717                 );
61718                 oCol._setter = null;
61720                 oCol.fnGetData = function (rowData, type, meta) {
61721                         var innerData = mData( rowData, type, undefined, meta );
61723                         return mRender && type ?
61724                                 mRender( innerData, type, rowData, meta ) :
61725                                 innerData;
61726                 };
61727                 oCol.fnSetData = function ( rowData, val, meta ) {
61728                         return _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );
61729                 };
61731                 // Indicate if DataTables should read DOM data as an object or array
61732                 // Used in _fnGetRowElements
61733                 if ( typeof mDataSrc !== 'number' ) {
61734                         oSettings._rowReadObject = true;
61735                 }
61737                 /* Feature sorting overrides column specific when off */
61738                 if ( !oSettings.oFeatures.bSort )
61739                 {
61740                         oCol.bSortable = false;
61741                         th.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called
61742                 }
61744                 /* Check that the class assignment is correct for sorting */
61745                 var bAsc = $.inArray('asc', oCol.asSorting) !== -1;
61746                 var bDesc = $.inArray('desc', oCol.asSorting) !== -1;
61747                 if ( !oCol.bSortable || (!bAsc && !bDesc) )
61748                 {
61749                         oCol.sSortingClass = oClasses.sSortableNone;
61750                         oCol.sSortingClassJUI = "";
61751                 }
61752                 else if ( bAsc && !bDesc )
61753                 {
61754                         oCol.sSortingClass = oClasses.sSortableAsc;
61755                         oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;
61756                 }
61757                 else if ( !bAsc && bDesc )
61758                 {
61759                         oCol.sSortingClass = oClasses.sSortableDesc;
61760                         oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;
61761                 }
61762                 else
61763                 {
61764                         oCol.sSortingClass = oClasses.sSortable;
61765                         oCol.sSortingClassJUI = oClasses.sSortJUI;
61766                 }
61767         }
61770         /**
61771          * Adjust the table column widths for new data. Note: you would probably want to
61772          * do a redraw after calling this function!
61773          *  @param {object} settings dataTables settings object
61774          *  @memberof DataTable#oApi
61775          */
61776         function _fnAdjustColumnSizing ( settings )
61777         {
61778                 /* Not interested in doing column width calculation if auto-width is disabled */
61779                 if ( settings.oFeatures.bAutoWidth !== false )
61780                 {
61781                         var columns = settings.aoColumns;
61783                         _fnCalculateColumnWidths( settings );
61784                         for ( var i=0 , iLen=columns.length ; i<iLen ; i++ )
61785                         {
61786                                 columns[i].nTh.style.width = columns[i].sWidth;
61787                         }
61788                 }
61790                 var scroll = settings.oScroll;
61791                 if ( scroll.sY !== '' || scroll.sX !== '')
61792                 {
61793                         _fnScrollDraw( settings );
61794                 }
61796                 _fnCallbackFire( settings, null, 'column-sizing', [settings] );
61797         }
61800         /**
61801          * Covert the index of a visible column to the index in the data array (take account
61802          * of hidden columns)
61803          *  @param {object} oSettings dataTables settings object
61804          *  @param {int} iMatch Visible column index to lookup
61805          *  @returns {int} i the data index
61806          *  @memberof DataTable#oApi
61807          */
61808         function _fnVisibleToColumnIndex( oSettings, iMatch )
61809         {
61810                 var aiVis = _fnGetColumns( oSettings, 'bVisible' );
61812                 return typeof aiVis[iMatch] === 'number' ?
61813                         aiVis[iMatch] :
61814                         null;
61815         }
61818         /**
61819          * Covert the index of an index in the data array and convert it to the visible
61820          *   column index (take account of hidden columns)
61821          *  @param {int} iMatch Column index to lookup
61822          *  @param {object} oSettings dataTables settings object
61823          *  @returns {int} i the data index
61824          *  @memberof DataTable#oApi
61825          */
61826         function _fnColumnIndexToVisible( oSettings, iMatch )
61827         {
61828                 var aiVis = _fnGetColumns( oSettings, 'bVisible' );
61829                 var iPos = $.inArray( iMatch, aiVis );
61831                 return iPos !== -1 ? iPos : null;
61832         }
61835         /**
61836          * Get the number of visible columns
61837          *  @param {object} oSettings dataTables settings object
61838          *  @returns {int} i the number of visible columns
61839          *  @memberof DataTable#oApi
61840          */
61841         function _fnVisbleColumns( oSettings )
61842         {
61843                 var vis = 0;
61845                 // No reduce in IE8, use a loop for now
61846                 $.each( oSettings.aoColumns, function ( i, col ) {
61847                         if ( col.bVisible && $(col.nTh).css('display') !== 'none' ) {
61848                                 vis++;
61849                         }
61850                 } );
61852                 return vis;
61853         }
61856         /**
61857          * Get an array of column indexes that match a given property
61858          *  @param {object} oSettings dataTables settings object
61859          *  @param {string} sParam Parameter in aoColumns to look for - typically
61860          *    bVisible or bSearchable
61861          *  @returns {array} Array of indexes with matched properties
61862          *  @memberof DataTable#oApi
61863          */
61864         function _fnGetColumns( oSettings, sParam )
61865         {
61866                 var a = [];
61868                 $.map( oSettings.aoColumns, function(val, i) {
61869                         if ( val[sParam] ) {
61870                                 a.push( i );
61871                         }
61872                 } );
61874                 return a;
61875         }
61878         /**
61879          * Calculate the 'type' of a column
61880          *  @param {object} settings dataTables settings object
61881          *  @memberof DataTable#oApi
61882          */
61883         function _fnColumnTypes ( settings )
61884         {
61885                 var columns = settings.aoColumns;
61886                 var data = settings.aoData;
61887                 var types = DataTable.ext.type.detect;
61888                 var i, ien, j, jen, k, ken;
61889                 var col, cell, detectedType, cache;
61891                 // For each column, spin over the
61892                 for ( i=0, ien=columns.length ; i<ien ; i++ ) {
61893                         col = columns[i];
61894                         cache = [];
61896                         if ( ! col.sType && col._sManualType ) {
61897                                 col.sType = col._sManualType;
61898                         }
61899                         else if ( ! col.sType ) {
61900                                 for ( j=0, jen=types.length ; j<jen ; j++ ) {
61901                                         for ( k=0, ken=data.length ; k<ken ; k++ ) {
61902                                                 // Use a cache array so we only need to get the type data
61903                                                 // from the formatter once (when using multiple detectors)
61904                                                 if ( cache[k] === undefined ) {
61905                                                         cache[k] = _fnGetCellData( settings, k, i, 'type' );
61906                                                 }
61908                                                 detectedType = types[j]( cache[k], settings );
61910                                                 // If null, then this type can't apply to this column, so
61911                                                 // rather than testing all cells, break out. There is an
61912                                                 // exception for the last type which is `html`. We need to
61913                                                 // scan all rows since it is possible to mix string and HTML
61914                                                 // types
61915                                                 if ( ! detectedType && j !== types.length-1 ) {
61916                                                         break;
61917                                                 }
61919                                                 // Only a single match is needed for html type since it is
61920                                                 // bottom of the pile and very similar to string
61921                                                 if ( detectedType === 'html' ) {
61922                                                         break;
61923                                                 }
61924                                         }
61926                                         // Type is valid for all data points in the column - use this
61927                                         // type
61928                                         if ( detectedType ) {
61929                                                 col.sType = detectedType;
61930                                                 break;
61931                                         }
61932                                 }
61934                                 // Fall back - if no type was detected, always use string
61935                                 if ( ! col.sType ) {
61936                                         col.sType = 'string';
61937                                 }
61938                         }
61939                 }
61940         }
61943         /**
61944          * Take the column definitions and static columns arrays and calculate how
61945          * they relate to column indexes. The callback function will then apply the
61946          * definition found for a column to a suitable configuration object.
61947          *  @param {object} oSettings dataTables settings object
61948          *  @param {array} aoColDefs The aoColumnDefs array that is to be applied
61949          *  @param {array} aoCols The aoColumns array that defines columns individually
61950          *  @param {function} fn Callback function - takes two parameters, the calculated
61951          *    column index and the definition for that column.
61952          *  @memberof DataTable#oApi
61953          */
61954         function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
61955         {
61956                 var i, iLen, j, jLen, k, kLen, def;
61957                 var columns = oSettings.aoColumns;
61959                 // Column definitions with aTargets
61960                 if ( aoColDefs )
61961                 {
61962                         /* Loop over the definitions array - loop in reverse so first instance has priority */
61963                         for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
61964                         {
61965                                 def = aoColDefs[i];
61967                                 /* Each definition can target multiple columns, as it is an array */
61968                                 var aTargets = def.targets !== undefined ?
61969                                         def.targets :
61970                                         def.aTargets;
61972                                 if ( ! $.isArray( aTargets ) )
61973                                 {
61974                                         aTargets = [ aTargets ];
61975                                 }
61977                                 for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
61978                                 {
61979                                         if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
61980                                         {
61981                                                 /* Add columns that we don't yet know about */
61982                                                 while( columns.length <= aTargets[j] )
61983                                                 {
61984                                                         _fnAddColumn( oSettings );
61985                                                 }
61987                                                 /* Integer, basic index */
61988                                                 fn( aTargets[j], def );
61989                                         }
61990                                         else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
61991                                         {
61992                                                 /* Negative integer, right to left column counting */
61993                                                 fn( columns.length+aTargets[j], def );
61994                                         }
61995                                         else if ( typeof aTargets[j] === 'string' )
61996                                         {
61997                                                 /* Class name matching on TH element */
61998                                                 for ( k=0, kLen=columns.length ; k<kLen ; k++ )
61999                                                 {
62000                                                         if ( aTargets[j] == "_all" ||
62001                                                              $(columns[k].nTh).hasClass( aTargets[j] ) )
62002                                                         {
62003                                                                 fn( k, def );
62004                                                         }
62005                                                 }
62006                                         }
62007                                 }
62008                         }
62009                 }
62011                 // Statically defined columns array
62012                 if ( aoCols )
62013                 {
62014                         for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
62015                         {
62016                                 fn( i, aoCols[i] );
62017                         }
62018                 }
62019         }
62021         /**
62022          * Add a data array to the table, creating DOM node etc. This is the parallel to
62023          * _fnGatherData, but for adding rows from a Javascript source, rather than a
62024          * DOM source.
62025          *  @param {object} oSettings dataTables settings object
62026          *  @param {array} aData data array to be added
62027          *  @param {node} [nTr] TR element to add to the table - optional. If not given,
62028          *    DataTables will create a row automatically
62029          *  @param {array} [anTds] Array of TD|TH elements for the row - must be given
62030          *    if nTr is.
62031          *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
62032          *  @memberof DataTable#oApi
62033          */
62034         function _fnAddData ( oSettings, aDataIn, nTr, anTds )
62035         {
62036                 /* Create the object for storing information about this new row */
62037                 var iRow = oSettings.aoData.length;
62038                 var oData = $.extend( true, {}, DataTable.models.oRow, {
62039                         src: nTr ? 'dom' : 'data',
62040                         idx: iRow
62041                 } );
62043                 oData._aData = aDataIn;
62044                 oSettings.aoData.push( oData );
62046                 /* Create the cells */
62047                 var nTd, sThisType;
62048                 var columns = oSettings.aoColumns;
62050                 // Invalidate the column types as the new data needs to be revalidated
62051                 for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
62052                 {
62053                         columns[i].sType = null;
62054                 }
62056                 /* Add to the display array */
62057                 oSettings.aiDisplayMaster.push( iRow );
62059                 var id = oSettings.rowIdFn( aDataIn );
62060                 if ( id !== undefined ) {
62061                         oSettings.aIds[ id ] = oData;
62062                 }
62064                 /* Create the DOM information, or register it if already present */
62065                 if ( nTr || ! oSettings.oFeatures.bDeferRender )
62066                 {
62067                         _fnCreateTr( oSettings, iRow, nTr, anTds );
62068                 }
62070                 return iRow;
62071         }
62074         /**
62075          * Add one or more TR elements to the table. Generally we'd expect to
62076          * use this for reading data from a DOM sourced table, but it could be
62077          * used for an TR element. Note that if a TR is given, it is used (i.e.
62078          * it is not cloned).
62079          *  @param {object} settings dataTables settings object
62080          *  @param {array|node|jQuery} trs The TR element(s) to add to the table
62081          *  @returns {array} Array of indexes for the added rows
62082          *  @memberof DataTable#oApi
62083          */
62084         function _fnAddTr( settings, trs )
62085         {
62086                 var row;
62088                 // Allow an individual node to be passed in
62089                 if ( ! (trs instanceof $) ) {
62090                         trs = $(trs);
62091                 }
62093                 return trs.map( function (i, el) {
62094                         row = _fnGetRowElements( settings, el );
62095                         return _fnAddData( settings, row.data, el, row.cells );
62096                 } );
62097         }
62100         /**
62101          * Take a TR element and convert it to an index in aoData
62102          *  @param {object} oSettings dataTables settings object
62103          *  @param {node} n the TR element to find
62104          *  @returns {int} index if the node is found, null if not
62105          *  @memberof DataTable#oApi
62106          */
62107         function _fnNodeToDataIndex( oSettings, n )
62108         {
62109                 return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;
62110         }
62113         /**
62114          * Take a TD element and convert it into a column data index (not the visible index)
62115          *  @param {object} oSettings dataTables settings object
62116          *  @param {int} iRow The row number the TD/TH can be found in
62117          *  @param {node} n The TD/TH element to find
62118          *  @returns {int} index if the node is found, -1 if not
62119          *  @memberof DataTable#oApi
62120          */
62121         function _fnNodeToColumnIndex( oSettings, iRow, n )
62122         {
62123                 return $.inArray( n, oSettings.aoData[ iRow ].anCells );
62124         }
62127         /**
62128          * Get the data for a given cell from the internal cache, taking into account data mapping
62129          *  @param {object} settings dataTables settings object
62130          *  @param {int} rowIdx aoData row id
62131          *  @param {int} colIdx Column index
62132          *  @param {string} type data get type ('display', 'type' 'filter' 'sort')
62133          *  @returns {*} Cell data
62134          *  @memberof DataTable#oApi
62135          */
62136         function _fnGetCellData( settings, rowIdx, colIdx, type )
62137         {
62138                 var draw           = settings.iDraw;
62139                 var col            = settings.aoColumns[colIdx];
62140                 var rowData        = settings.aoData[rowIdx]._aData;
62141                 var defaultContent = col.sDefaultContent;
62142                 var cellData       = col.fnGetData( rowData, type, {
62143                         settings: settings,
62144                         row:      rowIdx,
62145                         col:      colIdx
62146                 } );
62148                 if ( cellData === undefined ) {
62149                         if ( settings.iDrawError != draw && defaultContent === null ) {
62150                                 _fnLog( settings, 0, "Requested unknown parameter "+
62151                                         (typeof col.mData=='function' ? '{function}' : "'"+col.mData+"'")+
62152                                         " for row "+rowIdx+", column "+colIdx, 4 );
62153                                 settings.iDrawError = draw;
62154                         }
62155                         return defaultContent;
62156                 }
62158                 // When the data source is null and a specific data type is requested (i.e.
62159                 // not the original data), we can use default column data
62160                 if ( (cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined ) {
62161                         cellData = defaultContent;
62162                 }
62163                 else if ( typeof cellData === 'function' ) {
62164                         // If the data source is a function, then we run it and use the return,
62165                         // executing in the scope of the data object (for instances)
62166                         return cellData.call( rowData );
62167                 }
62169                 if ( cellData === null && type == 'display' ) {
62170                         return '';
62171                 }
62172                 return cellData;
62173         }
62176         /**
62177          * Set the value for a specific cell, into the internal data cache
62178          *  @param {object} settings dataTables settings object
62179          *  @param {int} rowIdx aoData row id
62180          *  @param {int} colIdx Column index
62181          *  @param {*} val Value to set
62182          *  @memberof DataTable#oApi
62183          */
62184         function _fnSetCellData( settings, rowIdx, colIdx, val )
62185         {
62186                 var col     = settings.aoColumns[colIdx];
62187                 var rowData = settings.aoData[rowIdx]._aData;
62189                 col.fnSetData( rowData, val, {
62190                         settings: settings,
62191                         row:      rowIdx,
62192                         col:      colIdx
62193                 }  );
62194         }
62197         // Private variable that is used to match action syntax in the data property object
62198         var __reArray = /\[.*?\]$/;
62199         var __reFn = /\(\)$/;
62201         /**
62202          * Split string on periods, taking into account escaped periods
62203          * @param  {string} str String to split
62204          * @return {array} Split string
62205          */
62206         function _fnSplitObjNotation( str )
62207         {
62208                 return $.map( str.match(/(\\.|[^\.])+/g) || [''], function ( s ) {
62209                         return s.replace(/\\\./g, '.');
62210                 } );
62211         }
62214         /**
62215          * Return a function that can be used to get data from a source object, taking
62216          * into account the ability to use nested objects as a source
62217          *  @param {string|int|function} mSource The data source for the object
62218          *  @returns {function} Data get function
62219          *  @memberof DataTable#oApi
62220          */
62221         function _fnGetObjectDataFn( mSource )
62222         {
62223                 if ( $.isPlainObject( mSource ) )
62224                 {
62225                         /* Build an object of get functions, and wrap them in a single call */
62226                         var o = {};
62227                         $.each( mSource, function (key, val) {
62228                                 if ( val ) {
62229                                         o[key] = _fnGetObjectDataFn( val );
62230                                 }
62231                         } );
62233                         return function (data, type, row, meta) {
62234                                 var t = o[type] || o._;
62235                                 return t !== undefined ?
62236                                         t(data, type, row, meta) :
62237                                         data;
62238                         };
62239                 }
62240                 else if ( mSource === null )
62241                 {
62242                         /* Give an empty string for rendering / sorting etc */
62243                         return function (data) { // type, row and meta also passed, but not used
62244                                 return data;
62245                         };
62246                 }
62247                 else if ( typeof mSource === 'function' )
62248                 {
62249                         return function (data, type, row, meta) {
62250                                 return mSource( data, type, row, meta );
62251                         };
62252                 }
62253                 else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
62254                               mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
62255                 {
62256                         /* If there is a . in the source string then the data source is in a
62257                          * nested object so we loop over the data for each level to get the next
62258                          * level down. On each loop we test for undefined, and if found immediately
62259                          * return. This allows entire objects to be missing and sDefaultContent to
62260                          * be used if defined, rather than throwing an error
62261                          */
62262                         var fetchData = function (data, type, src) {
62263                                 var arrayNotation, funcNotation, out, innerSrc;
62265                                 if ( src !== "" )
62266                                 {
62267                                         var a = _fnSplitObjNotation( src );
62269                                         for ( var i=0, iLen=a.length ; i<iLen ; i++ )
62270                                         {
62271                                                 // Check if we are dealing with special notation
62272                                                 arrayNotation = a[i].match(__reArray);
62273                                                 funcNotation = a[i].match(__reFn);
62275                                                 if ( arrayNotation )
62276                                                 {
62277                                                         // Array notation
62278                                                         a[i] = a[i].replace(__reArray, '');
62280                                                         // Condition allows simply [] to be passed in
62281                                                         if ( a[i] !== "" ) {
62282                                                                 data = data[ a[i] ];
62283                                                         }
62284                                                         out = [];
62286                                                         // Get the remainder of the nested object to get
62287                                                         a.splice( 0, i+1 );
62288                                                         innerSrc = a.join('.');
62290                                                         // Traverse each entry in the array getting the properties requested
62291                                                         if ( $.isArray( data ) ) {
62292                                                                 for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
62293                                                                         out.push( fetchData( data[j], type, innerSrc ) );
62294                                                                 }
62295                                                         }
62297                                                         // If a string is given in between the array notation indicators, that
62298                                                         // is used to join the strings together, otherwise an array is returned
62299                                                         var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
62300                                                         data = (join==="") ? out : out.join(join);
62302                                                         // The inner call to fetchData has already traversed through the remainder
62303                                                         // of the source requested, so we exit from the loop
62304                                                         break;
62305                                                 }
62306                                                 else if ( funcNotation )
62307                                                 {
62308                                                         // Function call
62309                                                         a[i] = a[i].replace(__reFn, '');
62310                                                         data = data[ a[i] ]();
62311                                                         continue;
62312                                                 }
62314                                                 if ( data === null || data[ a[i] ] === undefined )
62315                                                 {
62316                                                         return undefined;
62317                                                 }
62318                                                 data = data[ a[i] ];
62319                                         }
62320                                 }
62322                                 return data;
62323                         };
62325                         return function (data, type) { // row and meta also passed, but not used
62326                                 return fetchData( data, type, mSource );
62327                         };
62328                 }
62329                 else
62330                 {
62331                         /* Array or flat object mapping */
62332                         return function (data, type) { // row and meta also passed, but not used
62333                                 return data[mSource];
62334                         };
62335                 }
62336         }
62339         /**
62340          * Return a function that can be used to set data from a source object, taking
62341          * into account the ability to use nested objects as a source
62342          *  @param {string|int|function} mSource The data source for the object
62343          *  @returns {function} Data set function
62344          *  @memberof DataTable#oApi
62345          */
62346         function _fnSetObjectDataFn( mSource )
62347         {
62348                 if ( $.isPlainObject( mSource ) )
62349                 {
62350                         /* Unlike get, only the underscore (global) option is used for for
62351                          * setting data since we don't know the type here. This is why an object
62352                          * option is not documented for `mData` (which is read/write), but it is
62353                          * for `mRender` which is read only.
62354                          */
62355                         return _fnSetObjectDataFn( mSource._ );
62356                 }
62357                 else if ( mSource === null )
62358                 {
62359                         /* Nothing to do when the data source is null */
62360                         return function () {};
62361                 }
62362                 else if ( typeof mSource === 'function' )
62363                 {
62364                         return function (data, val, meta) {
62365                                 mSource( data, 'set', val, meta );
62366                         };
62367                 }
62368                 else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
62369                               mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
62370                 {
62371                         /* Like the get, we need to get data from a nested object */
62372                         var setData = function (data, val, src) {
62373                                 var a = _fnSplitObjNotation( src ), b;
62374                                 var aLast = a[a.length-1];
62375                                 var arrayNotation, funcNotation, o, innerSrc;
62377                                 for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
62378                                 {
62379                                         // Check if we are dealing with an array notation request
62380                                         arrayNotation = a[i].match(__reArray);
62381                                         funcNotation = a[i].match(__reFn);
62383                                         if ( arrayNotation )
62384                                         {
62385                                                 a[i] = a[i].replace(__reArray, '');
62386                                                 data[ a[i] ] = [];
62388                                                 // Get the remainder of the nested object to set so we can recurse
62389                                                 b = a.slice();
62390                                                 b.splice( 0, i+1 );
62391                                                 innerSrc = b.join('.');
62393                                                 // Traverse each entry in the array setting the properties requested
62394                                                 if ( $.isArray( val ) )
62395                                                 {
62396                                                         for ( var j=0, jLen=val.length ; j<jLen ; j++ )
62397                                                         {
62398                                                                 o = {};
62399                                                                 setData( o, val[j], innerSrc );
62400                                                                 data[ a[i] ].push( o );
62401                                                         }
62402                                                 }
62403                                                 else
62404                                                 {
62405                                                         // We've been asked to save data to an array, but it
62406                                                         // isn't array data to be saved. Best that can be done
62407                                                         // is to just save the value.
62408                                                         data[ a[i] ] = val;
62409                                                 }
62411                                                 // The inner call to setData has already traversed through the remainder
62412                                                 // of the source and has set the data, thus we can exit here
62413                                                 return;
62414                                         }
62415                                         else if ( funcNotation )
62416                                         {
62417                                                 // Function call
62418                                                 a[i] = a[i].replace(__reFn, '');
62419                                                 data = data[ a[i] ]( val );
62420                                         }
62422                                         // If the nested object doesn't currently exist - since we are
62423                                         // trying to set the value - create it
62424                                         if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
62425                                         {
62426                                                 data[ a[i] ] = {};
62427                                         }
62428                                         data = data[ a[i] ];
62429                                 }
62431                                 // Last item in the input - i.e, the actual set
62432                                 if ( aLast.match(__reFn ) )
62433                                 {
62434                                         // Function call
62435                                         data = data[ aLast.replace(__reFn, '') ]( val );
62436                                 }
62437                                 else
62438                                 {
62439                                         // If array notation is used, we just want to strip it and use the property name
62440                                         // and assign the value. If it isn't used, then we get the result we want anyway
62441                                         data[ aLast.replace(__reArray, '') ] = val;
62442                                 }
62443                         };
62445                         return function (data, val) { // meta is also passed in, but not used
62446                                 return setData( data, val, mSource );
62447                         };
62448                 }
62449                 else
62450                 {
62451                         /* Array or flat object mapping */
62452                         return function (data, val) { // meta is also passed in, but not used
62453                                 data[mSource] = val;
62454                         };
62455                 }
62456         }
62459         /**
62460          * Return an array with the full table data
62461          *  @param {object} oSettings dataTables settings object
62462          *  @returns array {array} aData Master data array
62463          *  @memberof DataTable#oApi
62464          */
62465         function _fnGetDataMaster ( settings )
62466         {
62467                 return _pluck( settings.aoData, '_aData' );
62468         }
62471         /**
62472          * Nuke the table
62473          *  @param {object} oSettings dataTables settings object
62474          *  @memberof DataTable#oApi
62475          */
62476         function _fnClearTable( settings )
62477         {
62478                 settings.aoData.length = 0;
62479                 settings.aiDisplayMaster.length = 0;
62480                 settings.aiDisplay.length = 0;
62481                 settings.aIds = {};
62482         }
62485          /**
62486          * Take an array of integers (index array) and remove a target integer (value - not
62487          * the key!)
62488          *  @param {array} a Index array to target
62489          *  @param {int} iTarget value to find
62490          *  @memberof DataTable#oApi
62491          */
62492         function _fnDeleteIndex( a, iTarget, splice )
62493         {
62494                 var iTargetIndex = -1;
62496                 for ( var i=0, iLen=a.length ; i<iLen ; i++ )
62497                 {
62498                         if ( a[i] == iTarget )
62499                         {
62500                                 iTargetIndex = i;
62501                         }
62502                         else if ( a[i] > iTarget )
62503                         {
62504                                 a[i]--;
62505                         }
62506                 }
62508                 if ( iTargetIndex != -1 && splice === undefined )
62509                 {
62510                         a.splice( iTargetIndex, 1 );
62511                 }
62512         }
62515         /**
62516          * Mark cached data as invalid such that a re-read of the data will occur when
62517          * the cached data is next requested. Also update from the data source object.
62518          *
62519          * @param {object} settings DataTables settings object
62520          * @param {int}    rowIdx   Row index to invalidate
62521          * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'
62522          *     or 'data'
62523          * @param {int}    [colIdx] Column index to invalidate. If undefined the whole
62524          *     row will be invalidated
62525          * @memberof DataTable#oApi
62526          *
62527          * @todo For the modularisation of v1.11 this will need to become a callback, so
62528          *   the sort and filter methods can subscribe to it. That will required
62529          *   initialisation options for sorting, which is why it is not already baked in
62530          */
62531         function _fnInvalidate( settings, rowIdx, src, colIdx )
62532         {
62533                 var row = settings.aoData[ rowIdx ];
62534                 var i, ien;
62535                 var cellWrite = function ( cell, col ) {
62536                         // This is very frustrating, but in IE if you just write directly
62537                         // to innerHTML, and elements that are overwritten are GC'ed,
62538                         // even if there is a reference to them elsewhere
62539                         while ( cell.childNodes.length ) {
62540                                 cell.removeChild( cell.firstChild );
62541                         }
62543                         cell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );
62544                 };
62546                 // Are we reading last data from DOM or the data object?
62547                 if ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {
62548                         // Read the data from the DOM
62549                         row._aData = _fnGetRowElements(
62550                                         settings, row, colIdx, colIdx === undefined ? undefined : row._aData
62551                                 )
62552                                 .data;
62553                 }
62554                 else {
62555                         // Reading from data object, update the DOM
62556                         var cells = row.anCells;
62558                         if ( cells ) {
62559                                 if ( colIdx !== undefined ) {
62560                                         cellWrite( cells[colIdx], colIdx );
62561                                 }
62562                                 else {
62563                                         for ( i=0, ien=cells.length ; i<ien ; i++ ) {
62564                                                 cellWrite( cells[i], i );
62565                                         }
62566                                 }
62567                         }
62568                 }
62570                 // For both row and cell invalidation, the cached data for sorting and
62571                 // filtering is nulled out
62572                 row._aSortData = null;
62573                 row._aFilterData = null;
62575                 // Invalidate the type for a specific column (if given) or all columns since
62576                 // the data might have changed
62577                 var cols = settings.aoColumns;
62578                 if ( colIdx !== undefined ) {
62579                         cols[ colIdx ].sType = null;
62580                 }
62581                 else {
62582                         for ( i=0, ien=cols.length ; i<ien ; i++ ) {
62583                                 cols[i].sType = null;
62584                         }
62586                         // Update DataTables special `DT_*` attributes for the row
62587                         _fnRowAttributes( settings, row );
62588                 }
62589         }
62592         /**
62593          * Build a data source object from an HTML row, reading the contents of the
62594          * cells that are in the row.
62595          *
62596          * @param {object} settings DataTables settings object
62597          * @param {node|object} TR element from which to read data or existing row
62598          *   object from which to re-read the data from the cells
62599          * @param {int} [colIdx] Optional column index
62600          * @param {array|object} [d] Data source object. If `colIdx` is given then this
62601          *   parameter should also be given and will be used to write the data into.
62602          *   Only the column in question will be written
62603          * @returns {object} Object with two parameters: `data` the data read, in
62604          *   document order, and `cells` and array of nodes (they can be useful to the
62605          *   caller, so rather than needing a second traversal to get them, just return
62606          *   them from here).
62607          * @memberof DataTable#oApi
62608          */
62609         function _fnGetRowElements( settings, row, colIdx, d )
62610         {
62611                 var
62612                         tds = [],
62613                         td = row.firstChild,
62614                         name, col, o, i=0, contents,
62615                         columns = settings.aoColumns,
62616                         objectRead = settings._rowReadObject;
62618                 // Allow the data object to be passed in, or construct
62619                 d = d !== undefined ?
62620                         d :
62621                         objectRead ?
62622                                 {} :
62623                                 [];
62625                 var attr = function ( str, td  ) {
62626                         if ( typeof str === 'string' ) {
62627                                 var idx = str.indexOf('@');
62629                                 if ( idx !== -1 ) {
62630                                         var attr = str.substring( idx+1 );
62631                                         var setter = _fnSetObjectDataFn( str );
62632                                         setter( d, td.getAttribute( attr ) );
62633                                 }
62634                         }
62635                 };
62637                 // Read data from a cell and store into the data object
62638                 var cellProcess = function ( cell ) {
62639                         if ( colIdx === undefined || colIdx === i ) {
62640                                 col = columns[i];
62641                                 contents = $.trim(cell.innerHTML);
62643                                 if ( col && col._bAttrSrc ) {
62644                                         var setter = _fnSetObjectDataFn( col.mData._ );
62645                                         setter( d, contents );
62647                                         attr( col.mData.sort, cell );
62648                                         attr( col.mData.type, cell );
62649                                         attr( col.mData.filter, cell );
62650                                 }
62651                                 else {
62652                                         // Depending on the `data` option for the columns the data can
62653                                         // be read to either an object or an array.
62654                                         if ( objectRead ) {
62655                                                 if ( ! col._setter ) {
62656                                                         // Cache the setter function
62657                                                         col._setter = _fnSetObjectDataFn( col.mData );
62658                                                 }
62659                                                 col._setter( d, contents );
62660                                         }
62661                                         else {
62662                                                 d[i] = contents;
62663                                         }
62664                                 }
62665                         }
62667                         i++;
62668                 };
62670                 if ( td ) {
62671                         // `tr` element was passed in
62672                         while ( td ) {
62673                                 name = td.nodeName.toUpperCase();
62675                                 if ( name == "TD" || name == "TH" ) {
62676                                         cellProcess( td );
62677                                         tds.push( td );
62678                                 }
62680                                 td = td.nextSibling;
62681                         }
62682                 }
62683                 else {
62684                         // Existing row object passed in
62685                         tds = row.anCells;
62687                         for ( var j=0, jen=tds.length ; j<jen ; j++ ) {
62688                                 cellProcess( tds[j] );
62689                         }
62690                 }
62692                 // Read the ID from the DOM if present
62693                 var rowNode = row.firstChild ? row : row.nTr;
62695                 if ( rowNode ) {
62696                         var id = rowNode.getAttribute( 'id' );
62698                         if ( id ) {
62699                                 _fnSetObjectDataFn( settings.rowId )( d, id );
62700                         }
62701                 }
62703                 return {
62704                         data: d,
62705                         cells: tds
62706                 };
62707         }
62708         /**
62709          * Create a new TR element (and it's TD children) for a row
62710          *  @param {object} oSettings dataTables settings object
62711          *  @param {int} iRow Row to consider
62712          *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,
62713          *    DataTables will create a row automatically
62714          *  @param {array} [anTds] Array of TD|TH elements for the row - must be given
62715          *    if nTr is.
62716          *  @memberof DataTable#oApi
62717          */
62718         function _fnCreateTr ( oSettings, iRow, nTrIn, anTds )
62719         {
62720                 var
62721                         row = oSettings.aoData[iRow],
62722                         rowData = row._aData,
62723                         cells = [],
62724                         nTr, nTd, oCol,
62725                         i, iLen;
62727                 if ( row.nTr === null )
62728                 {
62729                         nTr = nTrIn || document.createElement('tr');
62731                         row.nTr = nTr;
62732                         row.anCells = cells;
62734                         /* Use a private property on the node to allow reserve mapping from the node
62735                          * to the aoData array for fast look up
62736                          */
62737                         nTr._DT_RowIndex = iRow;
62739                         /* Special parameters can be given by the data source to be used on the row */
62740                         _fnRowAttributes( oSettings, row );
62742                         /* Process each column */
62743                         for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
62744                         {
62745                                 oCol = oSettings.aoColumns[i];
62747                                 nTd = nTrIn ? anTds[i] : document.createElement( oCol.sCellType );
62748                                 nTd._DT_CellIndex = {
62749                                         row: iRow,
62750                                         column: i
62751                                 };
62753                                 cells.push( nTd );
62755                                 // Need to create the HTML if new, or if a rendering function is defined
62756                                 if ( (!nTrIn || oCol.mRender || oCol.mData !== i) &&
62757                                          (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display')
62758                                 ) {
62759                                         nTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );
62760                                 }
62762                                 /* Add user defined class */
62763                                 if ( oCol.sClass )
62764                                 {
62765                                         nTd.className += ' '+oCol.sClass;
62766                                 }
62768                                 // Visibility - add or remove as required
62769                                 if ( oCol.bVisible && ! nTrIn )
62770                                 {
62771                                         nTr.appendChild( nTd );
62772                                 }
62773                                 else if ( ! oCol.bVisible && nTrIn )
62774                                 {
62775                                         nTd.parentNode.removeChild( nTd );
62776                                 }
62778                                 if ( oCol.fnCreatedCell )
62779                                 {
62780                                         oCol.fnCreatedCell.call( oSettings.oInstance,
62781                                                 nTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i
62782                                         );
62783                                 }
62784                         }
62786                         _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow, cells] );
62787                 }
62789                 // Remove once webkit bug 131819 and Chromium bug 365619 have been resolved
62790                 // and deployed
62791                 row.nTr.setAttribute( 'role', 'row' );
62792         }
62795         /**
62796          * Add attributes to a row based on the special `DT_*` parameters in a data
62797          * source object.
62798          *  @param {object} settings DataTables settings object
62799          *  @param {object} DataTables row object for the row to be modified
62800          *  @memberof DataTable#oApi
62801          */
62802         function _fnRowAttributes( settings, row )
62803         {
62804                 var tr = row.nTr;
62805                 var data = row._aData;
62807                 if ( tr ) {
62808                         var id = settings.rowIdFn( data );
62810                         if ( id ) {
62811                                 tr.id = id;
62812                         }
62814                         if ( data.DT_RowClass ) {
62815                                 // Remove any classes added by DT_RowClass before
62816                                 var a = data.DT_RowClass.split(' ');
62817                                 row.__rowc = row.__rowc ?
62818                                         _unique( row.__rowc.concat( a ) ) :
62819                                         a;
62821                                 $(tr)
62822                                         .removeClass( row.__rowc.join(' ') )
62823                                         .addClass( data.DT_RowClass );
62824                         }
62826                         if ( data.DT_RowAttr ) {
62827                                 $(tr).attr( data.DT_RowAttr );
62828                         }
62830                         if ( data.DT_RowData ) {
62831                                 $(tr).data( data.DT_RowData );
62832                         }
62833                 }
62834         }
62837         /**
62838          * Create the HTML header for the table
62839          *  @param {object} oSettings dataTables settings object
62840          *  @memberof DataTable#oApi
62841          */
62842         function _fnBuildHead( oSettings )
62843         {
62844                 var i, ien, cell, row, column;
62845                 var thead = oSettings.nTHead;
62846                 var tfoot = oSettings.nTFoot;
62847                 var createHeader = $('th, td', thead).length === 0;
62848                 var classes = oSettings.oClasses;
62849                 var columns = oSettings.aoColumns;
62851                 if ( createHeader ) {
62852                         row = $('<tr/>').appendTo( thead );
62853                 }
62855                 for ( i=0, ien=columns.length ; i<ien ; i++ ) {
62856                         column = columns[i];
62857                         cell = $( column.nTh ).addClass( column.sClass );
62859                         if ( createHeader ) {
62860                                 cell.appendTo( row );
62861                         }
62863                         // 1.11 move into sorting
62864                         if ( oSettings.oFeatures.bSort ) {
62865                                 cell.addClass( column.sSortingClass );
62867                                 if ( column.bSortable !== false ) {
62868                                         cell
62869                                                 .attr( 'tabindex', oSettings.iTabIndex )
62870                                                 .attr( 'aria-controls', oSettings.sTableId );
62872                                         _fnSortAttachListener( oSettings, column.nTh, i );
62873                                 }
62874                         }
62876                         if ( column.sTitle != cell[0].innerHTML ) {
62877                                 cell.html( column.sTitle );
62878                         }
62880                         _fnRenderer( oSettings, 'header' )(
62881                                 oSettings, cell, column, classes
62882                         );
62883                 }
62885                 if ( createHeader ) {
62886                         _fnDetectHeader( oSettings.aoHeader, thead );
62887                 }
62889                 /* ARIA role for the rows */
62890                 $(thead).find('>tr').attr('role', 'row');
62892                 /* Deal with the footer - add classes if required */
62893                 $(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH );
62894                 $(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH );
62896                 // Cache the footer cells. Note that we only take the cells from the first
62897                 // row in the footer. If there is more than one row the user wants to
62898                 // interact with, they need to use the table().foot() method. Note also this
62899                 // allows cells to be used for multiple columns using colspan
62900                 if ( tfoot !== null ) {
62901                         var cells = oSettings.aoFooter[0];
62903                         for ( i=0, ien=cells.length ; i<ien ; i++ ) {
62904                                 column = columns[i];
62905                                 column.nTf = cells[i].cell;
62907                                 if ( column.sClass ) {
62908                                         $(column.nTf).addClass( column.sClass );
62909                                 }
62910                         }
62911                 }
62912         }
62915         /**
62916          * Draw the header (or footer) element based on the column visibility states. The
62917          * methodology here is to use the layout array from _fnDetectHeader, modified for
62918          * the instantaneous column visibility, to construct the new layout. The grid is
62919          * traversed over cell at a time in a rows x columns grid fashion, although each
62920          * cell insert can cover multiple elements in the grid - which is tracks using the
62921          * aApplied array. Cell inserts in the grid will only occur where there isn't
62922          * already a cell in that position.
62923          *  @param {object} oSettings dataTables settings object
62924          *  @param array {objects} aoSource Layout array from _fnDetectHeader
62925          *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,
62926          *  @memberof DataTable#oApi
62927          */
62928         function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
62929         {
62930                 var i, iLen, j, jLen, k, kLen, n, nLocalTr;
62931                 var aoLocal = [];
62932                 var aApplied = [];
62933                 var iColumns = oSettings.aoColumns.length;
62934                 var iRowspan, iColspan;
62936                 if ( ! aoSource )
62937                 {
62938                         return;
62939                 }
62941                 if (  bIncludeHidden === undefined )
62942                 {
62943                         bIncludeHidden = false;
62944                 }
62946                 /* Make a copy of the master layout array, but without the visible columns in it */
62947                 for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
62948                 {
62949                         aoLocal[i] = aoSource[i].slice();
62950                         aoLocal[i].nTr = aoSource[i].nTr;
62952                         /* Remove any columns which are currently hidden */
62953                         for ( j=iColumns-1 ; j>=0 ; j-- )
62954                         {
62955                                 if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
62956                                 {
62957                                         aoLocal[i].splice( j, 1 );
62958                                 }
62959                         }
62961                         /* Prep the applied array - it needs an element for each row */
62962                         aApplied.push( [] );
62963                 }
62965                 for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
62966                 {
62967                         nLocalTr = aoLocal[i].nTr;
62969                         /* All cells are going to be replaced, so empty out the row */
62970                         if ( nLocalTr )
62971                         {
62972                                 while( (n = nLocalTr.firstChild) )
62973                                 {
62974                                         nLocalTr.removeChild( n );
62975                                 }
62976                         }
62978                         for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
62979                         {
62980                                 iRowspan = 1;
62981                                 iColspan = 1;
62983                                 /* Check to see if there is already a cell (row/colspan) covering our target
62984                                  * insert point. If there is, then there is nothing to do.
62985                                  */
62986                                 if ( aApplied[i][j] === undefined )
62987                                 {
62988                                         nLocalTr.appendChild( aoLocal[i][j].cell );
62989                                         aApplied[i][j] = 1;
62991                                         /* Expand the cell to cover as many rows as needed */
62992                                         while ( aoLocal[i+iRowspan] !== undefined &&
62993                                                 aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
62994                                         {
62995                                                 aApplied[i+iRowspan][j] = 1;
62996                                                 iRowspan++;
62997                                         }
62999                                         /* Expand the cell to cover as many columns as needed */
63000                                         while ( aoLocal[i][j+iColspan] !== undefined &&
63001                                                 aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
63002                                         {
63003                                                 /* Must update the applied array over the rows for the columns */
63004                                                 for ( k=0 ; k<iRowspan ; k++ )
63005                                                 {
63006                                                         aApplied[i+k][j+iColspan] = 1;
63007                                                 }
63008                                                 iColspan++;
63009                                         }
63011                                         /* Do the actual expansion in the DOM */
63012                                         $(aoLocal[i][j].cell)
63013                                                 .attr('rowspan', iRowspan)
63014                                                 .attr('colspan', iColspan);
63015                                 }
63016                         }
63017                 }
63018         }
63021         /**
63022          * Insert the required TR nodes into the table for display
63023          *  @param {object} oSettings dataTables settings object
63024          *  @memberof DataTable#oApi
63025          */
63026         function _fnDraw( oSettings )
63027         {
63028                 /* Provide a pre-callback function which can be used to cancel the draw is false is returned */
63029                 var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
63030                 if ( $.inArray( false, aPreDraw ) !== -1 )
63031                 {
63032                         _fnProcessingDisplay( oSettings, false );
63033                         return;
63034                 }
63036                 var i, iLen, n;
63037                 var anRows = [];
63038                 var iRowCount = 0;
63039                 var asStripeClasses = oSettings.asStripeClasses;
63040                 var iStripes = asStripeClasses.length;
63041                 var iOpenRows = oSettings.aoOpenRows.length;
63042                 var oLang = oSettings.oLanguage;
63043                 var iInitDisplayStart = oSettings.iInitDisplayStart;
63044                 var bServerSide = _fnDataSource( oSettings ) == 'ssp';
63045                 var aiDisplay = oSettings.aiDisplay;
63047                 oSettings.bDrawing = true;
63049                 /* Check and see if we have an initial draw position from state saving */
63050                 if ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )
63051                 {
63052                         oSettings._iDisplayStart = bServerSide ?
63053                                 iInitDisplayStart :
63054                                 iInitDisplayStart >= oSettings.fnRecordsDisplay() ?
63055                                         0 :
63056                                         iInitDisplayStart;
63058                         oSettings.iInitDisplayStart = -1;
63059                 }
63061                 var iDisplayStart = oSettings._iDisplayStart;
63062                 var iDisplayEnd = oSettings.fnDisplayEnd();
63064                 /* Server-side processing draw intercept */
63065                 if ( oSettings.bDeferLoading )
63066                 {
63067                         oSettings.bDeferLoading = false;
63068                         oSettings.iDraw++;
63069                         _fnProcessingDisplay( oSettings, false );
63070                 }
63071                 else if ( !bServerSide )
63072                 {
63073                         oSettings.iDraw++;
63074                 }
63075                 else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
63076                 {
63077                         return;
63078                 }
63080                 if ( aiDisplay.length !== 0 )
63081                 {
63082                         var iStart = bServerSide ? 0 : iDisplayStart;
63083                         var iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;
63085                         for ( var j=iStart ; j<iEnd ; j++ )
63086                         {
63087                                 var iDataIndex = aiDisplay[j];
63088                                 var aoData = oSettings.aoData[ iDataIndex ];
63089                                 if ( aoData.nTr === null )
63090                                 {
63091                                         _fnCreateTr( oSettings, iDataIndex );
63092                                 }
63094                                 var nRow = aoData.nTr;
63096                                 /* Remove the old striping classes and then add the new one */
63097                                 if ( iStripes !== 0 )
63098                                 {
63099                                         var sStripe = asStripeClasses[ iRowCount % iStripes ];
63100                                         if ( aoData._sRowStripe != sStripe )
63101                                         {
63102                                                 $(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );
63103                                                 aoData._sRowStripe = sStripe;
63104                                         }
63105                                 }
63107                                 // Row callback functions - might want to manipulate the row
63108                                 // iRowCount and j are not currently documented. Are they at all
63109                                 // useful?
63110                                 _fnCallbackFire( oSettings, 'aoRowCallback', null,
63111                                         [nRow, aoData._aData, iRowCount, j, iDataIndex] );
63113                                 anRows.push( nRow );
63114                                 iRowCount++;
63115                         }
63116                 }
63117                 else
63118                 {
63119                         /* Table is empty - create a row with an empty message in it */
63120                         var sZero = oLang.sZeroRecords;
63121                         if ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )
63122                         {
63123                                 sZero = oLang.sLoadingRecords;
63124                         }
63125                         else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
63126                         {
63127                                 sZero = oLang.sEmptyTable;
63128                         }
63130                         anRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )
63131                                 .append( $('<td />', {
63132                                         'valign':  'top',
63133                                         'colSpan': _fnVisbleColumns( oSettings ),
63134                                         'class':   oSettings.oClasses.sRowEmpty
63135                                 } ).html( sZero ) )[0];
63136                 }
63138                 /* Header and footer callbacks */
63139                 _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],
63140                         _fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
63142                 _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],
63143                         _fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
63145                 var body = $(oSettings.nTBody);
63147                 body.children().detach();
63148                 body.append( $(anRows) );
63150                 /* Call all required callback functions for the end of a draw */
63151                 _fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
63153                 /* Draw is complete, sorting and filtering must be as well */
63154                 oSettings.bSorted = false;
63155                 oSettings.bFiltered = false;
63156                 oSettings.bDrawing = false;
63157         }
63160         /**
63161          * Redraw the table - taking account of the various features which are enabled
63162          *  @param {object} oSettings dataTables settings object
63163          *  @param {boolean} [holdPosition] Keep the current paging position. By default
63164          *    the paging is reset to the first page
63165          *  @memberof DataTable#oApi
63166          */
63167         function _fnReDraw( settings, holdPosition )
63168         {
63169                 var
63170                         features = settings.oFeatures,
63171                         sort     = features.bSort,
63172                         filter   = features.bFilter;
63174                 if ( sort ) {
63175                         _fnSort( settings );
63176                 }
63178                 if ( filter ) {
63179                         _fnFilterComplete( settings, settings.oPreviousSearch );
63180                 }
63181                 else {
63182                         // No filtering, so we want to just use the display master
63183                         settings.aiDisplay = settings.aiDisplayMaster.slice();
63184                 }
63186                 if ( holdPosition !== true ) {
63187                         settings._iDisplayStart = 0;
63188                 }
63190                 // Let any modules know about the draw hold position state (used by
63191                 // scrolling internally)
63192                 settings._drawHold = holdPosition;
63194                 _fnDraw( settings );
63196                 settings._drawHold = false;
63197         }
63200         /**
63201          * Add the options to the page HTML for the table
63202          *  @param {object} oSettings dataTables settings object
63203          *  @memberof DataTable#oApi
63204          */
63205         function _fnAddOptionsHtml ( oSettings )
63206         {
63207                 var classes = oSettings.oClasses;
63208                 var table = $(oSettings.nTable);
63209                 var holding = $('<div/>').insertBefore( table ); // Holding element for speed
63210                 var features = oSettings.oFeatures;
63212                 // All DataTables are wrapped in a div
63213                 var insert = $('<div/>', {
63214                         id:      oSettings.sTableId+'_wrapper',
63215                         'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)
63216                 } );
63218                 oSettings.nHolding = holding[0];
63219                 oSettings.nTableWrapper = insert[0];
63220                 oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
63222                 /* Loop over the user set positioning and place the elements as needed */
63223                 var aDom = oSettings.sDom.split('');
63224                 var featureNode, cOption, nNewNode, cNext, sAttr, j;
63225                 for ( var i=0 ; i<aDom.length ; i++ )
63226                 {
63227                         featureNode = null;
63228                         cOption = aDom[i];
63230                         if ( cOption == '<' )
63231                         {
63232                                 /* New container div */
63233                                 nNewNode = $('<div/>')[0];
63235                                 /* Check to see if we should append an id and/or a class name to the container */
63236                                 cNext = aDom[i+1];
63237                                 if ( cNext == "'" || cNext == '"' )
63238                                 {
63239                                         sAttr = "";
63240                                         j = 2;
63241                                         while ( aDom[i+j] != cNext )
63242                                         {
63243                                                 sAttr += aDom[i+j];
63244                                                 j++;
63245                                         }
63247                                         /* Replace jQuery UI constants @todo depreciated */
63248                                         if ( sAttr == "H" )
63249                                         {
63250                                                 sAttr = classes.sJUIHeader;
63251                                         }
63252                                         else if ( sAttr == "F" )
63253                                         {
63254                                                 sAttr = classes.sJUIFooter;
63255                                         }
63257                                         /* The attribute can be in the format of "#id.class", "#id" or "class" This logic
63258                                          * breaks the string into parts and applies them as needed
63259                                          */
63260                                         if ( sAttr.indexOf('.') != -1 )
63261                                         {
63262                                                 var aSplit = sAttr.split('.');
63263                                                 nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
63264                                                 nNewNode.className = aSplit[1];
63265                                         }
63266                                         else if ( sAttr.charAt(0) == "#" )
63267                                         {
63268                                                 nNewNode.id = sAttr.substr(1, sAttr.length-1);
63269                                         }
63270                                         else
63271                                         {
63272                                                 nNewNode.className = sAttr;
63273                                         }
63275                                         i += j; /* Move along the position array */
63276                                 }
63278                                 insert.append( nNewNode );
63279                                 insert = $(nNewNode);
63280                         }
63281                         else if ( cOption == '>' )
63282                         {
63283                                 /* End container div */
63284                                 insert = insert.parent();
63285                         }
63286                         // @todo Move options into their own plugins?
63287                         else if ( cOption == 'l' && features.bPaginate && features.bLengthChange )
63288                         {
63289                                 /* Length */
63290                                 featureNode = _fnFeatureHtmlLength( oSettings );
63291                         }
63292                         else if ( cOption == 'f' && features.bFilter )
63293                         {
63294                                 /* Filter */
63295                                 featureNode = _fnFeatureHtmlFilter( oSettings );
63296                         }
63297                         else if ( cOption == 'r' && features.bProcessing )
63298                         {
63299                                 /* pRocessing */
63300                                 featureNode = _fnFeatureHtmlProcessing( oSettings );
63301                         }
63302                         else if ( cOption == 't' )
63303                         {
63304                                 /* Table */
63305                                 featureNode = _fnFeatureHtmlTable( oSettings );
63306                         }
63307                         else if ( cOption ==  'i' && features.bInfo )
63308                         {
63309                                 /* Info */
63310                                 featureNode = _fnFeatureHtmlInfo( oSettings );
63311                         }
63312                         else if ( cOption == 'p' && features.bPaginate )
63313                         {
63314                                 /* Pagination */
63315                                 featureNode = _fnFeatureHtmlPaginate( oSettings );
63316                         }
63317                         else if ( DataTable.ext.feature.length !== 0 )
63318                         {
63319                                 /* Plug-in features */
63320                                 var aoFeatures = DataTable.ext.feature;
63321                                 for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
63322                                 {
63323                                         if ( cOption == aoFeatures[k].cFeature )
63324                                         {
63325                                                 featureNode = aoFeatures[k].fnInit( oSettings );
63326                                                 break;
63327                                         }
63328                                 }
63329                         }
63331                         /* Add to the 2D features array */
63332                         if ( featureNode )
63333                         {
63334                                 var aanFeatures = oSettings.aanFeatures;
63336                                 if ( ! aanFeatures[cOption] )
63337                                 {
63338                                         aanFeatures[cOption] = [];
63339                                 }
63341                                 aanFeatures[cOption].push( featureNode );
63342                                 insert.append( featureNode );
63343                         }
63344                 }
63346                 /* Built our DOM structure - replace the holding div with what we want */
63347                 holding.replaceWith( insert );
63348                 oSettings.nHolding = null;
63349         }
63352         /**
63353          * Use the DOM source to create up an array of header cells. The idea here is to
63354          * create a layout grid (array) of rows x columns, which contains a reference
63355          * to the cell that that point in the grid (regardless of col/rowspan), such that
63356          * any column / row could be removed and the new grid constructed
63357          *  @param array {object} aLayout Array to store the calculated layout in
63358          *  @param {node} nThead The header/footer element for the table
63359          *  @memberof DataTable#oApi
63360          */
63361         function _fnDetectHeader ( aLayout, nThead )
63362         {
63363                 var nTrs = $(nThead).children('tr');
63364                 var nTr, nCell;
63365                 var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
63366                 var bUnique;
63367                 var fnShiftCol = function ( a, i, j ) {
63368                         var k = a[i];
63369                         while ( k[j] ) {
63370                                 j++;
63371                         }
63372                         return j;
63373                 };
63375                 aLayout.splice( 0, aLayout.length );
63377                 /* We know how many rows there are in the layout - so prep it */
63378                 for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
63379                 {
63380                         aLayout.push( [] );
63381                 }
63383                 /* Calculate a layout array */
63384                 for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
63385                 {
63386                         nTr = nTrs[i];
63387                         iColumn = 0;
63389                         /* For every cell in the row... */
63390                         nCell = nTr.firstChild;
63391                         while ( nCell ) {
63392                                 if ( nCell.nodeName.toUpperCase() == "TD" ||
63393                                      nCell.nodeName.toUpperCase() == "TH" )
63394                                 {
63395                                         /* Get the col and rowspan attributes from the DOM and sanitise them */
63396                                         iColspan = nCell.getAttribute('colspan') * 1;
63397                                         iRowspan = nCell.getAttribute('rowspan') * 1;
63398                                         iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
63399                                         iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
63401                                         /* There might be colspan cells already in this row, so shift our target
63402                                          * accordingly
63403                                          */
63404                                         iColShifted = fnShiftCol( aLayout, i, iColumn );
63406                                         /* Cache calculation for unique columns */
63407                                         bUnique = iColspan === 1 ? true : false;
63409                                         /* If there is col / rowspan, copy the information into the layout grid */
63410                                         for ( l=0 ; l<iColspan ; l++ )
63411                                         {
63412                                                 for ( k=0 ; k<iRowspan ; k++ )
63413                                                 {
63414                                                         aLayout[i+k][iColShifted+l] = {
63415                                                                 "cell": nCell,
63416                                                                 "unique": bUnique
63417                                                         };
63418                                                         aLayout[i+k].nTr = nTr;
63419                                                 }
63420                                         }
63421                                 }
63422                                 nCell = nCell.nextSibling;
63423                         }
63424                 }
63425         }
63428         /**
63429          * Get an array of unique th elements, one for each column
63430          *  @param {object} oSettings dataTables settings object
63431          *  @param {node} nHeader automatically detect the layout from this node - optional
63432          *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
63433          *  @returns array {node} aReturn list of unique th's
63434          *  @memberof DataTable#oApi
63435          */
63436         function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
63437         {
63438                 var aReturn = [];
63439                 if ( !aLayout )
63440                 {
63441                         aLayout = oSettings.aoHeader;
63442                         if ( nHeader )
63443                         {
63444                                 aLayout = [];
63445                                 _fnDetectHeader( aLayout, nHeader );
63446                         }
63447                 }
63449                 for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )
63450                 {
63451                         for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
63452                         {
63453                                 if ( aLayout[i][j].unique &&
63454                                          (!aReturn[j] || !oSettings.bSortCellsTop) )
63455                                 {
63456                                         aReturn[j] = aLayout[i][j].cell;
63457                                 }
63458                         }
63459                 }
63461                 return aReturn;
63462         }
63464         /**
63465          * Create an Ajax call based on the table's settings, taking into account that
63466          * parameters can have multiple forms, and backwards compatibility.
63467          *
63468          * @param {object} oSettings dataTables settings object
63469          * @param {array} data Data to send to the server, required by
63470          *     DataTables - may be augmented by developer callbacks
63471          * @param {function} fn Callback function to run when data is obtained
63472          */
63473         function _fnBuildAjax( oSettings, data, fn )
63474         {
63475                 // Compatibility with 1.9-, allow fnServerData and event to manipulate
63476                 _fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );
63478                 // Convert to object based for 1.10+ if using the old array scheme which can
63479                 // come from server-side processing or serverParams
63480                 if ( data && $.isArray(data) ) {
63481                         var tmp = {};
63482                         var rbracket = /(.*?)\[\]$/;
63484                         $.each( data, function (key, val) {
63485                                 var match = val.name.match(rbracket);
63487                                 if ( match ) {
63488                                         // Support for arrays
63489                                         var name = match[0];
63491                                         if ( ! tmp[ name ] ) {
63492                                                 tmp[ name ] = [];
63493                                         }
63494                                         tmp[ name ].push( val.value );
63495                                 }
63496                                 else {
63497                                         tmp[val.name] = val.value;
63498                                 }
63499                         } );
63500                         data = tmp;
63501                 }
63503                 var ajaxData;
63504                 var ajax = oSettings.ajax;
63505                 var instance = oSettings.oInstance;
63506                 var callback = function ( json ) {
63507                         _fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );
63508                         fn( json );
63509                 };
63511                 if ( $.isPlainObject( ajax ) && ajax.data )
63512                 {
63513                         ajaxData = ajax.data;
63515                         var newData = typeof ajaxData === 'function' ?
63516                                 ajaxData( data, oSettings ) :  // fn can manipulate data or return
63517                                 ajaxData;                      // an object object or array to merge
63519                         // If the function returned something, use that alone
63520                         data = typeof ajaxData === 'function' && newData ?
63521                                 newData :
63522                                 $.extend( true, data, newData );
63524                         // Remove the data property as we've resolved it already and don't want
63525                         // jQuery to do it again (it is restored at the end of the function)
63526                         delete ajax.data;
63527                 }
63529                 var baseAjax = {
63530                         "data": data,
63531                         "success": function (json) {
63532                                 var error = json.error || json.sError;
63533                                 if ( error ) {
63534                                         _fnLog( oSettings, 0, error );
63535                                 }
63537                                 oSettings.json = json;
63538                                 callback( json );
63539                         },
63540                         "dataType": "json",
63541                         "cache": false,
63542                         "type": oSettings.sServerMethod,
63543                         "error": function (xhr, error, thrown) {
63544                                 var ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );
63546                                 if ( $.inArray( true, ret ) === -1 ) {
63547                                         if ( error == "parsererror" ) {
63548                                                 _fnLog( oSettings, 0, 'Invalid JSON response', 1 );
63549                                         }
63550                                         else if ( xhr.readyState === 4 ) {
63551                                                 _fnLog( oSettings, 0, 'Ajax error', 7 );
63552                                         }
63553                                 }
63555                                 _fnProcessingDisplay( oSettings, false );
63556                         }
63557                 };
63559                 // Store the data submitted for the API
63560                 oSettings.oAjaxData = data;
63562                 // Allow plug-ins and external processes to modify the data
63563                 _fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );
63565                 if ( oSettings.fnServerData )
63566                 {
63567                         // DataTables 1.9- compatibility
63568                         oSettings.fnServerData.call( instance,
63569                                 oSettings.sAjaxSource,
63570                                 $.map( data, function (val, key) { // Need to convert back to 1.9 trad format
63571                                         return { name: key, value: val };
63572                                 } ),
63573                                 callback,
63574                                 oSettings
63575                         );
63576                 }
63577                 else if ( oSettings.sAjaxSource || typeof ajax === 'string' )
63578                 {
63579                         // DataTables 1.9- compatibility
63580                         oSettings.jqXHR = $.ajax( $.extend( baseAjax, {
63581                                 url: ajax || oSettings.sAjaxSource
63582                         } ) );
63583                 }
63584                 else if ( typeof ajax === 'function' )
63585                 {
63586                         // Is a function - let the caller define what needs to be done
63587                         oSettings.jqXHR = ajax.call( instance, data, callback, oSettings );
63588                 }
63589                 else
63590                 {
63591                         // Object to extend the base settings
63592                         oSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );
63594                         // Restore for next time around
63595                         ajax.data = ajaxData;
63596                 }
63597         }
63600         /**
63601          * Update the table using an Ajax call
63602          *  @param {object} settings dataTables settings object
63603          *  @returns {boolean} Block the table drawing or not
63604          *  @memberof DataTable#oApi
63605          */
63606         function _fnAjaxUpdate( settings )
63607         {
63608                 if ( settings.bAjaxDataGet ) {
63609                         settings.iDraw++;
63610                         _fnProcessingDisplay( settings, true );
63612                         _fnBuildAjax(
63613                                 settings,
63614                                 _fnAjaxParameters( settings ),
63615                                 function(json) {
63616                                         _fnAjaxUpdateDraw( settings, json );
63617                                 }
63618                         );
63620                         return false;
63621                 }
63622                 return true;
63623         }
63626         /**
63627          * Build up the parameters in an object needed for a server-side processing
63628          * request. Note that this is basically done twice, is different ways - a modern
63629          * method which is used by default in DataTables 1.10 which uses objects and
63630          * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if
63631          * the sAjaxSource option is used in the initialisation, or the legacyAjax
63632          * option is set.
63633          *  @param {object} oSettings dataTables settings object
63634          *  @returns {bool} block the table drawing or not
63635          *  @memberof DataTable#oApi
63636          */
63637         function _fnAjaxParameters( settings )
63638         {
63639                 var
63640                         columns = settings.aoColumns,
63641                         columnCount = columns.length,
63642                         features = settings.oFeatures,
63643                         preSearch = settings.oPreviousSearch,
63644                         preColSearch = settings.aoPreSearchCols,
63645                         i, data = [], dataProp, column, columnSearch,
63646                         sort = _fnSortFlatten( settings ),
63647                         displayStart = settings._iDisplayStart,
63648                         displayLength = features.bPaginate !== false ?
63649                                 settings._iDisplayLength :
63650                                 -1;
63652                 var param = function ( name, value ) {
63653                         data.push( { 'name': name, 'value': value } );
63654                 };
63656                 // DataTables 1.9- compatible method
63657                 param( 'sEcho',          settings.iDraw );
63658                 param( 'iColumns',       columnCount );
63659                 param( 'sColumns',       _pluck( columns, 'sName' ).join(',') );
63660                 param( 'iDisplayStart',  displayStart );
63661                 param( 'iDisplayLength', displayLength );
63663                 // DataTables 1.10+ method
63664                 var d = {
63665                         draw:    settings.iDraw,
63666                         columns: [],
63667                         order:   [],
63668                         start:   displayStart,
63669                         length:  displayLength,
63670                         search:  {
63671                                 value: preSearch.sSearch,
63672                                 regex: preSearch.bRegex
63673                         }
63674                 };
63676                 for ( i=0 ; i<columnCount ; i++ ) {
63677                         column = columns[i];
63678                         columnSearch = preColSearch[i];
63679                         dataProp = typeof column.mData=="function" ? 'function' : column.mData ;
63681                         d.columns.push( {
63682                                 data:       dataProp,
63683                                 name:       column.sName,
63684                                 searchable: column.bSearchable,
63685                                 orderable:  column.bSortable,
63686                                 search:     {
63687                                         value: columnSearch.sSearch,
63688                                         regex: columnSearch.bRegex
63689                                 }
63690                         } );
63692                         param( "mDataProp_"+i, dataProp );
63694                         if ( features.bFilter ) {
63695                                 param( 'sSearch_'+i,     columnSearch.sSearch );
63696                                 param( 'bRegex_'+i,      columnSearch.bRegex );
63697                                 param( 'bSearchable_'+i, column.bSearchable );
63698                         }
63700                         if ( features.bSort ) {
63701                                 param( 'bSortable_'+i, column.bSortable );
63702                         }
63703                 }
63705                 if ( features.bFilter ) {
63706                         param( 'sSearch', preSearch.sSearch );
63707                         param( 'bRegex', preSearch.bRegex );
63708                 }
63710                 if ( features.bSort ) {
63711                         $.each( sort, function ( i, val ) {
63712                                 d.order.push( { column: val.col, dir: val.dir } );
63714                                 param( 'iSortCol_'+i, val.col );
63715                                 param( 'sSortDir_'+i, val.dir );
63716                         } );
63718                         param( 'iSortingCols', sort.length );
63719                 }
63721                 // If the legacy.ajax parameter is null, then we automatically decide which
63722                 // form to use, based on sAjaxSource
63723                 var legacy = DataTable.ext.legacy.ajax;
63724                 if ( legacy === null ) {
63725                         return settings.sAjaxSource ? data : d;
63726                 }
63728                 // Otherwise, if legacy has been specified then we use that to decide on the
63729                 // form
63730                 return legacy ? data : d;
63731         }
63734         /**
63735          * Data the data from the server (nuking the old) and redraw the table
63736          *  @param {object} oSettings dataTables settings object
63737          *  @param {object} json json data return from the server.
63738          *  @param {string} json.sEcho Tracking flag for DataTables to match requests
63739          *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering
63740          *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering
63741          *  @param {array} json.aaData The data to display on this page
63742          *  @param {string} [json.sColumns] Column ordering (sName, comma separated)
63743          *  @memberof DataTable#oApi
63744          */
63745         function _fnAjaxUpdateDraw ( settings, json )
63746         {
63747                 // v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.
63748                 // Support both
63749                 var compat = function ( old, modern ) {
63750                         return json[old] !== undefined ? json[old] : json[modern];
63751                 };
63753                 var data = _fnAjaxDataSrc( settings, json );
63754                 var draw            = compat( 'sEcho',                'draw' );
63755                 var recordsTotal    = compat( 'iTotalRecords',        'recordsTotal' );
63756                 var recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );
63758                 if ( draw ) {
63759                         // Protect against out of sequence returns
63760                         if ( draw*1 < settings.iDraw ) {
63761                                 return;
63762                         }
63763                         settings.iDraw = draw * 1;
63764                 }
63766                 _fnClearTable( settings );
63767                 settings._iRecordsTotal   = parseInt(recordsTotal, 10);
63768                 settings._iRecordsDisplay = parseInt(recordsFiltered, 10);
63770                 for ( var i=0, ien=data.length ; i<ien ; i++ ) {
63771                         _fnAddData( settings, data[i] );
63772                 }
63773                 settings.aiDisplay = settings.aiDisplayMaster.slice();
63775                 settings.bAjaxDataGet = false;
63776                 _fnDraw( settings );
63778                 if ( ! settings._bInitComplete ) {
63779                         _fnInitComplete( settings, json );
63780                 }
63782                 settings.bAjaxDataGet = true;
63783                 _fnProcessingDisplay( settings, false );
63784         }
63787         /**
63788          * Get the data from the JSON data source to use for drawing a table. Using
63789          * `_fnGetObjectDataFn` allows the data to be sourced from a property of the
63790          * source object, or from a processing function.
63791          *  @param {object} oSettings dataTables settings object
63792          *  @param  {object} json Data source object / array from the server
63793          *  @return {array} Array of data to use
63794          */
63795         function _fnAjaxDataSrc ( oSettings, json )
63796         {
63797                 var dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?
63798                         oSettings.ajax.dataSrc :
63799                         oSettings.sAjaxDataProp; // Compatibility with 1.9-.
63801                 // Compatibility with 1.9-. In order to read from aaData, check if the
63802                 // default has been changed, if not, check for aaData
63803                 if ( dataSrc === 'data' ) {
63804                         return json.aaData || json[dataSrc];
63805                 }
63807                 return dataSrc !== "" ?
63808                         _fnGetObjectDataFn( dataSrc )( json ) :
63809                         json;
63810         }
63812         /**
63813          * Generate the node required for filtering text
63814          *  @returns {node} Filter control element
63815          *  @param {object} oSettings dataTables settings object
63816          *  @memberof DataTable#oApi
63817          */
63818         function _fnFeatureHtmlFilter ( settings )
63819         {
63820                 var classes = settings.oClasses;
63821                 var tableId = settings.sTableId;
63822                 var language = settings.oLanguage;
63823                 var previousSearch = settings.oPreviousSearch;
63824                 var features = settings.aanFeatures;
63825                 var input = '<input type="search" class="'+classes.sFilterInput+'"/>';
63827                 var str = language.sSearch;
63828                 str = str.match(/_INPUT_/) ?
63829                         str.replace('_INPUT_', input) :
63830                         str+input;
63832                 var filter = $('<div/>', {
63833                                 'id': ! features.f ? tableId+'_filter' : null,
63834                                 'class': classes.sFilter
63835                         } )
63836                         .append( $('<label/>' ).append( str ) );
63838                 var searchFn = function() {
63839                         /* Update all other filter input elements for the new display */
63840                         var n = features.f;
63841                         var val = !this.value ? "" : this.value; // mental IE8 fix :-(
63843                         /* Now do the filter */
63844                         if ( val != previousSearch.sSearch ) {
63845                                 _fnFilterComplete( settings, {
63846                                         "sSearch": val,
63847                                         "bRegex": previousSearch.bRegex,
63848                                         "bSmart": previousSearch.bSmart ,
63849                                         "bCaseInsensitive": previousSearch.bCaseInsensitive
63850                                 } );
63852                                 // Need to redraw, without resorting
63853                                 settings._iDisplayStart = 0;
63854                                 _fnDraw( settings );
63855                         }
63856                 };
63858                 var searchDelay = settings.searchDelay !== null ?
63859                         settings.searchDelay :
63860                         _fnDataSource( settings ) === 'ssp' ?
63861                                 400 :
63862                                 0;
63864                 var jqFilter = $('input', filter)
63865                         .val( previousSearch.sSearch )
63866                         .attr( 'placeholder', language.sSearchPlaceholder )
63867                         .on(
63868                                 'keyup.DT search.DT input.DT paste.DT cut.DT',
63869                                 searchDelay ?
63870                                         _fnThrottle( searchFn, searchDelay ) :
63871                                         searchFn
63872                         )
63873                         .on( 'keypress.DT', function(e) {
63874                                 /* Prevent form submission */
63875                                 if ( e.keyCode == 13 ) {
63876                                         return false;
63877                                 }
63878                         } )
63879                         .attr('aria-controls', tableId);
63881                 // Update the input elements whenever the table is filtered
63882                 $(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {
63883                         if ( settings === s ) {
63884                                 // IE9 throws an 'unknown error' if document.activeElement is used
63885                                 // inside an iframe or frame...
63886                                 try {
63887                                         if ( jqFilter[0] !== document.activeElement ) {
63888                                                 jqFilter.val( previousSearch.sSearch );
63889                                         }
63890                                 }
63891                                 catch ( e ) {}
63892                         }
63893                 } );
63895                 return filter[0];
63896         }
63899         /**
63900          * Filter the table using both the global filter and column based filtering
63901          *  @param {object} oSettings dataTables settings object
63902          *  @param {object} oSearch search information
63903          *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
63904          *  @memberof DataTable#oApi
63905          */
63906         function _fnFilterComplete ( oSettings, oInput, iForce )
63907         {
63908                 var oPrevSearch = oSettings.oPreviousSearch;
63909                 var aoPrevSearch = oSettings.aoPreSearchCols;
63910                 var fnSaveFilter = function ( oFilter ) {
63911                         /* Save the filtering values */
63912                         oPrevSearch.sSearch = oFilter.sSearch;
63913                         oPrevSearch.bRegex = oFilter.bRegex;
63914                         oPrevSearch.bSmart = oFilter.bSmart;
63915                         oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
63916                 };
63917                 var fnRegex = function ( o ) {
63918                         // Backwards compatibility with the bEscapeRegex option
63919                         return o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;
63920                 };
63922                 // Resolve any column types that are unknown due to addition or invalidation
63923                 // @todo As per sort - can this be moved into an event handler?
63924                 _fnColumnTypes( oSettings );
63926                 /* In server-side processing all filtering is done by the server, so no point hanging around here */
63927                 if ( _fnDataSource( oSettings ) != 'ssp' )
63928                 {
63929                         /* Global filter */
63930                         _fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive );
63931                         fnSaveFilter( oInput );
63933                         /* Now do the individual column filter */
63934                         for ( var i=0 ; i<aoPrevSearch.length ; i++ )
63935                         {
63936                                 _fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),
63937                                         aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );
63938                         }
63940                         /* Custom filtering */
63941                         _fnFilterCustom( oSettings );
63942                 }
63943                 else
63944                 {
63945                         fnSaveFilter( oInput );
63946                 }
63948                 /* Tell the draw function we have been filtering */
63949                 oSettings.bFiltered = true;
63950                 _fnCallbackFire( oSettings, null, 'search', [oSettings] );
63951         }
63954         /**
63955          * Apply custom filtering functions
63956          *  @param {object} oSettings dataTables settings object
63957          *  @memberof DataTable#oApi
63958          */
63959         function _fnFilterCustom( settings )
63960         {
63961                 var filters = DataTable.ext.search;
63962                 var displayRows = settings.aiDisplay;
63963                 var row, rowIdx;
63965                 for ( var i=0, ien=filters.length ; i<ien ; i++ ) {
63966                         var rows = [];
63968                         // Loop over each row and see if it should be included
63969                         for ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {
63970                                 rowIdx = displayRows[ j ];
63971                                 row = settings.aoData[ rowIdx ];
63973                                 if ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {
63974                                         rows.push( rowIdx );
63975                                 }
63976                         }
63978                         // So the array reference doesn't break set the results into the
63979                         // existing array
63980                         displayRows.length = 0;
63981                         $.merge( displayRows, rows );
63982                 }
63983         }
63986         /**
63987          * Filter the table on a per-column basis
63988          *  @param {object} oSettings dataTables settings object
63989          *  @param {string} sInput string to filter on
63990          *  @param {int} iColumn column to filter
63991          *  @param {bool} bRegex treat search string as a regular expression or not
63992          *  @param {bool} bSmart use smart filtering or not
63993          *  @param {bool} bCaseInsensitive Do case insenstive matching or not
63994          *  @memberof DataTable#oApi
63995          */
63996         function _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )
63997         {
63998                 if ( searchStr === '' ) {
63999                         return;
64000                 }
64002                 var data;
64003                 var out = [];
64004                 var display = settings.aiDisplay;
64005                 var rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );
64007                 for ( var i=0 ; i<display.length ; i++ ) {
64008                         data = settings.aoData[ display[i] ]._aFilterData[ colIdx ];
64010                         if ( rpSearch.test( data ) ) {
64011                                 out.push( display[i] );
64012                         }
64013                 }
64015                 settings.aiDisplay = out;
64016         }
64019         /**
64020          * Filter the data table based on user input and draw the table
64021          *  @param {object} settings dataTables settings object
64022          *  @param {string} input string to filter on
64023          *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)
64024          *  @param {bool} regex treat as a regular expression or not
64025          *  @param {bool} smart perform smart filtering or not
64026          *  @param {bool} caseInsensitive Do case insenstive matching or not
64027          *  @memberof DataTable#oApi
64028          */
64029         function _fnFilter( settings, input, force, regex, smart, caseInsensitive )
64030         {
64031                 var rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );
64032                 var prevSearch = settings.oPreviousSearch.sSearch;
64033                 var displayMaster = settings.aiDisplayMaster;
64034                 var display, invalidated, i;
64035                 var filtered = [];
64037                 // Need to take account of custom filtering functions - always filter
64038                 if ( DataTable.ext.search.length !== 0 ) {
64039                         force = true;
64040                 }
64042                 // Check if any of the rows were invalidated
64043                 invalidated = _fnFilterData( settings );
64045                 // If the input is blank - we just want the full data set
64046                 if ( input.length <= 0 ) {
64047                         settings.aiDisplay = displayMaster.slice();
64048                 }
64049                 else {
64050                         // New search - start from the master array
64051                         if ( invalidated ||
64052                                  force ||
64053                                  prevSearch.length > input.length ||
64054                                  input.indexOf(prevSearch) !== 0 ||
64055                                  settings.bSorted // On resort, the display master needs to be
64056                                                   // re-filtered since indexes will have changed
64057                         ) {
64058                                 settings.aiDisplay = displayMaster.slice();
64059                         }
64061                         // Search the display array
64062                         display = settings.aiDisplay;
64064                         for ( i=0 ; i<display.length ; i++ ) {
64065                                 if ( rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {
64066                                         filtered.push( display[i] );
64067                                 }
64068                         }
64070                         settings.aiDisplay = filtered;
64071                 }
64072         }
64075         /**
64076          * Build a regular expression object suitable for searching a table
64077          *  @param {string} sSearch string to search for
64078          *  @param {bool} bRegex treat as a regular expression or not
64079          *  @param {bool} bSmart perform smart filtering or not
64080          *  @param {bool} bCaseInsensitive Do case insensitive matching or not
64081          *  @returns {RegExp} constructed object
64082          *  @memberof DataTable#oApi
64083          */
64084         function _fnFilterCreateSearch( search, regex, smart, caseInsensitive )
64085         {
64086                 search = regex ?
64087                         search :
64088                         _fnEscapeRegex( search );
64090                 if ( smart ) {
64091                         /* For smart filtering we want to allow the search to work regardless of
64092                          * word order. We also want double quoted text to be preserved, so word
64093                          * order is important - a la google. So this is what we want to
64094                          * generate:
64095                          *
64096                          * ^(?=.*?\bone\b)(?=.*?\btwo three\b)(?=.*?\bfour\b).*$
64097                          */
64098                         var a = $.map( search.match( /"[^"]+"|[^ ]+/g ) || [''], function ( word ) {
64099                                 if ( word.charAt(0) === '"' ) {
64100                                         var m = word.match( /^"(.*)"$/ );
64101                                         word = m ? m[1] : word;
64102                                 }
64104                                 return word.replace('"', '');
64105                         } );
64107                         search = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';
64108                 }
64110                 return new RegExp( search, caseInsensitive ? 'i' : '' );
64111         }
64114         /**
64115          * Escape a string such that it can be used in a regular expression
64116          *  @param {string} sVal string to escape
64117          *  @returns {string} escaped string
64118          *  @memberof DataTable#oApi
64119          */
64120         var _fnEscapeRegex = DataTable.util.escapeRegex;
64122         var __filter_div = $('<div>')[0];
64123         var __filter_div_textContent = __filter_div.textContent !== undefined;
64125         // Update the filtering data for each row if needed (by invalidation or first run)
64126         function _fnFilterData ( settings )
64127         {
64128                 var columns = settings.aoColumns;
64129                 var column;
64130                 var i, j, ien, jen, filterData, cellData, row;
64131                 var fomatters = DataTable.ext.type.search;
64132                 var wasInvalidated = false;
64134                 for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
64135                         row = settings.aoData[i];
64137                         if ( ! row._aFilterData ) {
64138                                 filterData = [];
64140                                 for ( j=0, jen=columns.length ; j<jen ; j++ ) {
64141                                         column = columns[j];
64143                                         if ( column.bSearchable ) {
64144                                                 cellData = _fnGetCellData( settings, i, j, 'filter' );
64146                                                 if ( fomatters[ column.sType ] ) {
64147                                                         cellData = fomatters[ column.sType ]( cellData );
64148                                                 }
64150                                                 // Search in DataTables 1.10 is string based. In 1.11 this
64151                                                 // should be altered to also allow strict type checking.
64152                                                 if ( cellData === null ) {
64153                                                         cellData = '';
64154                                                 }
64156                                                 if ( typeof cellData !== 'string' && cellData.toString ) {
64157                                                         cellData = cellData.toString();
64158                                                 }
64159                                         }
64160                                         else {
64161                                                 cellData = '';
64162                                         }
64164                                         // If it looks like there is an HTML entity in the string,
64165                                         // attempt to decode it so sorting works as expected. Note that
64166                                         // we could use a single line of jQuery to do this, but the DOM
64167                                         // method used here is much faster http://jsperf.com/html-decode
64168                                         if ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {
64169                                                 __filter_div.innerHTML = cellData;
64170                                                 cellData = __filter_div_textContent ?
64171                                                         __filter_div.textContent :
64172                                                         __filter_div.innerText;
64173                                         }
64175                                         if ( cellData.replace ) {
64176                                                 cellData = cellData.replace(/[\r\n]/g, '');
64177                                         }
64179                                         filterData.push( cellData );
64180                                 }
64182                                 row._aFilterData = filterData;
64183                                 row._sFilterRow = filterData.join('  ');
64184                                 wasInvalidated = true;
64185                         }
64186                 }
64188                 return wasInvalidated;
64189         }
64192         /**
64193          * Convert from the internal Hungarian notation to camelCase for external
64194          * interaction
64195          *  @param {object} obj Object to convert
64196          *  @returns {object} Inverted object
64197          *  @memberof DataTable#oApi
64198          */
64199         function _fnSearchToCamel ( obj )
64200         {
64201                 return {
64202                         search:          obj.sSearch,
64203                         smart:           obj.bSmart,
64204                         regex:           obj.bRegex,
64205                         caseInsensitive: obj.bCaseInsensitive
64206                 };
64207         }
64211         /**
64212          * Convert from camelCase notation to the internal Hungarian. We could use the
64213          * Hungarian convert function here, but this is cleaner
64214          *  @param {object} obj Object to convert
64215          *  @returns {object} Inverted object
64216          *  @memberof DataTable#oApi
64217          */
64218         function _fnSearchToHung ( obj )
64219         {
64220                 return {
64221                         sSearch:          obj.search,
64222                         bSmart:           obj.smart,
64223                         bRegex:           obj.regex,
64224                         bCaseInsensitive: obj.caseInsensitive
64225                 };
64226         }
64228         /**
64229          * Generate the node required for the info display
64230          *  @param {object} oSettings dataTables settings object
64231          *  @returns {node} Information element
64232          *  @memberof DataTable#oApi
64233          */
64234         function _fnFeatureHtmlInfo ( settings )
64235         {
64236                 var
64237                         tid = settings.sTableId,
64238                         nodes = settings.aanFeatures.i,
64239                         n = $('<div/>', {
64240                                 'class': settings.oClasses.sInfo,
64241                                 'id': ! nodes ? tid+'_info' : null
64242                         } );
64244                 if ( ! nodes ) {
64245                         // Update display on each draw
64246                         settings.aoDrawCallback.push( {
64247                                 "fn": _fnUpdateInfo,
64248                                 "sName": "information"
64249                         } );
64251                         n
64252                                 .attr( 'role', 'status' )
64253                                 .attr( 'aria-live', 'polite' );
64255                         // Table is described by our info div
64256                         $(settings.nTable).attr( 'aria-describedby', tid+'_info' );
64257                 }
64259                 return n[0];
64260         }
64263         /**
64264          * Update the information elements in the display
64265          *  @param {object} settings dataTables settings object
64266          *  @memberof DataTable#oApi
64267          */
64268         function _fnUpdateInfo ( settings )
64269         {
64270                 /* Show information about the table */
64271                 var nodes = settings.aanFeatures.i;
64272                 if ( nodes.length === 0 ) {
64273                         return;
64274                 }
64276                 var
64277                         lang  = settings.oLanguage,
64278                         start = settings._iDisplayStart+1,
64279                         end   = settings.fnDisplayEnd(),
64280                         max   = settings.fnRecordsTotal(),
64281                         total = settings.fnRecordsDisplay(),
64282                         out   = total ?
64283                                 lang.sInfo :
64284                                 lang.sInfoEmpty;
64286                 if ( total !== max ) {
64287                         /* Record set after filtering */
64288                         out += ' ' + lang.sInfoFiltered;
64289                 }
64291                 // Convert the macros
64292                 out += lang.sInfoPostFix;
64293                 out = _fnInfoMacros( settings, out );
64295                 var callback = lang.fnInfoCallback;
64296                 if ( callback !== null ) {
64297                         out = callback.call( settings.oInstance,
64298                                 settings, start, end, max, total, out
64299                         );
64300                 }
64302                 $(nodes).html( out );
64303         }
64306         function _fnInfoMacros ( settings, str )
64307         {
64308                 // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
64309                 // internally
64310                 var
64311                         formatter  = settings.fnFormatNumber,
64312                         start      = settings._iDisplayStart+1,
64313                         len        = settings._iDisplayLength,
64314                         vis        = settings.fnRecordsDisplay(),
64315                         all        = len === -1;
64317                 return str.
64318                         replace(/_START_/g, formatter.call( settings, start ) ).
64319                         replace(/_END_/g,   formatter.call( settings, settings.fnDisplayEnd() ) ).
64320                         replace(/_MAX_/g,   formatter.call( settings, settings.fnRecordsTotal() ) ).
64321                         replace(/_TOTAL_/g, formatter.call( settings, vis ) ).
64322                         replace(/_PAGE_/g,  formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).
64323                         replace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );
64324         }
64328         /**
64329          * Draw the table for the first time, adding all required features
64330          *  @param {object} settings dataTables settings object
64331          *  @memberof DataTable#oApi
64332          */
64333         function _fnInitialise ( settings )
64334         {
64335                 var i, iLen, iAjaxStart=settings.iInitDisplayStart;
64336                 var columns = settings.aoColumns, column;
64337                 var features = settings.oFeatures;
64338                 var deferLoading = settings.bDeferLoading; // value modified by the draw
64340                 /* Ensure that the table data is fully initialised */
64341                 if ( ! settings.bInitialised ) {
64342                         setTimeout( function(){ _fnInitialise( settings ); }, 200 );
64343                         return;
64344                 }
64346                 /* Show the display HTML options */
64347                 _fnAddOptionsHtml( settings );
64349                 /* Build and draw the header / footer for the table */
64350                 _fnBuildHead( settings );
64351                 _fnDrawHead( settings, settings.aoHeader );
64352                 _fnDrawHead( settings, settings.aoFooter );
64354                 /* Okay to show that something is going on now */
64355                 _fnProcessingDisplay( settings, true );
64357                 /* Calculate sizes for columns */
64358                 if ( features.bAutoWidth ) {
64359                         _fnCalculateColumnWidths( settings );
64360                 }
64362                 for ( i=0, iLen=columns.length ; i<iLen ; i++ ) {
64363                         column = columns[i];
64365                         if ( column.sWidth ) {
64366                                 column.nTh.style.width = _fnStringToCss( column.sWidth );
64367                         }
64368                 }
64370                 _fnCallbackFire( settings, null, 'preInit', [settings] );
64372                 // If there is default sorting required - let's do it. The sort function
64373                 // will do the drawing for us. Otherwise we draw the table regardless of the
64374                 // Ajax source - this allows the table to look initialised for Ajax sourcing
64375                 // data (show 'loading' message possibly)
64376                 _fnReDraw( settings );
64378                 // Server-side processing init complete is done by _fnAjaxUpdateDraw
64379                 var dataSrc = _fnDataSource( settings );
64380                 if ( dataSrc != 'ssp' || deferLoading ) {
64381                         // if there is an ajax source load the data
64382                         if ( dataSrc == 'ajax' ) {
64383                                 _fnBuildAjax( settings, [], function(json) {
64384                                         var aData = _fnAjaxDataSrc( settings, json );
64386                                         // Got the data - add it to the table
64387                                         for ( i=0 ; i<aData.length ; i++ ) {
64388                                                 _fnAddData( settings, aData[i] );
64389                                         }
64391                                         // Reset the init display for cookie saving. We've already done
64392                                         // a filter, and therefore cleared it before. So we need to make
64393                                         // it appear 'fresh'
64394                                         settings.iInitDisplayStart = iAjaxStart;
64396                                         _fnReDraw( settings );
64398                                         _fnProcessingDisplay( settings, false );
64399                                         _fnInitComplete( settings, json );
64400                                 }, settings );
64401                         }
64402                         else {
64403                                 _fnProcessingDisplay( settings, false );
64404                                 _fnInitComplete( settings );
64405                         }
64406                 }
64407         }
64410         /**
64411          * Draw the table for the first time, adding all required features
64412          *  @param {object} oSettings dataTables settings object
64413          *  @param {object} [json] JSON from the server that completed the table, if using Ajax source
64414          *    with client-side processing (optional)
64415          *  @memberof DataTable#oApi
64416          */
64417         function _fnInitComplete ( settings, json )
64418         {
64419                 settings._bInitComplete = true;
64421                 // When data was added after the initialisation (data or Ajax) we need to
64422                 // calculate the column sizing
64423                 if ( json || settings.oInit.aaData ) {
64424                         _fnAdjustColumnSizing( settings );
64425                 }
64427                 _fnCallbackFire( settings, null, 'plugin-init', [settings, json] );
64428                 _fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );
64429         }
64432         function _fnLengthChange ( settings, val )
64433         {
64434                 var len = parseInt( val, 10 );
64435                 settings._iDisplayLength = len;
64437                 _fnLengthOverflow( settings );
64439                 // Fire length change event
64440                 _fnCallbackFire( settings, null, 'length', [settings, len] );
64441         }
64444         /**
64445          * Generate the node required for user display length changing
64446          *  @param {object} settings dataTables settings object
64447          *  @returns {node} Display length feature node
64448          *  @memberof DataTable#oApi
64449          */
64450         function _fnFeatureHtmlLength ( settings )
64451         {
64452                 var
64453                         classes  = settings.oClasses,
64454                         tableId  = settings.sTableId,
64455                         menu     = settings.aLengthMenu,
64456                         d2       = $.isArray( menu[0] ),
64457                         lengths  = d2 ? menu[0] : menu,
64458                         language = d2 ? menu[1] : menu;
64460                 var select = $('<select/>', {
64461                         'name':          tableId+'_length',
64462                         'aria-controls': tableId,
64463                         'class':         classes.sLengthSelect
64464                 } );
64466                 for ( var i=0, ien=lengths.length ; i<ien ; i++ ) {
64467                         select[0][ i ] = new Option(
64468                                 typeof language[i] === 'number' ?
64469                                         settings.fnFormatNumber( language[i] ) :
64470                                         language[i],
64471                                 lengths[i]
64472                         );
64473                 }
64475                 var div = $('<div><label/></div>').addClass( classes.sLength );
64476                 if ( ! settings.aanFeatures.l ) {
64477                         div[0].id = tableId+'_length';
64478                 }
64480                 div.children().append(
64481                         settings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )
64482                 );
64484                 // Can't use `select` variable as user might provide their own and the
64485                 // reference is broken by the use of outerHTML
64486                 $('select', div)
64487                         .val( settings._iDisplayLength )
64488                         .on( 'change.DT', function(e) {
64489                                 _fnLengthChange( settings, $(this).val() );
64490                                 _fnDraw( settings );
64491                         } );
64493                 // Update node value whenever anything changes the table's length
64494                 $(settings.nTable).on( 'length.dt.DT', function (e, s, len) {
64495                         if ( settings === s ) {
64496                                 $('select', div).val( len );
64497                         }
64498                 } );
64500                 return div[0];
64501         }
64505         /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
64506          * Note that most of the paging logic is done in
64507          * DataTable.ext.pager
64508          */
64510         /**
64511          * Generate the node required for default pagination
64512          *  @param {object} oSettings dataTables settings object
64513          *  @returns {node} Pagination feature node
64514          *  @memberof DataTable#oApi
64515          */
64516         function _fnFeatureHtmlPaginate ( settings )
64517         {
64518                 var
64519                         type   = settings.sPaginationType,
64520                         plugin = DataTable.ext.pager[ type ],
64521                         modern = typeof plugin === 'function',
64522                         redraw = function( settings ) {
64523                                 _fnDraw( settings );
64524                         },
64525                         node = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],
64526                         features = settings.aanFeatures;
64528                 if ( ! modern ) {
64529                         plugin.fnInit( settings, node, redraw );
64530                 }
64532                 /* Add a draw callback for the pagination on first instance, to update the paging display */
64533                 if ( ! features.p )
64534                 {
64535                         node.id = settings.sTableId+'_paginate';
64537                         settings.aoDrawCallback.push( {
64538                                 "fn": function( settings ) {
64539                                         if ( modern ) {
64540                                                 var
64541                                                         start      = settings._iDisplayStart,
64542                                                         len        = settings._iDisplayLength,
64543                                                         visRecords = settings.fnRecordsDisplay(),
64544                                                         all        = len === -1,
64545                                                         page = all ? 0 : Math.ceil( start / len ),
64546                                                         pages = all ? 1 : Math.ceil( visRecords / len ),
64547                                                         buttons = plugin(page, pages),
64548                                                         i, ien;
64550                                                 for ( i=0, ien=features.p.length ; i<ien ; i++ ) {
64551                                                         _fnRenderer( settings, 'pageButton' )(
64552                                                                 settings, features.p[i], i, buttons, page, pages
64553                                                         );
64554                                                 }
64555                                         }
64556                                         else {
64557                                                 plugin.fnUpdate( settings, redraw );
64558                                         }
64559                                 },
64560                                 "sName": "pagination"
64561                         } );
64562                 }
64564                 return node;
64565         }
64568         /**
64569          * Alter the display settings to change the page
64570          *  @param {object} settings DataTables settings object
64571          *  @param {string|int} action Paging action to take: "first", "previous",
64572          *    "next" or "last" or page number to jump to (integer)
64573          *  @param [bool] redraw Automatically draw the update or not
64574          *  @returns {bool} true page has changed, false - no change
64575          *  @memberof DataTable#oApi
64576          */
64577         function _fnPageChange ( settings, action, redraw )
64578         {
64579                 var
64580                         start     = settings._iDisplayStart,
64581                         len       = settings._iDisplayLength,
64582                         records   = settings.fnRecordsDisplay();
64584                 if ( records === 0 || len === -1 )
64585                 {
64586                         start = 0;
64587                 }
64588                 else if ( typeof action === "number" )
64589                 {
64590                         start = action * len;
64592                         if ( start > records )
64593                         {
64594                                 start = 0;
64595                         }
64596                 }
64597                 else if ( action == "first" )
64598                 {
64599                         start = 0;
64600                 }
64601                 else if ( action == "previous" )
64602                 {
64603                         start = len >= 0 ?
64604                                 start - len :
64605                                 0;
64607                         if ( start < 0 )
64608                         {
64609                           start = 0;
64610                         }
64611                 }
64612                 else if ( action == "next" )
64613                 {
64614                         if ( start + len < records )
64615                         {
64616                                 start += len;
64617                         }
64618                 }
64619                 else if ( action == "last" )
64620                 {
64621                         start = Math.floor( (records-1) / len) * len;
64622                 }
64623                 else
64624                 {
64625                         _fnLog( settings, 0, "Unknown paging action: "+action, 5 );
64626                 }
64628                 var changed = settings._iDisplayStart !== start;
64629                 settings._iDisplayStart = start;
64631                 if ( changed ) {
64632                         _fnCallbackFire( settings, null, 'page', [settings] );
64634                         if ( redraw ) {
64635                                 _fnDraw( settings );
64636                         }
64637                 }
64639                 return changed;
64640         }
64644         /**
64645          * Generate the node required for the processing node
64646          *  @param {object} settings dataTables settings object
64647          *  @returns {node} Processing element
64648          *  @memberof DataTable#oApi
64649          */
64650         function _fnFeatureHtmlProcessing ( settings )
64651         {
64652                 return $('<div/>', {
64653                                 'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,
64654                                 'class': settings.oClasses.sProcessing
64655                         } )
64656                         .html( settings.oLanguage.sProcessing )
64657                         .insertBefore( settings.nTable )[0];
64658         }
64661         /**
64662          * Display or hide the processing indicator
64663          *  @param {object} settings dataTables settings object
64664          *  @param {bool} show Show the processing indicator (true) or not (false)
64665          *  @memberof DataTable#oApi
64666          */
64667         function _fnProcessingDisplay ( settings, show )
64668         {
64669                 if ( settings.oFeatures.bProcessing ) {
64670                         $(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );
64671                 }
64673                 _fnCallbackFire( settings, null, 'processing', [settings, show] );
64674         }
64676         /**
64677          * Add any control elements for the table - specifically scrolling
64678          *  @param {object} settings dataTables settings object
64679          *  @returns {node} Node to add to the DOM
64680          *  @memberof DataTable#oApi
64681          */
64682         function _fnFeatureHtmlTable ( settings )
64683         {
64684                 var table = $(settings.nTable);
64686                 // Add the ARIA grid role to the table
64687                 table.attr( 'role', 'grid' );
64689                 // Scrolling from here on in
64690                 var scroll = settings.oScroll;
64692                 if ( scroll.sX === '' && scroll.sY === '' ) {
64693                         return settings.nTable;
64694                 }
64696                 var scrollX = scroll.sX;
64697                 var scrollY = scroll.sY;
64698                 var classes = settings.oClasses;
64699                 var caption = table.children('caption');
64700                 var captionSide = caption.length ? caption[0]._captionSide : null;
64701                 var headerClone = $( table[0].cloneNode(false) );
64702                 var footerClone = $( table[0].cloneNode(false) );
64703                 var footer = table.children('tfoot');
64704                 var _div = '<div/>';
64705                 var size = function ( s ) {
64706                         return !s ? null : _fnStringToCss( s );
64707                 };
64709                 if ( ! footer.length ) {
64710                         footer = null;
64711                 }
64713                 /*
64714                  * The HTML structure that we want to generate in this function is:
64715                  *  div - scroller
64716                  *    div - scroll head
64717                  *      div - scroll head inner
64718                  *        table - scroll head table
64719                  *          thead - thead
64720                  *    div - scroll body
64721                  *      table - table (master table)
64722                  *        thead - thead clone for sizing
64723                  *        tbody - tbody
64724                  *    div - scroll foot
64725                  *      div - scroll foot inner
64726                  *        table - scroll foot table
64727                  *          tfoot - tfoot
64728                  */
64729                 var scroller = $( _div, { 'class': classes.sScrollWrapper } )
64730                         .append(
64731                                 $(_div, { 'class': classes.sScrollHead } )
64732                                         .css( {
64733                                                 overflow: 'hidden',
64734                                                 position: 'relative',
64735                                                 border: 0,
64736                                                 width: scrollX ? size(scrollX) : '100%'
64737                                         } )
64738                                         .append(
64739                                                 $(_div, { 'class': classes.sScrollHeadInner } )
64740                                                         .css( {
64741                                                                 'box-sizing': 'content-box',
64742                                                                 width: scroll.sXInner || '100%'
64743                                                         } )
64744                                                         .append(
64745                                                                 headerClone
64746                                                                         .removeAttr('id')
64747                                                                         .css( 'margin-left', 0 )
64748                                                                         .append( captionSide === 'top' ? caption : null )
64749                                                                         .append(
64750                                                                                 table.children('thead')
64751                                                                         )
64752                                                         )
64753                                         )
64754                         )
64755                         .append(
64756                                 $(_div, { 'class': classes.sScrollBody } )
64757                                         .css( {
64758                                                 position: 'relative',
64759                                                 overflow: 'auto',
64760                                                 width: size( scrollX )
64761                                         } )
64762                                         .append( table )
64763                         );
64765                 if ( footer ) {
64766                         scroller.append(
64767                                 $(_div, { 'class': classes.sScrollFoot } )
64768                                         .css( {
64769                                                 overflow: 'hidden',
64770                                                 border: 0,
64771                                                 width: scrollX ? size(scrollX) : '100%'
64772                                         } )
64773                                         .append(
64774                                                 $(_div, { 'class': classes.sScrollFootInner } )
64775                                                         .append(
64776                                                                 footerClone
64777                                                                         .removeAttr('id')
64778                                                                         .css( 'margin-left', 0 )
64779                                                                         .append( captionSide === 'bottom' ? caption : null )
64780                                                                         .append(
64781                                                                                 table.children('tfoot')
64782                                                                         )
64783                                                         )
64784                                         )
64785                         );
64786                 }
64788                 var children = scroller.children();
64789                 var scrollHead = children[0];
64790                 var scrollBody = children[1];
64791                 var scrollFoot = footer ? children[2] : null;
64793                 // When the body is scrolled, then we also want to scroll the headers
64794                 if ( scrollX ) {
64795                         $(scrollBody).on( 'scroll.DT', function (e) {
64796                                 var scrollLeft = this.scrollLeft;
64798                                 scrollHead.scrollLeft = scrollLeft;
64800                                 if ( footer ) {
64801                                         scrollFoot.scrollLeft = scrollLeft;
64802                                 }
64803                         } );
64804                 }
64806                 $(scrollBody).css(
64807                         scrollY && scroll.bCollapse ? 'max-height' : 'height',
64808                         scrollY
64809                 );
64811                 settings.nScrollHead = scrollHead;
64812                 settings.nScrollBody = scrollBody;
64813                 settings.nScrollFoot = scrollFoot;
64815                 // On redraw - align columns
64816                 settings.aoDrawCallback.push( {
64817                         "fn": _fnScrollDraw,
64818                         "sName": "scrolling"
64819                 } );
64821                 return scroller[0];
64822         }
64826         /**
64827          * Update the header, footer and body tables for resizing - i.e. column
64828          * alignment.
64829          *
64830          * Welcome to the most horrible function DataTables. The process that this
64831          * function follows is basically:
64832          *   1. Re-create the table inside the scrolling div
64833          *   2. Take live measurements from the DOM
64834          *   3. Apply the measurements to align the columns
64835          *   4. Clean up
64836          *
64837          *  @param {object} settings dataTables settings object
64838          *  @memberof DataTable#oApi
64839          */
64840         function _fnScrollDraw ( settings )
64841         {
64842                 // Given that this is such a monster function, a lot of variables are use
64843                 // to try and keep the minimised size as small as possible
64844                 var
64845                         scroll         = settings.oScroll,
64846                         scrollX        = scroll.sX,
64847                         scrollXInner   = scroll.sXInner,
64848                         scrollY        = scroll.sY,
64849                         barWidth       = scroll.iBarWidth,
64850                         divHeader      = $(settings.nScrollHead),
64851                         divHeaderStyle = divHeader[0].style,
64852                         divHeaderInner = divHeader.children('div'),
64853                         divHeaderInnerStyle = divHeaderInner[0].style,
64854                         divHeaderTable = divHeaderInner.children('table'),
64855                         divBodyEl      = settings.nScrollBody,
64856                         divBody        = $(divBodyEl),
64857                         divBodyStyle   = divBodyEl.style,
64858                         divFooter      = $(settings.nScrollFoot),
64859                         divFooterInner = divFooter.children('div'),
64860                         divFooterTable = divFooterInner.children('table'),
64861                         header         = $(settings.nTHead),
64862                         table          = $(settings.nTable),
64863                         tableEl        = table[0],
64864                         tableStyle     = tableEl.style,
64865                         footer         = settings.nTFoot ? $(settings.nTFoot) : null,
64866                         browser        = settings.oBrowser,
64867                         ie67           = browser.bScrollOversize,
64868                         dtHeaderCells  = _pluck( settings.aoColumns, 'nTh' ),
64869                         headerTrgEls, footerTrgEls,
64870                         headerSrcEls, footerSrcEls,
64871                         headerCopy, footerCopy,
64872                         headerWidths=[], footerWidths=[],
64873                         headerContent=[], footerContent=[],
64874                         idx, correction, sanityWidth,
64875                         zeroOut = function(nSizer) {
64876                                 var style = nSizer.style;
64877                                 style.paddingTop = "0";
64878                                 style.paddingBottom = "0";
64879                                 style.borderTopWidth = "0";
64880                                 style.borderBottomWidth = "0";
64881                                 style.height = 0;
64882                         };
64884                 // If the scrollbar visibility has changed from the last draw, we need to
64885                 // adjust the column sizes as the table width will have changed to account
64886                 // for the scrollbar
64887                 var scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;
64889                 if ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) {
64890                         settings.scrollBarVis = scrollBarVis;
64891                         _fnAdjustColumnSizing( settings );
64892                         return; // adjust column sizing will call this function again
64893                 }
64894                 else {
64895                         settings.scrollBarVis = scrollBarVis;
64896                 }
64898                 /*
64899                  * 1. Re-create the table inside the scrolling div
64900                  */
64902                 // Remove the old minimised thead and tfoot elements in the inner table
64903                 table.children('thead, tfoot').remove();
64905                 if ( footer ) {
64906                         footerCopy = footer.clone().prependTo( table );
64907                         footerTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized
64908                         footerSrcEls = footerCopy.find('tr');
64909                 }
64911                 // Clone the current header and footer elements and then place it into the inner table
64912                 headerCopy = header.clone().prependTo( table );
64913                 headerTrgEls = header.find('tr'); // original header is in its own table
64914                 headerSrcEls = headerCopy.find('tr');
64915                 headerCopy.find('th, td').removeAttr('tabindex');
64918                 /*
64919                  * 2. Take live measurements from the DOM - do not alter the DOM itself!
64920                  */
64922                 // Remove old sizing and apply the calculated column widths
64923                 // Get the unique column headers in the newly created (cloned) header. We want to apply the
64924                 // calculated sizes to this header
64925                 if ( ! scrollX )
64926                 {
64927                         divBodyStyle.width = '100%';
64928                         divHeader[0].style.width = '100%';
64929                 }
64931                 $.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {
64932                         idx = _fnVisibleToColumnIndex( settings, i );
64933                         el.style.width = settings.aoColumns[idx].sWidth;
64934                 } );
64936                 if ( footer ) {
64937                         _fnApplyToChildren( function(n) {
64938                                 n.style.width = "";
64939                         }, footerSrcEls );
64940                 }
64942                 // Size the table as a whole
64943                 sanityWidth = table.outerWidth();
64944                 if ( scrollX === "" ) {
64945                         // No x scrolling
64946                         tableStyle.width = "100%";
64948                         // IE7 will make the width of the table when 100% include the scrollbar
64949                         // - which is shouldn't. When there is a scrollbar we need to take this
64950                         // into account.
64951                         if ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||
64952                                 divBody.css('overflow-y') == "scroll")
64953                         ) {
64954                                 tableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);
64955                         }
64957                         // Recalculate the sanity width
64958                         sanityWidth = table.outerWidth();
64959                 }
64960                 else if ( scrollXInner !== "" ) {
64961                         // legacy x scroll inner has been given - use it
64962                         tableStyle.width = _fnStringToCss(scrollXInner);
64964                         // Recalculate the sanity width
64965                         sanityWidth = table.outerWidth();
64966                 }
64968                 // Hidden header should have zero height, so remove padding and borders. Then
64969                 // set the width based on the real headers
64971                 // Apply all styles in one pass
64972                 _fnApplyToChildren( zeroOut, headerSrcEls );
64974                 // Read all widths in next pass
64975                 _fnApplyToChildren( function(nSizer) {
64976                         headerContent.push( nSizer.innerHTML );
64977                         headerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
64978                 }, headerSrcEls );
64980                 // Apply all widths in final pass
64981                 _fnApplyToChildren( function(nToSize, i) {
64982                         // Only apply widths to the DataTables detected header cells - this
64983                         // prevents complex headers from having contradictory sizes applied
64984                         if ( $.inArray( nToSize, dtHeaderCells ) !== -1 ) {
64985                                 nToSize.style.width = headerWidths[i];
64986                         }
64987                 }, headerTrgEls );
64989                 $(headerSrcEls).height(0);
64991                 /* Same again with the footer if we have one */
64992                 if ( footer )
64993                 {
64994                         _fnApplyToChildren( zeroOut, footerSrcEls );
64996                         _fnApplyToChildren( function(nSizer) {
64997                                 footerContent.push( nSizer.innerHTML );
64998                                 footerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
64999                         }, footerSrcEls );
65001                         _fnApplyToChildren( function(nToSize, i) {
65002                                 nToSize.style.width = footerWidths[i];
65003                         }, footerTrgEls );
65005                         $(footerSrcEls).height(0);
65006                 }
65009                 /*
65010                  * 3. Apply the measurements
65011                  */
65013                 // "Hide" the header and footer that we used for the sizing. We need to keep
65014                 // the content of the cell so that the width applied to the header and body
65015                 // both match, but we want to hide it completely. We want to also fix their
65016                 // width to what they currently are
65017                 _fnApplyToChildren( function(nSizer, i) {
65018                         nSizer.innerHTML = '<div class="dataTables_sizing">'+headerContent[i]+'</div>';
65019                         nSizer.childNodes[0].style.height = "0";
65020                         nSizer.childNodes[0].style.overflow = "hidden";
65021                         nSizer.style.width = headerWidths[i];
65022                 }, headerSrcEls );
65024                 if ( footer )
65025                 {
65026                         _fnApplyToChildren( function(nSizer, i) {
65027                                 nSizer.innerHTML = '<div class="dataTables_sizing">'+footerContent[i]+'</div>';
65028                                 nSizer.childNodes[0].style.height = "0";
65029                                 nSizer.childNodes[0].style.overflow = "hidden";
65030                                 nSizer.style.width = footerWidths[i];
65031                         }, footerSrcEls );
65032                 }
65034                 // Sanity check that the table is of a sensible width. If not then we are going to get
65035                 // misalignment - try to prevent this by not allowing the table to shrink below its min width
65036                 if ( table.outerWidth() < sanityWidth )
65037                 {
65038                         // The min width depends upon if we have a vertical scrollbar visible or not */
65039                         correction = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||
65040                                 divBody.css('overflow-y') == "scroll")) ?
65041                                         sanityWidth+barWidth :
65042                                         sanityWidth;
65044                         // IE6/7 are a law unto themselves...
65045                         if ( ie67 && (divBodyEl.scrollHeight >
65046                                 divBodyEl.offsetHeight || divBody.css('overflow-y') == "scroll")
65047                         ) {
65048                                 tableStyle.width = _fnStringToCss( correction-barWidth );
65049                         }
65051                         // And give the user a warning that we've stopped the table getting too small
65052                         if ( scrollX === "" || scrollXInner !== "" ) {
65053                                 _fnLog( settings, 1, 'Possible column misalignment', 6 );
65054                         }
65055                 }
65056                 else
65057                 {
65058                         correction = '100%';
65059                 }
65061                 // Apply to the container elements
65062                 divBodyStyle.width = _fnStringToCss( correction );
65063                 divHeaderStyle.width = _fnStringToCss( correction );
65065                 if ( footer ) {
65066                         settings.nScrollFoot.style.width = _fnStringToCss( correction );
65067                 }
65070                 /*
65071                  * 4. Clean up
65072                  */
65073                 if ( ! scrollY ) {
65074                         /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
65075                          * the scrollbar height from the visible display, rather than adding it on. We need to
65076                          * set the height in order to sort this. Don't want to do it in any other browsers.
65077                          */
65078                         if ( ie67 ) {
65079                                 divBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );
65080                         }
65081                 }
65083                 /* Finally set the width's of the header and footer tables */
65084                 var iOuterWidth = table.outerWidth();
65085                 divHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );
65086                 divHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );
65088                 // Figure out if there are scrollbar present - if so then we need a the header and footer to
65089                 // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
65090                 var bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == "scroll";
65091                 var padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );
65092                 divHeaderInnerStyle[ padding ] = bScrolling ? barWidth+"px" : "0px";
65094                 if ( footer ) {
65095                         divFooterTable[0].style.width = _fnStringToCss( iOuterWidth );
65096                         divFooterInner[0].style.width = _fnStringToCss( iOuterWidth );
65097                         divFooterInner[0].style[padding] = bScrolling ? barWidth+"px" : "0px";
65098                 }
65100                 // Correct DOM ordering for colgroup - comes before the thead
65101                 table.children('colgroup').insertBefore( table.children('thead') );
65103                 /* Adjust the position of the header in case we loose the y-scrollbar */
65104                 divBody.scroll();
65106                 // If sorting or filtering has occurred, jump the scrolling back to the top
65107                 // only if we aren't holding the position
65108                 if ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {
65109                         divBodyEl.scrollTop = 0;
65110                 }
65111         }
65115         /**
65116          * Apply a given function to the display child nodes of an element array (typically
65117          * TD children of TR rows
65118          *  @param {function} fn Method to apply to the objects
65119          *  @param array {nodes} an1 List of elements to look through for display children
65120          *  @param array {nodes} an2 Another list (identical structure to the first) - optional
65121          *  @memberof DataTable#oApi
65122          */
65123         function _fnApplyToChildren( fn, an1, an2 )
65124         {
65125                 var index=0, i=0, iLen=an1.length;
65126                 var nNode1, nNode2;
65128                 while ( i < iLen ) {
65129                         nNode1 = an1[i].firstChild;
65130                         nNode2 = an2 ? an2[i].firstChild : null;
65132                         while ( nNode1 ) {
65133                                 if ( nNode1.nodeType === 1 ) {
65134                                         if ( an2 ) {
65135                                                 fn( nNode1, nNode2, index );
65136                                         }
65137                                         else {
65138                                                 fn( nNode1, index );
65139                                         }
65141                                         index++;
65142                                 }
65144                                 nNode1 = nNode1.nextSibling;
65145                                 nNode2 = an2 ? nNode2.nextSibling : null;
65146                         }
65148                         i++;
65149                 }
65150         }
65154         var __re_html_remove = /<.*?>/g;
65157         /**
65158          * Calculate the width of columns for the table
65159          *  @param {object} oSettings dataTables settings object
65160          *  @memberof DataTable#oApi
65161          */
65162         function _fnCalculateColumnWidths ( oSettings )
65163         {
65164                 var
65165                         table = oSettings.nTable,
65166                         columns = oSettings.aoColumns,
65167                         scroll = oSettings.oScroll,
65168                         scrollY = scroll.sY,
65169                         scrollX = scroll.sX,
65170                         scrollXInner = scroll.sXInner,
65171                         columnCount = columns.length,
65172                         visibleColumns = _fnGetColumns( oSettings, 'bVisible' ),
65173                         headerCells = $('th', oSettings.nTHead),
65174                         tableWidthAttr = table.getAttribute('width'), // from DOM element
65175                         tableContainer = table.parentNode,
65176                         userInputs = false,
65177                         i, column, columnIdx, width, outerWidth,
65178                         browser = oSettings.oBrowser,
65179                         ie67 = browser.bScrollOversize;
65181                 var styleWidth = table.style.width;
65182                 if ( styleWidth && styleWidth.indexOf('%') !== -1 ) {
65183                         tableWidthAttr = styleWidth;
65184                 }
65186                 /* Convert any user input sizes into pixel sizes */
65187                 for ( i=0 ; i<visibleColumns.length ; i++ ) {
65188                         column = columns[ visibleColumns[i] ];
65190                         if ( column.sWidth !== null ) {
65191                                 column.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );
65193                                 userInputs = true;
65194                         }
65195                 }
65197                 /* If the number of columns in the DOM equals the number that we have to
65198                  * process in DataTables, then we can use the offsets that are created by
65199                  * the web- browser. No custom sizes can be set in order for this to happen,
65200                  * nor scrolling used
65201                  */
65202                 if ( ie67 || ! userInputs && ! scrollX && ! scrollY &&
65203                      columnCount == _fnVisbleColumns( oSettings ) &&
65204                      columnCount == headerCells.length
65205                 ) {
65206                         for ( i=0 ; i<columnCount ; i++ ) {
65207                                 var colIdx = _fnVisibleToColumnIndex( oSettings, i );
65209                                 if ( colIdx !== null ) {
65210                                         columns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() );
65211                                 }
65212                         }
65213                 }
65214                 else
65215                 {
65216                         // Otherwise construct a single row, worst case, table with the widest
65217                         // node in the data, assign any user defined widths, then insert it into
65218                         // the DOM and allow the browser to do all the hard work of calculating
65219                         // table widths
65220                         var tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table
65221                                 .css( 'visibility', 'hidden' )
65222                                 .removeAttr( 'id' );
65224                         // Clean up the table body
65225                         tmpTable.find('tbody tr').remove();
65226                         var tr = $('<tr/>').appendTo( tmpTable.find('tbody') );
65228                         // Clone the table header and footer - we can't use the header / footer
65229                         // from the cloned table, since if scrolling is active, the table's
65230                         // real header and footer are contained in different table tags
65231                         tmpTable.find('thead, tfoot').remove();
65232                         tmpTable
65233                                 .append( $(oSettings.nTHead).clone() )
65234                                 .append( $(oSettings.nTFoot).clone() );
65236                         // Remove any assigned widths from the footer (from scrolling)
65237                         tmpTable.find('tfoot th, tfoot td').css('width', '');
65239                         // Apply custom sizing to the cloned header
65240                         headerCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );
65242                         for ( i=0 ; i<visibleColumns.length ; i++ ) {
65243                                 column = columns[ visibleColumns[i] ];
65245                                 headerCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?
65246                                         _fnStringToCss( column.sWidthOrig ) :
65247                                         '';
65249                                 // For scrollX we need to force the column width otherwise the
65250                                 // browser will collapse it. If this width is smaller than the
65251                                 // width the column requires, then it will have no effect
65252                                 if ( column.sWidthOrig && scrollX ) {
65253                                         $( headerCells[i] ).append( $('<div/>').css( {
65254                                                 width: column.sWidthOrig,
65255                                                 margin: 0,
65256                                                 padding: 0,
65257                                                 border: 0,
65258                                                 height: 1
65259                                         } ) );
65260                                 }
65261                         }
65263                         // Find the widest cell for each column and put it into the table
65264                         if ( oSettings.aoData.length ) {
65265                                 for ( i=0 ; i<visibleColumns.length ; i++ ) {
65266                                         columnIdx = visibleColumns[i];
65267                                         column = columns[ columnIdx ];
65269                                         $( _fnGetWidestNode( oSettings, columnIdx ) )
65270                                                 .clone( false )
65271                                                 .append( column.sContentPadding )
65272                                                 .appendTo( tr );
65273                                 }
65274                         }
65276                         // Tidy the temporary table - remove name attributes so there aren't
65277                         // duplicated in the dom (radio elements for example)
65278                         $('[name]', tmpTable).removeAttr('name');
65280                         // Table has been built, attach to the document so we can work with it.
65281                         // A holding element is used, positioned at the top of the container
65282                         // with minimal height, so it has no effect on if the container scrolls
65283                         // or not. Otherwise it might trigger scrolling when it actually isn't
65284                         // needed
65285                         var holder = $('<div/>').css( scrollX || scrollY ?
65286                                         {
65287                                                 position: 'absolute',
65288                                                 top: 0,
65289                                                 left: 0,
65290                                                 height: 1,
65291                                                 right: 0,
65292                                                 overflow: 'hidden'
65293                                         } :
65294                                         {}
65295                                 )
65296                                 .append( tmpTable )
65297                                 .appendTo( tableContainer );
65299                         // When scrolling (X or Y) we want to set the width of the table as
65300                         // appropriate. However, when not scrolling leave the table width as it
65301                         // is. This results in slightly different, but I think correct behaviour
65302                         if ( scrollX && scrollXInner ) {
65303                                 tmpTable.width( scrollXInner );
65304                         }
65305                         else if ( scrollX ) {
65306                                 tmpTable.css( 'width', 'auto' );
65307                                 tmpTable.removeAttr('width');
65309                                 // If there is no width attribute or style, then allow the table to
65310                                 // collapse
65311                                 if ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) {
65312                                         tmpTable.width( tableContainer.clientWidth );
65313                                 }
65314                         }
65315                         else if ( scrollY ) {
65316                                 tmpTable.width( tableContainer.clientWidth );
65317                         }
65318                         else if ( tableWidthAttr ) {
65319                                 tmpTable.width( tableWidthAttr );
65320                         }
65322                         // Get the width of each column in the constructed table - we need to
65323                         // know the inner width (so it can be assigned to the other table's
65324                         // cells) and the outer width so we can calculate the full width of the
65325                         // table. This is safe since DataTables requires a unique cell for each
65326                         // column, but if ever a header can span multiple columns, this will
65327                         // need to be modified.
65328                         var total = 0;
65329                         for ( i=0 ; i<visibleColumns.length ; i++ ) {
65330                                 var cell = $(headerCells[i]);
65331                                 var border = cell.outerWidth() - cell.width();
65333                                 // Use getBounding... where possible (not IE8-) because it can give
65334                                 // sub-pixel accuracy, which we then want to round up!
65335                                 var bounding = browser.bBounding ?
65336                                         Math.ceil( headerCells[i].getBoundingClientRect().width ) :
65337                                         cell.outerWidth();
65339                                 // Total is tracked to remove any sub-pixel errors as the outerWidth
65340                                 // of the table might not equal the total given here (IE!).
65341                                 total += bounding;
65343                                 // Width for each column to use
65344                                 columns[ visibleColumns[i] ].sWidth = _fnStringToCss( bounding - border );
65345                         }
65347                         table.style.width = _fnStringToCss( total );
65349                         // Finished with the table - ditch it
65350                         holder.remove();
65351                 }
65353                 // If there is a width attr, we want to attach an event listener which
65354                 // allows the table sizing to automatically adjust when the window is
65355                 // resized. Use the width attr rather than CSS, since we can't know if the
65356                 // CSS is a relative value or absolute - DOM read is always px.
65357                 if ( tableWidthAttr ) {
65358                         table.style.width = _fnStringToCss( tableWidthAttr );
65359                 }
65361                 if ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {
65362                         var bindResize = function () {
65363                                 $(window).on('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {
65364                                         _fnAdjustColumnSizing( oSettings );
65365                                 } ) );
65366                         };
65368                         // IE6/7 will crash if we bind a resize event handler on page load.
65369                         // To be removed in 1.11 which drops IE6/7 support
65370                         if ( ie67 ) {
65371                                 setTimeout( bindResize, 1000 );
65372                         }
65373                         else {
65374                                 bindResize();
65375                         }
65377                         oSettings._reszEvt = true;
65378                 }
65379         }
65382         /**
65383          * Throttle the calls to a function. Arguments and context are maintained for
65384          * the throttled function
65385          *  @param {function} fn Function to be called
65386          *  @param {int} [freq=200] call frequency in mS
65387          *  @returns {function} wrapped function
65388          *  @memberof DataTable#oApi
65389          */
65390         var _fnThrottle = DataTable.util.throttle;
65393         /**
65394          * Convert a CSS unit width to pixels (e.g. 2em)
65395          *  @param {string} width width to be converted
65396          *  @param {node} parent parent to get the with for (required for relative widths) - optional
65397          *  @returns {int} width in pixels
65398          *  @memberof DataTable#oApi
65399          */
65400         function _fnConvertToWidth ( width, parent )
65401         {
65402                 if ( ! width ) {
65403                         return 0;
65404                 }
65406                 var n = $('<div/>')
65407                         .css( 'width', _fnStringToCss( width ) )
65408                         .appendTo( parent || document.body );
65410                 var val = n[0].offsetWidth;
65411                 n.remove();
65413                 return val;
65414         }
65417         /**
65418          * Get the widest node
65419          *  @param {object} settings dataTables settings object
65420          *  @param {int} colIdx column of interest
65421          *  @returns {node} widest table node
65422          *  @memberof DataTable#oApi
65423          */
65424         function _fnGetWidestNode( settings, colIdx )
65425         {
65426                 var idx = _fnGetMaxLenString( settings, colIdx );
65427                 if ( idx < 0 ) {
65428                         return null;
65429                 }
65431                 var data = settings.aoData[ idx ];
65432                 return ! data.nTr ? // Might not have been created when deferred rendering
65433                         $('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :
65434                         data.anCells[ colIdx ];
65435         }
65438         /**
65439          * Get the maximum strlen for each data column
65440          *  @param {object} settings dataTables settings object
65441          *  @param {int} colIdx column of interest
65442          *  @returns {string} max string length for each column
65443          *  @memberof DataTable#oApi
65444          */
65445         function _fnGetMaxLenString( settings, colIdx )
65446         {
65447                 var s, max=-1, maxIdx = -1;
65449                 for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
65450                         s = _fnGetCellData( settings, i, colIdx, 'display' )+'';
65451                         s = s.replace( __re_html_remove, '' );
65452                         s = s.replace( /&nbsp;/g, ' ' );
65454                         if ( s.length > max ) {
65455                                 max = s.length;
65456                                 maxIdx = i;
65457                         }
65458                 }
65460                 return maxIdx;
65461         }
65464         /**
65465          * Append a CSS unit (only if required) to a string
65466          *  @param {string} value to css-ify
65467          *  @returns {string} value with css unit
65468          *  @memberof DataTable#oApi
65469          */
65470         function _fnStringToCss( s )
65471         {
65472                 if ( s === null ) {
65473                         return '0px';
65474                 }
65476                 if ( typeof s == 'number' ) {
65477                         return s < 0 ?
65478                                 '0px' :
65479                                 s+'px';
65480                 }
65482                 // Check it has a unit character already
65483                 return s.match(/\d$/) ?
65484                         s+'px' :
65485                         s;
65486         }
65490         function _fnSortFlatten ( settings )
65491         {
65492                 var
65493                         i, iLen, k, kLen,
65494                         aSort = [],
65495                         aiOrig = [],
65496                         aoColumns = settings.aoColumns,
65497                         aDataSort, iCol, sType, srcCol,
65498                         fixed = settings.aaSortingFixed,
65499                         fixedObj = $.isPlainObject( fixed ),
65500                         nestedSort = [],
65501                         add = function ( a ) {
65502                                 if ( a.length && ! $.isArray( a[0] ) ) {
65503                                         // 1D array
65504                                         nestedSort.push( a );
65505                                 }
65506                                 else {
65507                                         // 2D array
65508                                         $.merge( nestedSort, a );
65509                                 }
65510                         };
65512                 // Build the sort array, with pre-fix and post-fix options if they have been
65513                 // specified
65514                 if ( $.isArray( fixed ) ) {
65515                         add( fixed );
65516                 }
65518                 if ( fixedObj && fixed.pre ) {
65519                         add( fixed.pre );
65520                 }
65522                 add( settings.aaSorting );
65524                 if (fixedObj && fixed.post ) {
65525                         add( fixed.post );
65526                 }
65528                 for ( i=0 ; i<nestedSort.length ; i++ )
65529                 {
65530                         srcCol = nestedSort[i][0];
65531                         aDataSort = aoColumns[ srcCol ].aDataSort;
65533                         for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )
65534                         {
65535                                 iCol = aDataSort[k];
65536                                 sType = aoColumns[ iCol ].sType || 'string';
65538                                 if ( nestedSort[i]._idx === undefined ) {
65539                                         nestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );
65540                                 }
65542                                 aSort.push( {
65543                                         src:       srcCol,
65544                                         col:       iCol,
65545                                         dir:       nestedSort[i][1],
65546                                         index:     nestedSort[i]._idx,
65547                                         type:      sType,
65548                                         formatter: DataTable.ext.type.order[ sType+"-pre" ]
65549                                 } );
65550                         }
65551                 }
65553                 return aSort;
65554         }
65556         /**
65557          * Change the order of the table
65558          *  @param {object} oSettings dataTables settings object
65559          *  @memberof DataTable#oApi
65560          *  @todo This really needs split up!
65561          */
65562         function _fnSort ( oSettings )
65563         {
65564                 var
65565                         i, ien, iLen, j, jLen, k, kLen,
65566                         sDataType, nTh,
65567                         aiOrig = [],
65568                         oExtSort = DataTable.ext.type.order,
65569                         aoData = oSettings.aoData,
65570                         aoColumns = oSettings.aoColumns,
65571                         aDataSort, data, iCol, sType, oSort,
65572                         formatters = 0,
65573                         sortCol,
65574                         displayMaster = oSettings.aiDisplayMaster,
65575                         aSort;
65577                 // Resolve any column types that are unknown due to addition or invalidation
65578                 // @todo Can this be moved into a 'data-ready' handler which is called when
65579                 //   data is going to be used in the table?
65580                 _fnColumnTypes( oSettings );
65582                 aSort = _fnSortFlatten( oSettings );
65584                 for ( i=0, ien=aSort.length ; i<ien ; i++ ) {
65585                         sortCol = aSort[i];
65587                         // Track if we can use the fast sort algorithm
65588                         if ( sortCol.formatter ) {
65589                                 formatters++;
65590                         }
65592                         // Load the data needed for the sort, for each cell
65593                         _fnSortData( oSettings, sortCol.col );
65594                 }
65596                 /* No sorting required if server-side or no sorting array */
65597                 if ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )
65598                 {
65599                         // Create a value - key array of the current row positions such that we can use their
65600                         // current position during the sort, if values match, in order to perform stable sorting
65601                         for ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {
65602                                 aiOrig[ displayMaster[i] ] = i;
65603                         }
65605                         /* Do the sort - here we want multi-column sorting based on a given data source (column)
65606                          * and sorting function (from oSort) in a certain direction. It's reasonably complex to
65607                          * follow on it's own, but this is what we want (example two column sorting):
65608                          *  fnLocalSorting = function(a,b){
65609                          *    var iTest;
65610                          *    iTest = oSort['string-asc']('data11', 'data12');
65611                          *      if (iTest !== 0)
65612                          *        return iTest;
65613                          *    iTest = oSort['numeric-desc']('data21', 'data22');
65614                          *    if (iTest !== 0)
65615                          *      return iTest;
65616                          *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
65617                          *  }
65618                          * Basically we have a test for each sorting column, if the data in that column is equal,
65619                          * test the next column. If all columns match, then we use a numeric sort on the row
65620                          * positions in the original data array to provide a stable sort.
65621                          *
65622                          * Note - I know it seems excessive to have two sorting methods, but the first is around
65623                          * 15% faster, so the second is only maintained for backwards compatibility with sorting
65624                          * methods which do not have a pre-sort formatting function.
65625                          */
65626                         if ( formatters === aSort.length ) {
65627                                 // All sort types have formatting functions
65628                                 displayMaster.sort( function ( a, b ) {
65629                                         var
65630                                                 x, y, k, test, sort,
65631                                                 len=aSort.length,
65632                                                 dataA = aoData[a]._aSortData,
65633                                                 dataB = aoData[b]._aSortData;
65635                                         for ( k=0 ; k<len ; k++ ) {
65636                                                 sort = aSort[k];
65638                                                 x = dataA[ sort.col ];
65639                                                 y = dataB[ sort.col ];
65641                                                 test = x<y ? -1 : x>y ? 1 : 0;
65642                                                 if ( test !== 0 ) {
65643                                                         return sort.dir === 'asc' ? test : -test;
65644                                                 }
65645                                         }
65647                                         x = aiOrig[a];
65648                                         y = aiOrig[b];
65649                                         return x<y ? -1 : x>y ? 1 : 0;
65650                                 } );
65651                         }
65652                         else {
65653                                 // Depreciated - remove in 1.11 (providing a plug-in option)
65654                                 // Not all sort types have formatting methods, so we have to call their sorting
65655                                 // methods.
65656                                 displayMaster.sort( function ( a, b ) {
65657                                         var
65658                                                 x, y, k, l, test, sort, fn,
65659                                                 len=aSort.length,
65660                                                 dataA = aoData[a]._aSortData,
65661                                                 dataB = aoData[b]._aSortData;
65663                                         for ( k=0 ; k<len ; k++ ) {
65664                                                 sort = aSort[k];
65666                                                 x = dataA[ sort.col ];
65667                                                 y = dataB[ sort.col ];
65669                                                 fn = oExtSort[ sort.type+"-"+sort.dir ] || oExtSort[ "string-"+sort.dir ];
65670                                                 test = fn( x, y );
65671                                                 if ( test !== 0 ) {
65672                                                         return test;
65673                                                 }
65674                                         }
65676                                         x = aiOrig[a];
65677                                         y = aiOrig[b];
65678                                         return x<y ? -1 : x>y ? 1 : 0;
65679                                 } );
65680                         }
65681                 }
65683                 /* Tell the draw function that we have sorted the data */
65684                 oSettings.bSorted = true;
65685         }
65688         function _fnSortAria ( settings )
65689         {
65690                 var label;
65691                 var nextSort;
65692                 var columns = settings.aoColumns;
65693                 var aSort = _fnSortFlatten( settings );
65694                 var oAria = settings.oLanguage.oAria;
65696                 // ARIA attributes - need to loop all columns, to update all (removing old
65697                 // attributes as needed)
65698                 for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
65699                 {
65700                         var col = columns[i];
65701                         var asSorting = col.asSorting;
65702                         var sTitle = col.sTitle.replace( /<.*?>/g, "" );
65703                         var th = col.nTh;
65705                         // IE7 is throwing an error when setting these properties with jQuery's
65706                         // attr() and removeAttr() methods...
65707                         th.removeAttribute('aria-sort');
65709                         /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */
65710                         if ( col.bSortable ) {
65711                                 if ( aSort.length > 0 && aSort[0].col == i ) {
65712                                         th.setAttribute('aria-sort', aSort[0].dir=="asc" ? "ascending" : "descending" );
65713                                         nextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];
65714                                 }
65715                                 else {
65716                                         nextSort = asSorting[0];
65717                                 }
65719                                 label = sTitle + ( nextSort === "asc" ?
65720                                         oAria.sSortAscending :
65721                                         oAria.sSortDescending
65722                                 );
65723                         }
65724                         else {
65725                                 label = sTitle;
65726                         }
65728                         th.setAttribute('aria-label', label);
65729                 }
65730         }
65733         /**
65734          * Function to run on user sort request
65735          *  @param {object} settings dataTables settings object
65736          *  @param {node} attachTo node to attach the handler to
65737          *  @param {int} colIdx column sorting index
65738          *  @param {boolean} [append=false] Append the requested sort to the existing
65739          *    sort if true (i.e. multi-column sort)
65740          *  @param {function} [callback] callback function
65741          *  @memberof DataTable#oApi
65742          */
65743         function _fnSortListener ( settings, colIdx, append, callback )
65744         {
65745                 var col = settings.aoColumns[ colIdx ];
65746                 var sorting = settings.aaSorting;
65747                 var asSorting = col.asSorting;
65748                 var nextSortIdx;
65749                 var next = function ( a, overflow ) {
65750                         var idx = a._idx;
65751                         if ( idx === undefined ) {
65752                                 idx = $.inArray( a[1], asSorting );
65753                         }
65755                         return idx+1 < asSorting.length ?
65756                                 idx+1 :
65757                                 overflow ?
65758                                         null :
65759                                         0;
65760                 };
65762                 // Convert to 2D array if needed
65763                 if ( typeof sorting[0] === 'number' ) {
65764                         sorting = settings.aaSorting = [ sorting ];
65765                 }
65767                 // If appending the sort then we are multi-column sorting
65768                 if ( append && settings.oFeatures.bSortMulti ) {
65769                         // Are we already doing some kind of sort on this column?
65770                         var sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );
65772                         if ( sortIdx !== -1 ) {
65773                                 // Yes, modify the sort
65774                                 nextSortIdx = next( sorting[sortIdx], true );
65776                                 if ( nextSortIdx === null && sorting.length === 1 ) {
65777                                         nextSortIdx = 0; // can't remove sorting completely
65778                                 }
65780                                 if ( nextSortIdx === null ) {
65781                                         sorting.splice( sortIdx, 1 );
65782                                 }
65783                                 else {
65784                                         sorting[sortIdx][1] = asSorting[ nextSortIdx ];
65785                                         sorting[sortIdx]._idx = nextSortIdx;
65786                                 }
65787                         }
65788                         else {
65789                                 // No sort on this column yet
65790                                 sorting.push( [ colIdx, asSorting[0], 0 ] );
65791                                 sorting[sorting.length-1]._idx = 0;
65792                         }
65793                 }
65794                 else if ( sorting.length && sorting[0][0] == colIdx ) {
65795                         // Single column - already sorting on this column, modify the sort
65796                         nextSortIdx = next( sorting[0] );
65798                         sorting.length = 1;
65799                         sorting[0][1] = asSorting[ nextSortIdx ];
65800                         sorting[0]._idx = nextSortIdx;
65801                 }
65802                 else {
65803                         // Single column - sort only on this column
65804                         sorting.length = 0;
65805                         sorting.push( [ colIdx, asSorting[0] ] );
65806                         sorting[0]._idx = 0;
65807                 }
65809                 // Run the sort by calling a full redraw
65810                 _fnReDraw( settings );
65812                 // callback used for async user interaction
65813                 if ( typeof callback == 'function' ) {
65814                         callback( settings );
65815                 }
65816         }
65819         /**
65820          * Attach a sort handler (click) to a node
65821          *  @param {object} settings dataTables settings object
65822          *  @param {node} attachTo node to attach the handler to
65823          *  @param {int} colIdx column sorting index
65824          *  @param {function} [callback] callback function
65825          *  @memberof DataTable#oApi
65826          */
65827         function _fnSortAttachListener ( settings, attachTo, colIdx, callback )
65828         {
65829                 var col = settings.aoColumns[ colIdx ];
65831                 _fnBindAction( attachTo, {}, function (e) {
65832                         /* If the column is not sortable - don't to anything */
65833                         if ( col.bSortable === false ) {
65834                                 return;
65835                         }
65837                         // If processing is enabled use a timeout to allow the processing
65838                         // display to be shown - otherwise to it synchronously
65839                         if ( settings.oFeatures.bProcessing ) {
65840                                 _fnProcessingDisplay( settings, true );
65842                                 setTimeout( function() {
65843                                         _fnSortListener( settings, colIdx, e.shiftKey, callback );
65845                                         // In server-side processing, the draw callback will remove the
65846                                         // processing display
65847                                         if ( _fnDataSource( settings ) !== 'ssp' ) {
65848                                                 _fnProcessingDisplay( settings, false );
65849                                         }
65850                                 }, 0 );
65851                         }
65852                         else {
65853                                 _fnSortListener( settings, colIdx, e.shiftKey, callback );
65854                         }
65855                 } );
65856         }
65859         /**
65860          * Set the sorting classes on table's body, Note: it is safe to call this function
65861          * when bSort and bSortClasses are false
65862          *  @param {object} oSettings dataTables settings object
65863          *  @memberof DataTable#oApi
65864          */
65865         function _fnSortingClasses( settings )
65866         {
65867                 var oldSort = settings.aLastSort;
65868                 var sortClass = settings.oClasses.sSortColumn;
65869                 var sort = _fnSortFlatten( settings );
65870                 var features = settings.oFeatures;
65871                 var i, ien, colIdx;
65873                 if ( features.bSort && features.bSortClasses ) {
65874                         // Remove old sorting classes
65875                         for ( i=0, ien=oldSort.length ; i<ien ; i++ ) {
65876                                 colIdx = oldSort[i].src;
65878                                 // Remove column sorting
65879                                 $( _pluck( settings.aoData, 'anCells', colIdx ) )
65880                                         .removeClass( sortClass + (i<2 ? i+1 : 3) );
65881                         }
65883                         // Add new column sorting
65884                         for ( i=0, ien=sort.length ; i<ien ; i++ ) {
65885                                 colIdx = sort[i].src;
65887                                 $( _pluck( settings.aoData, 'anCells', colIdx ) )
65888                                         .addClass( sortClass + (i<2 ? i+1 : 3) );
65889                         }
65890                 }
65892                 settings.aLastSort = sort;
65893         }
65896         // Get the data to sort a column, be it from cache, fresh (populating the
65897         // cache), or from a sort formatter
65898         function _fnSortData( settings, idx )
65899         {
65900                 // Custom sorting function - provided by the sort data type
65901                 var column = settings.aoColumns[ idx ];
65902                 var customSort = DataTable.ext.order[ column.sSortDataType ];
65903                 var customData;
65905                 if ( customSort ) {
65906                         customData = customSort.call( settings.oInstance, settings, idx,
65907                                 _fnColumnIndexToVisible( settings, idx )
65908                         );
65909                 }
65911                 // Use / populate cache
65912                 var row, cellData;
65913                 var formatter = DataTable.ext.type.order[ column.sType+"-pre" ];
65915                 for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
65916                         row = settings.aoData[i];
65918                         if ( ! row._aSortData ) {
65919                                 row._aSortData = [];
65920                         }
65922                         if ( ! row._aSortData[idx] || customSort ) {
65923                                 cellData = customSort ?
65924                                         customData[i] : // If there was a custom sort function, use data from there
65925                                         _fnGetCellData( settings, i, idx, 'sort' );
65927                                 row._aSortData[ idx ] = formatter ?
65928                                         formatter( cellData ) :
65929                                         cellData;
65930                         }
65931                 }
65932         }
65936         /**
65937          * Save the state of a table
65938          *  @param {object} oSettings dataTables settings object
65939          *  @memberof DataTable#oApi
65940          */
65941         function _fnSaveState ( settings )
65942         {
65943                 if ( !settings.oFeatures.bStateSave || settings.bDestroying )
65944                 {
65945                         return;
65946                 }
65948                 /* Store the interesting variables */
65949                 var state = {
65950                         time:    +new Date(),
65951                         start:   settings._iDisplayStart,
65952                         length:  settings._iDisplayLength,
65953                         order:   $.extend( true, [], settings.aaSorting ),
65954                         search:  _fnSearchToCamel( settings.oPreviousSearch ),
65955                         columns: $.map( settings.aoColumns, function ( col, i ) {
65956                                 return {
65957                                         visible: col.bVisible,
65958                                         search: _fnSearchToCamel( settings.aoPreSearchCols[i] )
65959                                 };
65960                         } )
65961                 };
65963                 _fnCallbackFire( settings, "aoStateSaveParams", 'stateSaveParams', [settings, state] );
65965                 settings.oSavedState = state;
65966                 settings.fnStateSaveCallback.call( settings.oInstance, settings, state );
65967         }
65970         /**
65971          * Attempt to load a saved table state
65972          *  @param {object} oSettings dataTables settings object
65973          *  @param {object} oInit DataTables init object so we can override settings
65974          *  @param {function} callback Callback to execute when the state has been loaded
65975          *  @memberof DataTable#oApi
65976          */
65977         function _fnLoadState ( settings, oInit, callback )
65978         {
65979                 var i, ien;
65980                 var columns = settings.aoColumns;
65981                 var loaded = function ( s ) {
65982                         if ( ! s || ! s.time ) {
65983                                 callback();
65984                                 return;
65985                         }
65987                         // Allow custom and plug-in manipulation functions to alter the saved data set and
65988                         // cancelling of loading by returning false
65989                         var abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, s] );
65990                         if ( $.inArray( false, abStateLoad ) !== -1 ) {
65991                                 callback();
65992                                 return;
65993                         }
65995                         // Reject old data
65996                         var duration = settings.iStateDuration;
65997                         if ( duration > 0 && s.time < +new Date() - (duration*1000) ) {
65998                                 callback();
65999                                 return;
66000                         }
66002                         // Number of columns have changed - all bets are off, no restore of settings
66003                         if ( s.columns && columns.length !== s.columns.length ) {
66004                                 callback();
66005                                 return;
66006                         }
66008                         // Store the saved state so it might be accessed at any time
66009                         settings.oLoadedState = $.extend( true, {}, s );
66011                         // Restore key features - todo - for 1.11 this needs to be done by
66012                         // subscribed events
66013                         if ( s.start !== undefined ) {
66014                                 settings._iDisplayStart    = s.start;
66015                                 settings.iInitDisplayStart = s.start;
66016                         }
66017                         if ( s.length !== undefined ) {
66018                                 settings._iDisplayLength   = s.length;
66019                         }
66021                         // Order
66022                         if ( s.order !== undefined ) {
66023                                 settings.aaSorting = [];
66024                                 $.each( s.order, function ( i, col ) {
66025                                         settings.aaSorting.push( col[0] >= columns.length ?
66026                                                 [ 0, col[1] ] :
66027                                                 col
66028                                         );
66029                                 } );
66030                         }
66032                         // Search
66033                         if ( s.search !== undefined ) {
66034                                 $.extend( settings.oPreviousSearch, _fnSearchToHung( s.search ) );
66035                         }
66037                         // Columns
66038                         //
66039                         if ( s.columns ) {
66040                                 for ( i=0, ien=s.columns.length ; i<ien ; i++ ) {
66041                                         var col = s.columns[i];
66043                                         // Visibility
66044                                         if ( col.visible !== undefined ) {
66045                                                 columns[i].bVisible = col.visible;
66046                                         }
66048                                         // Search
66049                                         if ( col.search !== undefined ) {
66050                                                 $.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );
66051                                         }
66052                                 }
66053                         }
66055                         _fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, s] );
66056                         callback();
66057                 }
66059                 if ( ! settings.oFeatures.bStateSave ) {
66060                         callback();
66061                         return;
66062                 }
66064                 var state = settings.fnStateLoadCallback.call( settings.oInstance, settings, loaded );
66066                 if ( state !== undefined ) {
66067                         loaded( state );
66068                 }
66069                 // otherwise, wait for the loaded callback to be executed
66070         }
66073         /**
66074          * Return the settings object for a particular table
66075          *  @param {node} table table we are using as a dataTable
66076          *  @returns {object} Settings object - or null if not found
66077          *  @memberof DataTable#oApi
66078          */
66079         function _fnSettingsFromNode ( table )
66080         {
66081                 var settings = DataTable.settings;
66082                 var idx = $.inArray( table, _pluck( settings, 'nTable' ) );
66084                 return idx !== -1 ?
66085                         settings[ idx ] :
66086                         null;
66087         }
66090         /**
66091          * Log an error message
66092          *  @param {object} settings dataTables settings object
66093          *  @param {int} level log error messages, or display them to the user
66094          *  @param {string} msg error message
66095          *  @param {int} tn Technical note id to get more information about the error.
66096          *  @memberof DataTable#oApi
66097          */
66098         function _fnLog( settings, level, msg, tn )
66099         {
66100                 msg = 'DataTables warning: '+
66101                         (settings ? 'table id='+settings.sTableId+' - ' : '')+msg;
66103                 if ( tn ) {
66104                         msg += '. For more information about this error, please see '+
66105                         'http://datatables.net/tn/'+tn;
66106                 }
66108                 if ( ! level  ) {
66109                         // Backwards compatibility pre 1.10
66110                         var ext = DataTable.ext;
66111                         var type = ext.sErrMode || ext.errMode;
66113                         if ( settings ) {
66114                                 _fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );
66115                         }
66117                         if ( type == 'alert' ) {
66118                                 alert( msg );
66119                         }
66120                         else if ( type == 'throw' ) {
66121                                 throw new Error(msg);
66122                         }
66123                         else if ( typeof type == 'function' ) {
66124                                 type( settings, tn, msg );
66125                         }
66126                 }
66127                 else if ( window.console && console.log ) {
66128                         console.log( msg );
66129                 }
66130         }
66133         /**
66134          * See if a property is defined on one object, if so assign it to the other object
66135          *  @param {object} ret target object
66136          *  @param {object} src source object
66137          *  @param {string} name property
66138          *  @param {string} [mappedName] name to map too - optional, name used if not given
66139          *  @memberof DataTable#oApi
66140          */
66141         function _fnMap( ret, src, name, mappedName )
66142         {
66143                 if ( $.isArray( name ) ) {
66144                         $.each( name, function (i, val) {
66145                                 if ( $.isArray( val ) ) {
66146                                         _fnMap( ret, src, val[0], val[1] );
66147                                 }
66148                                 else {
66149                                         _fnMap( ret, src, val );
66150                                 }
66151                         } );
66153                         return;
66154                 }
66156                 if ( mappedName === undefined ) {
66157                         mappedName = name;
66158                 }
66160                 if ( src[name] !== undefined ) {
66161                         ret[mappedName] = src[name];
66162                 }
66163         }
66166         /**
66167          * Extend objects - very similar to jQuery.extend, but deep copy objects, and
66168          * shallow copy arrays. The reason we need to do this, is that we don't want to
66169          * deep copy array init values (such as aaSorting) since the dev wouldn't be
66170          * able to override them, but we do want to deep copy arrays.
66171          *  @param {object} out Object to extend
66172          *  @param {object} extender Object from which the properties will be applied to
66173          *      out
66174          *  @param {boolean} breakRefs If true, then arrays will be sliced to take an
66175          *      independent copy with the exception of the `data` or `aaData` parameters
66176          *      if they are present. This is so you can pass in a collection to
66177          *      DataTables and have that used as your data source without breaking the
66178          *      references
66179          *  @returns {object} out Reference, just for convenience - out === the return.
66180          *  @memberof DataTable#oApi
66181          *  @todo This doesn't take account of arrays inside the deep copied objects.
66182          */
66183         function _fnExtend( out, extender, breakRefs )
66184         {
66185                 var val;
66187                 for ( var prop in extender ) {
66188                         if ( extender.hasOwnProperty(prop) ) {
66189                                 val = extender[prop];
66191                                 if ( $.isPlainObject( val ) ) {
66192                                         if ( ! $.isPlainObject( out[prop] ) ) {
66193                                                 out[prop] = {};
66194                                         }
66195                                         $.extend( true, out[prop], val );
66196                                 }
66197                                 else if ( breakRefs && prop !== 'data' && prop !== 'aaData' && $.isArray(val) ) {
66198                                         out[prop] = val.slice();
66199                                 }
66200                                 else {
66201                                         out[prop] = val;
66202                                 }
66203                         }
66204                 }
66206                 return out;
66207         }
66210         /**
66211          * Bind an event handers to allow a click or return key to activate the callback.
66212          * This is good for accessibility since a return on the keyboard will have the
66213          * same effect as a click, if the element has focus.
66214          *  @param {element} n Element to bind the action to
66215          *  @param {object} oData Data object to pass to the triggered function
66216          *  @param {function} fn Callback function for when the event is triggered
66217          *  @memberof DataTable#oApi
66218          */
66219         function _fnBindAction( n, oData, fn )
66220         {
66221                 $(n)
66222                         .on( 'click.DT', oData, function (e) {
66223                                         $(n).blur(); // Remove focus outline for mouse users
66224                                         fn(e);
66225                                 } )
66226                         .on( 'keypress.DT', oData, function (e){
66227                                         if ( e.which === 13 ) {
66228                                                 e.preventDefault();
66229                                                 fn(e);
66230                                         }
66231                                 } )
66232                         .on( 'selectstart.DT', function () {
66233                                         /* Take the brutal approach to cancelling text selection */
66234                                         return false;
66235                                 } );
66236         }
66239         /**
66240          * Register a callback function. Easily allows a callback function to be added to
66241          * an array store of callback functions that can then all be called together.
66242          *  @param {object} oSettings dataTables settings object
66243          *  @param {string} sStore Name of the array storage for the callbacks in oSettings
66244          *  @param {function} fn Function to be called back
66245          *  @param {string} sName Identifying name for the callback (i.e. a label)
66246          *  @memberof DataTable#oApi
66247          */
66248         function _fnCallbackReg( oSettings, sStore, fn, sName )
66249         {
66250                 if ( fn )
66251                 {
66252                         oSettings[sStore].push( {
66253                                 "fn": fn,
66254                                 "sName": sName
66255                         } );
66256                 }
66257         }
66260         /**
66261          * Fire callback functions and trigger events. Note that the loop over the
66262          * callback array store is done backwards! Further note that you do not want to
66263          * fire off triggers in time sensitive applications (for example cell creation)
66264          * as its slow.
66265          *  @param {object} settings dataTables settings object
66266          *  @param {string} callbackArr Name of the array storage for the callbacks in
66267          *      oSettings
66268          *  @param {string} eventName Name of the jQuery custom event to trigger. If
66269          *      null no trigger is fired
66270          *  @param {array} args Array of arguments to pass to the callback function /
66271          *      trigger
66272          *  @memberof DataTable#oApi
66273          */
66274         function _fnCallbackFire( settings, callbackArr, eventName, args )
66275         {
66276                 var ret = [];
66278                 if ( callbackArr ) {
66279                         ret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {
66280                                 return val.fn.apply( settings.oInstance, args );
66281                         } );
66282                 }
66284                 if ( eventName !== null ) {
66285                         var e = $.Event( eventName+'.dt' );
66287                         $(settings.nTable).trigger( e, args );
66289                         ret.push( e.result );
66290                 }
66292                 return ret;
66293         }
66296         function _fnLengthOverflow ( settings )
66297         {
66298                 var
66299                         start = settings._iDisplayStart,
66300                         end = settings.fnDisplayEnd(),
66301                         len = settings._iDisplayLength;
66303                 /* If we have space to show extra rows (backing up from the end point - then do so */
66304                 if ( start >= end )
66305                 {
66306                         start = end - len;
66307                 }
66309                 // Keep the start record on the current page
66310                 start -= (start % len);
66312                 if ( len === -1 || start < 0 )
66313                 {
66314                         start = 0;
66315                 }
66317                 settings._iDisplayStart = start;
66318         }
66321         function _fnRenderer( settings, type )
66322         {
66323                 var renderer = settings.renderer;
66324                 var host = DataTable.ext.renderer[type];
66326                 if ( $.isPlainObject( renderer ) && renderer[type] ) {
66327                         // Specific renderer for this type. If available use it, otherwise use
66328                         // the default.
66329                         return host[renderer[type]] || host._;
66330                 }
66331                 else if ( typeof renderer === 'string' ) {
66332                         // Common renderer - if there is one available for this type use it,
66333                         // otherwise use the default
66334                         return host[renderer] || host._;
66335                 }
66337                 // Use the default
66338                 return host._;
66339         }
66342         /**
66343          * Detect the data source being used for the table. Used to simplify the code
66344          * a little (ajax) and to make it compress a little smaller.
66345          *
66346          *  @param {object} settings dataTables settings object
66347          *  @returns {string} Data source
66348          *  @memberof DataTable#oApi
66349          */
66350         function _fnDataSource ( settings )
66351         {
66352                 if ( settings.oFeatures.bServerSide ) {
66353                         return 'ssp';
66354                 }
66355                 else if ( settings.ajax || settings.sAjaxSource ) {
66356                         return 'ajax';
66357                 }
66358                 return 'dom';
66359         }
66364         /**
66365          * Computed structure of the DataTables API, defined by the options passed to
66366          * `DataTable.Api.register()` when building the API.
66367          *
66368          * The structure is built in order to speed creation and extension of the Api
66369          * objects since the extensions are effectively pre-parsed.
66370          *
66371          * The array is an array of objects with the following structure, where this
66372          * base array represents the Api prototype base:
66373          *
66374          *     [
66375          *       {
66376          *         name:      'data'                -- string   - Property name
66377          *         val:       function () {},       -- function - Api method (or undefined if just an object
66378          *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result
66379          *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property
66380          *       },
66381          *       {
66382          *         name:     'row'
66383          *         val:       {},
66384          *         methodExt: [ ... ],
66385          *         propExt:   [
66386          *           {
66387          *             name:      'data'
66388          *             val:       function () {},
66389          *             methodExt: [ ... ],
66390          *             propExt:   [ ... ]
66391          *           },
66392          *           ...
66393          *         ]
66394          *       }
66395          *     ]
66396          *
66397          * @type {Array}
66398          * @ignore
66399          */
66400         var __apiStruct = [];
66403         /**
66404          * `Array.prototype` reference.
66405          *
66406          * @type object
66407          * @ignore
66408          */
66409         var __arrayProto = Array.prototype;
66412         /**
66413          * Abstraction for `context` parameter of the `Api` constructor to allow it to
66414          * take several different forms for ease of use.
66415          *
66416          * Each of the input parameter types will be converted to a DataTables settings
66417          * object where possible.
66418          *
66419          * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one
66420          *   of:
66421          *
66422          *   * `string` - jQuery selector. Any DataTables' matching the given selector
66423          *     with be found and used.
66424          *   * `node` - `TABLE` node which has already been formed into a DataTable.
66425          *   * `jQuery` - A jQuery object of `TABLE` nodes.
66426          *   * `object` - DataTables settings object
66427          *   * `DataTables.Api` - API instance
66428          * @return {array|null} Matching DataTables settings objects. `null` or
66429          *   `undefined` is returned if no matching DataTable is found.
66430          * @ignore
66431          */
66432         var _toSettings = function ( mixed )
66433         {
66434                 var idx, jq;
66435                 var settings = DataTable.settings;
66436                 var tables = $.map( settings, function (el, i) {
66437                         return el.nTable;
66438                 } );
66440                 if ( ! mixed ) {
66441                         return [];
66442                 }
66443                 else if ( mixed.nTable && mixed.oApi ) {
66444                         // DataTables settings object
66445                         return [ mixed ];
66446                 }
66447                 else if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {
66448                         // Table node
66449                         idx = $.inArray( mixed, tables );
66450                         return idx !== -1 ? [ settings[idx] ] : null;
66451                 }
66452                 else if ( mixed && typeof mixed.settings === 'function' ) {
66453                         return mixed.settings().toArray();
66454                 }
66455                 else if ( typeof mixed === 'string' ) {
66456                         // jQuery selector
66457                         jq = $(mixed);
66458                 }
66459                 else if ( mixed instanceof $ ) {
66460                         // jQuery object (also DataTables instance)
66461                         jq = mixed;
66462                 }
66464                 if ( jq ) {
66465                         return jq.map( function(i) {
66466                                 idx = $.inArray( this, tables );
66467                                 return idx !== -1 ? settings[idx] : null;
66468                         } ).toArray();
66469                 }
66470         };
66473         /**
66474          * DataTables API class - used to control and interface with  one or more
66475          * DataTables enhanced tables.
66476          *
66477          * The API class is heavily based on jQuery, presenting a chainable interface
66478          * that you can use to interact with tables. Each instance of the API class has
66479          * a "context" - i.e. the tables that it will operate on. This could be a single
66480          * table, all tables on a page or a sub-set thereof.
66481          *
66482          * Additionally the API is designed to allow you to easily work with the data in
66483          * the tables, retrieving and manipulating it as required. This is done by
66484          * presenting the API class as an array like interface. The contents of the
66485          * array depend upon the actions requested by each method (for example
66486          * `rows().nodes()` will return an array of nodes, while `rows().data()` will
66487          * return an array of objects or arrays depending upon your table's
66488          * configuration). The API object has a number of array like methods (`push`,
66489          * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,
66490          * `unique` etc) to assist your working with the data held in a table.
66491          *
66492          * Most methods (those which return an Api instance) are chainable, which means
66493          * the return from a method call also has all of the methods available that the
66494          * top level object had. For example, these two calls are equivalent:
66495          *
66496          *     // Not chained
66497          *     api.row.add( {...} );
66498          *     api.draw();
66499          *
66500          *     // Chained
66501          *     api.row.add( {...} ).draw();
66502          *
66503          * @class DataTable.Api
66504          * @param {array|object|string|jQuery} context DataTable identifier. This is
66505          *   used to define which DataTables enhanced tables this API will operate on.
66506          *   Can be one of:
66507          *
66508          *   * `string` - jQuery selector. Any DataTables' matching the given selector
66509          *     with be found and used.
66510          *   * `node` - `TABLE` node which has already been formed into a DataTable.
66511          *   * `jQuery` - A jQuery object of `TABLE` nodes.
66512          *   * `object` - DataTables settings object
66513          * @param {array} [data] Data to initialise the Api instance with.
66514          *
66515          * @example
66516          *   // Direct initialisation during DataTables construction
66517          *   var api = $('#example').DataTable();
66518          *
66519          * @example
66520          *   // Initialisation using a DataTables jQuery object
66521          *   var api = $('#example').dataTable().api();
66522          *
66523          * @example
66524          *   // Initialisation as a constructor
66525          *   var api = new $.fn.DataTable.Api( 'table.dataTable' );
66526          */
66527         _Api = function ( context, data )
66528         {
66529                 if ( ! (this instanceof _Api) ) {
66530                         return new _Api( context, data );
66531                 }
66533                 var settings = [];
66534                 var ctxSettings = function ( o ) {
66535                         var a = _toSettings( o );
66536                         if ( a ) {
66537                                 settings = settings.concat( a );
66538                         }
66539                 };
66541                 if ( $.isArray( context ) ) {
66542                         for ( var i=0, ien=context.length ; i<ien ; i++ ) {
66543                                 ctxSettings( context[i] );
66544                         }
66545                 }
66546                 else {
66547                         ctxSettings( context );
66548                 }
66550                 // Remove duplicates
66551                 this.context = _unique( settings );
66553                 // Initial data
66554                 if ( data ) {
66555                         $.merge( this, data );
66556                 }
66558                 // selector
66559                 this.selector = {
66560                         rows: null,
66561                         cols: null,
66562                         opts: null
66563                 };
66565                 _Api.extend( this, this, __apiStruct );
66566         };
66568         DataTable.Api = _Api;
66570         // Don't destroy the existing prototype, just extend it. Required for jQuery 2's
66571         // isPlainObject.
66572         $.extend( _Api.prototype, {
66573                 any: function ()
66574                 {
66575                         return this.count() !== 0;
66576                 },
66579                 concat:  __arrayProto.concat,
66582                 context: [], // array of table settings objects
66585                 count: function ()
66586                 {
66587                         return this.flatten().length;
66588                 },
66591                 each: function ( fn )
66592                 {
66593                         for ( var i=0, ien=this.length ; i<ien; i++ ) {
66594                                 fn.call( this, this[i], i, this );
66595                         }
66597                         return this;
66598                 },
66601                 eq: function ( idx )
66602                 {
66603                         var ctx = this.context;
66605                         return ctx.length > idx ?
66606                                 new _Api( ctx[idx], this[idx] ) :
66607                                 null;
66608                 },
66611                 filter: function ( fn )
66612                 {
66613                         var a = [];
66615                         if ( __arrayProto.filter ) {
66616                                 a = __arrayProto.filter.call( this, fn, this );
66617                         }
66618                         else {
66619                                 // Compatibility for browsers without EMCA-252-5 (JS 1.6)
66620                                 for ( var i=0, ien=this.length ; i<ien ; i++ ) {
66621                                         if ( fn.call( this, this[i], i, this ) ) {
66622                                                 a.push( this[i] );
66623                                         }
66624                                 }
66625                         }
66627                         return new _Api( this.context, a );
66628                 },
66631                 flatten: function ()
66632                 {
66633                         var a = [];
66634                         return new _Api( this.context, a.concat.apply( a, this.toArray() ) );
66635                 },
66638                 join:    __arrayProto.join,
66641                 indexOf: __arrayProto.indexOf || function (obj, start)
66642                 {
66643                         for ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {
66644                                 if ( this[i] === obj ) {
66645                                         return i;
66646                                 }
66647                         }
66648                         return -1;
66649                 },
66651                 iterator: function ( flatten, type, fn, alwaysNew ) {
66652                         var
66653                                 a = [], ret,
66654                                 i, ien, j, jen,
66655                                 context = this.context,
66656                                 rows, items, item,
66657                                 selector = this.selector;
66659                         // Argument shifting
66660                         if ( typeof flatten === 'string' ) {
66661                                 alwaysNew = fn;
66662                                 fn = type;
66663                                 type = flatten;
66664                                 flatten = false;
66665                         }
66667                         for ( i=0, ien=context.length ; i<ien ; i++ ) {
66668                                 var apiInst = new _Api( context[i] );
66670                                 if ( type === 'table' ) {
66671                                         ret = fn.call( apiInst, context[i], i );
66673                                         if ( ret !== undefined ) {
66674                                                 a.push( ret );
66675                                         }
66676                                 }
66677                                 else if ( type === 'columns' || type === 'rows' ) {
66678                                         // this has same length as context - one entry for each table
66679                                         ret = fn.call( apiInst, context[i], this[i], i );
66681                                         if ( ret !== undefined ) {
66682                                                 a.push( ret );
66683                                         }
66684                                 }
66685                                 else if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {
66686                                         // columns and rows share the same structure.
66687                                         // 'this' is an array of column indexes for each context
66688                                         items = this[i];
66690                                         if ( type === 'column-rows' ) {
66691                                                 rows = _selector_row_indexes( context[i], selector.opts );
66692                                         }
66694                                         for ( j=0, jen=items.length ; j<jen ; j++ ) {
66695                                                 item = items[j];
66697                                                 if ( type === 'cell' ) {
66698                                                         ret = fn.call( apiInst, context[i], item.row, item.column, i, j );
66699                                                 }
66700                                                 else {
66701                                                         ret = fn.call( apiInst, context[i], item, i, j, rows );
66702                                                 }
66704                                                 if ( ret !== undefined ) {
66705                                                         a.push( ret );
66706                                                 }
66707                                         }
66708                                 }
66709                         }
66711                         if ( a.length || alwaysNew ) {
66712                                 var api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );
66713                                 var apiSelector = api.selector;
66714                                 apiSelector.rows = selector.rows;
66715                                 apiSelector.cols = selector.cols;
66716                                 apiSelector.opts = selector.opts;
66717                                 return api;
66718                         }
66719                         return this;
66720                 },
66723                 lastIndexOf: __arrayProto.lastIndexOf || function (obj, start)
66724                 {
66725                         // Bit cheeky...
66726                         return this.indexOf.apply( this.toArray.reverse(), arguments );
66727                 },
66730                 length:  0,
66733                 map: function ( fn )
66734                 {
66735                         var a = [];
66737                         if ( __arrayProto.map ) {
66738                                 a = __arrayProto.map.call( this, fn, this );
66739                         }
66740                         else {
66741                                 // Compatibility for browsers without EMCA-252-5 (JS 1.6)
66742                                 for ( var i=0, ien=this.length ; i<ien ; i++ ) {
66743                                         a.push( fn.call( this, this[i], i ) );
66744                                 }
66745                         }
66747                         return new _Api( this.context, a );
66748                 },
66751                 pluck: function ( prop )
66752                 {
66753                         return this.map( function ( el ) {
66754                                 return el[ prop ];
66755                         } );
66756                 },
66758                 pop:     __arrayProto.pop,
66761                 push:    __arrayProto.push,
66764                 // Does not return an API instance
66765                 reduce: __arrayProto.reduce || function ( fn, init )
66766                 {
66767                         return _fnReduce( this, fn, init, 0, this.length, 1 );
66768                 },
66771                 reduceRight: __arrayProto.reduceRight || function ( fn, init )
66772                 {
66773                         return _fnReduce( this, fn, init, this.length-1, -1, -1 );
66774                 },
66777                 reverse: __arrayProto.reverse,
66780                 // Object with rows, columns and opts
66781                 selector: null,
66784                 shift:   __arrayProto.shift,
66787                 slice: function () {
66788                         return new _Api( this.context, this );
66789                 },
66792                 sort:    __arrayProto.sort, // ? name - order?
66795                 splice:  __arrayProto.splice,
66798                 toArray: function ()
66799                 {
66800                         return __arrayProto.slice.call( this );
66801                 },
66804                 to$: function ()
66805                 {
66806                         return $( this );
66807                 },
66810                 toJQuery: function ()
66811                 {
66812                         return $( this );
66813                 },
66816                 unique: function ()
66817                 {
66818                         return new _Api( this.context, _unique(this) );
66819                 },
66822                 unshift: __arrayProto.unshift
66823         } );
66826         _Api.extend = function ( scope, obj, ext )
66827         {
66828                 // Only extend API instances and static properties of the API
66829                 if ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {
66830                         return;
66831                 }
66833                 var
66834                         i, ien,
66835                         j, jen,
66836                         struct, inner,
66837                         methodScoping = function ( scope, fn, struc ) {
66838                                 return function () {
66839                                         var ret = fn.apply( scope, arguments );
66841                                         // Method extension
66842                                         _Api.extend( ret, ret, struc.methodExt );
66843                                         return ret;
66844                                 };
66845                         };
66847                 for ( i=0, ien=ext.length ; i<ien ; i++ ) {
66848                         struct = ext[i];
66850                         // Value
66851                         obj[ struct.name ] = typeof struct.val === 'function' ?
66852                                 methodScoping( scope, struct.val, struct ) :
66853                                 $.isPlainObject( struct.val ) ?
66854                                         {} :
66855                                         struct.val;
66857                         obj[ struct.name ].__dt_wrapper = true;
66859                         // Property extension
66860                         _Api.extend( scope, obj[ struct.name ], struct.propExt );
66861                 }
66862         };
66865         // @todo - Is there need for an augment function?
66866         // _Api.augment = function ( inst, name )
66867         // {
66868         //      // Find src object in the structure from the name
66869         //      var parts = name.split('.');
66871         //      _Api.extend( inst, obj );
66872         // };
66875         //     [
66876         //       {
66877         //         name:      'data'                -- string   - Property name
66878         //         val:       function () {},       -- function - Api method (or undefined if just an object
66879         //         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result
66880         //         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property
66881         //       },
66882         //       {
66883         //         name:     'row'
66884         //         val:       {},
66885         //         methodExt: [ ... ],
66886         //         propExt:   [
66887         //           {
66888         //             name:      'data'
66889         //             val:       function () {},
66890         //             methodExt: [ ... ],
66891         //             propExt:   [ ... ]
66892         //           },
66893         //           ...
66894         //         ]
66895         //       }
66896         //     ]
66898         _Api.register = _api_register = function ( name, val )
66899         {
66900                 if ( $.isArray( name ) ) {
66901                         for ( var j=0, jen=name.length ; j<jen ; j++ ) {
66902                                 _Api.register( name[j], val );
66903                         }
66904                         return;
66905                 }
66907                 var
66908                         i, ien,
66909                         heir = name.split('.'),
66910                         struct = __apiStruct,
66911                         key, method;
66913                 var find = function ( src, name ) {
66914                         for ( var i=0, ien=src.length ; i<ien ; i++ ) {
66915                                 if ( src[i].name === name ) {
66916                                         return src[i];
66917                                 }
66918                         }
66919                         return null;
66920                 };
66922                 for ( i=0, ien=heir.length ; i<ien ; i++ ) {
66923                         method = heir[i].indexOf('()') !== -1;
66924                         key = method ?
66925                                 heir[i].replace('()', '') :
66926                                 heir[i];
66928                         var src = find( struct, key );
66929                         if ( ! src ) {
66930                                 src = {
66931                                         name:      key,
66932                                         val:       {},
66933                                         methodExt: [],
66934                                         propExt:   []
66935                                 };
66936                                 struct.push( src );
66937                         }
66939                         if ( i === ien-1 ) {
66940                                 src.val = val;
66941                         }
66942                         else {
66943                                 struct = method ?
66944                                         src.methodExt :
66945                                         src.propExt;
66946                         }
66947                 }
66948         };
66951         _Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {
66952                 _Api.register( pluralName, val );
66954                 _Api.register( singularName, function () {
66955                         var ret = val.apply( this, arguments );
66957                         if ( ret === this ) {
66958                                 // Returned item is the API instance that was passed in, return it
66959                                 return this;
66960                         }
66961                         else if ( ret instanceof _Api ) {
66962                                 // New API instance returned, want the value from the first item
66963                                 // in the returned array for the singular result.
66964                                 return ret.length ?
66965                                         $.isArray( ret[0] ) ?
66966                                                 new _Api( ret.context, ret[0] ) : // Array results are 'enhanced'
66967                                                 ret[0] :
66968                                         undefined;
66969                         }
66971                         // Non-API return - just fire it back
66972                         return ret;
66973                 } );
66974         };
66977         /**
66978          * Selector for HTML tables. Apply the given selector to the give array of
66979          * DataTables settings objects.
66980          *
66981          * @param {string|integer} [selector] jQuery selector string or integer
66982          * @param  {array} Array of DataTables settings objects to be filtered
66983          * @return {array}
66984          * @ignore
66985          */
66986         var __table_selector = function ( selector, a )
66987         {
66988                 // Integer is used to pick out a table by index
66989                 if ( typeof selector === 'number' ) {
66990                         return [ a[ selector ] ];
66991                 }
66993                 // Perform a jQuery selector on the table nodes
66994                 var nodes = $.map( a, function (el, i) {
66995                         return el.nTable;
66996                 } );
66998                 return $(nodes)
66999                         .filter( selector )
67000                         .map( function (i) {
67001                                 // Need to translate back from the table node to the settings
67002                                 var idx = $.inArray( this, nodes );
67003                                 return a[ idx ];
67004                         } )
67005                         .toArray();
67006         };
67010         /**
67011          * Context selector for the API's context (i.e. the tables the API instance
67012          * refers to.
67013          *
67014          * @name    DataTable.Api#tables
67015          * @param {string|integer} [selector] Selector to pick which tables the iterator
67016          *   should operate on. If not given, all tables in the current context are
67017          *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to
67018          *   select multiple tables or as an integer to select a single table.
67019          * @returns {DataTable.Api} Returns a new API instance if a selector is given.
67020          */
67021         _api_register( 'tables()', function ( selector ) {
67022                 // A new instance is created if there was a selector specified
67023                 return selector ?
67024                         new _Api( __table_selector( selector, this.context ) ) :
67025                         this;
67026         } );
67029         _api_register( 'table()', function ( selector ) {
67030                 var tables = this.tables( selector );
67031                 var ctx = tables.context;
67033                 // Truncate to the first matched table
67034                 return ctx.length ?
67035                         new _Api( ctx[0] ) :
67036                         tables;
67037         } );
67040         _api_registerPlural( 'tables().nodes()', 'table().node()' , function () {
67041                 return this.iterator( 'table', function ( ctx ) {
67042                         return ctx.nTable;
67043                 }, 1 );
67044         } );
67047         _api_registerPlural( 'tables().body()', 'table().body()' , function () {
67048                 return this.iterator( 'table', function ( ctx ) {
67049                         return ctx.nTBody;
67050                 }, 1 );
67051         } );
67054         _api_registerPlural( 'tables().header()', 'table().header()' , function () {
67055                 return this.iterator( 'table', function ( ctx ) {
67056                         return ctx.nTHead;
67057                 }, 1 );
67058         } );
67061         _api_registerPlural( 'tables().footer()', 'table().footer()' , function () {
67062                 return this.iterator( 'table', function ( ctx ) {
67063                         return ctx.nTFoot;
67064                 }, 1 );
67065         } );
67068         _api_registerPlural( 'tables().containers()', 'table().container()' , function () {
67069                 return this.iterator( 'table', function ( ctx ) {
67070                         return ctx.nTableWrapper;
67071                 }, 1 );
67072         } );
67076         /**
67077          * Redraw the tables in the current context.
67078          */
67079         _api_register( 'draw()', function ( paging ) {
67080                 return this.iterator( 'table', function ( settings ) {
67081                         if ( paging === 'page' ) {
67082                                 _fnDraw( settings );
67083                         }
67084                         else {
67085                                 if ( typeof paging === 'string' ) {
67086                                         paging = paging === 'full-hold' ?
67087                                                 false :
67088                                                 true;
67089                                 }
67091                                 _fnReDraw( settings, paging===false );
67092                         }
67093                 } );
67094         } );
67098         /**
67099          * Get the current page index.
67100          *
67101          * @return {integer} Current page index (zero based)
67102          *//**
67103          * Set the current page.
67104          *
67105          * Note that if you attempt to show a page which does not exist, DataTables will
67106          * not throw an error, but rather reset the paging.
67107          *
67108          * @param {integer|string} action The paging action to take. This can be one of:
67109          *  * `integer` - The page index to jump to
67110          *  * `string` - An action to take:
67111          *    * `first` - Jump to first page.
67112          *    * `next` - Jump to the next page
67113          *    * `previous` - Jump to previous page
67114          *    * `last` - Jump to the last page.
67115          * @returns {DataTables.Api} this
67116          */
67117         _api_register( 'page()', function ( action ) {
67118                 if ( action === undefined ) {
67119                         return this.page.info().page; // not an expensive call
67120                 }
67122                 // else, have an action to take on all tables
67123                 return this.iterator( 'table', function ( settings ) {
67124                         _fnPageChange( settings, action );
67125                 } );
67126         } );
67129         /**
67130          * Paging information for the first table in the current context.
67131          *
67132          * If you require paging information for another table, use the `table()` method
67133          * with a suitable selector.
67134          *
67135          * @return {object} Object with the following properties set:
67136          *  * `page` - Current page index (zero based - i.e. the first page is `0`)
67137          *  * `pages` - Total number of pages
67138          *  * `start` - Display index for the first record shown on the current page
67139          *  * `end` - Display index for the last record shown on the current page
67140          *  * `length` - Display length (number of records). Note that generally `start
67141          *    + length = end`, but this is not always true, for example if there are
67142          *    only 2 records to show on the final page, with a length of 10.
67143          *  * `recordsTotal` - Full data set length
67144          *  * `recordsDisplay` - Data set length once the current filtering criterion
67145          *    are applied.
67146          */
67147         _api_register( 'page.info()', function ( action ) {
67148                 if ( this.context.length === 0 ) {
67149                         return undefined;
67150                 }
67152                 var
67153                         settings   = this.context[0],
67154                         start      = settings._iDisplayStart,
67155                         len        = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1,
67156                         visRecords = settings.fnRecordsDisplay(),
67157                         all        = len === -1;
67159                 return {
67160                         "page":           all ? 0 : Math.floor( start / len ),
67161                         "pages":          all ? 1 : Math.ceil( visRecords / len ),
67162                         "start":          start,
67163                         "end":            settings.fnDisplayEnd(),
67164                         "length":         len,
67165                         "recordsTotal":   settings.fnRecordsTotal(),
67166                         "recordsDisplay": visRecords,
67167                         "serverSide":     _fnDataSource( settings ) === 'ssp'
67168                 };
67169         } );
67172         /**
67173          * Get the current page length.
67174          *
67175          * @return {integer} Current page length. Note `-1` indicates that all records
67176          *   are to be shown.
67177          *//**
67178          * Set the current page length.
67179          *
67180          * @param {integer} Page length to set. Use `-1` to show all records.
67181          * @returns {DataTables.Api} this
67182          */
67183         _api_register( 'page.len()', function ( len ) {
67184                 // Note that we can't call this function 'length()' because `length`
67185                 // is a Javascript property of functions which defines how many arguments
67186                 // the function expects.
67187                 if ( len === undefined ) {
67188                         return this.context.length !== 0 ?
67189                                 this.context[0]._iDisplayLength :
67190                                 undefined;
67191                 }
67193                 // else, set the page length
67194                 return this.iterator( 'table', function ( settings ) {
67195                         _fnLengthChange( settings, len );
67196                 } );
67197         } );
67201         var __reload = function ( settings, holdPosition, callback ) {
67202                 // Use the draw event to trigger a callback
67203                 if ( callback ) {
67204                         var api = new _Api( settings );
67206                         api.one( 'draw', function () {
67207                                 callback( api.ajax.json() );
67208                         } );
67209                 }
67211                 if ( _fnDataSource( settings ) == 'ssp' ) {
67212                         _fnReDraw( settings, holdPosition );
67213                 }
67214                 else {
67215                         _fnProcessingDisplay( settings, true );
67217                         // Cancel an existing request
67218                         var xhr = settings.jqXHR;
67219                         if ( xhr && xhr.readyState !== 4 ) {
67220                                 xhr.abort();
67221                         }
67223                         // Trigger xhr
67224                         _fnBuildAjax( settings, [], function( json ) {
67225                                 _fnClearTable( settings );
67227                                 var data = _fnAjaxDataSrc( settings, json );
67228                                 for ( var i=0, ien=data.length ; i<ien ; i++ ) {
67229                                         _fnAddData( settings, data[i] );
67230                                 }
67232                                 _fnReDraw( settings, holdPosition );
67233                                 _fnProcessingDisplay( settings, false );
67234                         } );
67235                 }
67236         };
67239         /**
67240          * Get the JSON response from the last Ajax request that DataTables made to the
67241          * server. Note that this returns the JSON from the first table in the current
67242          * context.
67243          *
67244          * @return {object} JSON received from the server.
67245          */
67246         _api_register( 'ajax.json()', function () {
67247                 var ctx = this.context;
67249                 if ( ctx.length > 0 ) {
67250                         return ctx[0].json;
67251                 }
67253                 // else return undefined;
67254         } );
67257         /**
67258          * Get the data submitted in the last Ajax request
67259          */
67260         _api_register( 'ajax.params()', function () {
67261                 var ctx = this.context;
67263                 if ( ctx.length > 0 ) {
67264                         return ctx[0].oAjaxData;
67265                 }
67267                 // else return undefined;
67268         } );
67271         /**
67272          * Reload tables from the Ajax data source. Note that this function will
67273          * automatically re-draw the table when the remote data has been loaded.
67274          *
67275          * @param {boolean} [reset=true] Reset (default) or hold the current paging
67276          *   position. A full re-sort and re-filter is performed when this method is
67277          *   called, which is why the pagination reset is the default action.
67278          * @returns {DataTables.Api} this
67279          */
67280         _api_register( 'ajax.reload()', function ( callback, resetPaging ) {
67281                 return this.iterator( 'table', function (settings) {
67282                         __reload( settings, resetPaging===false, callback );
67283                 } );
67284         } );
67287         /**
67288          * Get the current Ajax URL. Note that this returns the URL from the first
67289          * table in the current context.
67290          *
67291          * @return {string} Current Ajax source URL
67292          *//**
67293          * Set the Ajax URL. Note that this will set the URL for all tables in the
67294          * current context.
67295          *
67296          * @param {string} url URL to set.
67297          * @returns {DataTables.Api} this
67298          */
67299         _api_register( 'ajax.url()', function ( url ) {
67300                 var ctx = this.context;
67302                 if ( url === undefined ) {
67303                         // get
67304                         if ( ctx.length === 0 ) {
67305                                 return undefined;
67306                         }
67307                         ctx = ctx[0];
67309                         return ctx.ajax ?
67310                                 $.isPlainObject( ctx.ajax ) ?
67311                                         ctx.ajax.url :
67312                                         ctx.ajax :
67313                                 ctx.sAjaxSource;
67314                 }
67316                 // set
67317                 return this.iterator( 'table', function ( settings ) {
67318                         if ( $.isPlainObject( settings.ajax ) ) {
67319                                 settings.ajax.url = url;
67320                         }
67321                         else {
67322                                 settings.ajax = url;
67323                         }
67324                         // No need to consider sAjaxSource here since DataTables gives priority
67325                         // to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any
67326                         // value of `sAjaxSource` redundant.
67327                 } );
67328         } );
67331         /**
67332          * Load data from the newly set Ajax URL. Note that this method is only
67333          * available when `ajax.url()` is used to set a URL. Additionally, this method
67334          * has the same effect as calling `ajax.reload()` but is provided for
67335          * convenience when setting a new URL. Like `ajax.reload()` it will
67336          * automatically redraw the table once the remote data has been loaded.
67337          *
67338          * @returns {DataTables.Api} this
67339          */
67340         _api_register( 'ajax.url().load()', function ( callback, resetPaging ) {
67341                 // Same as a reload, but makes sense to present it for easy access after a
67342                 // url change
67343                 return this.iterator( 'table', function ( ctx ) {
67344                         __reload( ctx, resetPaging===false, callback );
67345                 } );
67346         } );
67351         var _selector_run = function ( type, selector, selectFn, settings, opts )
67352         {
67353                 var
67354                         out = [], res,
67355                         a, i, ien, j, jen,
67356                         selectorType = typeof selector;
67358                 // Can't just check for isArray here, as an API or jQuery instance might be
67359                 // given with their array like look
67360                 if ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {
67361                         selector = [ selector ];
67362                 }
67364                 for ( i=0, ien=selector.length ; i<ien ; i++ ) {
67365                         // Only split on simple strings - complex expressions will be jQuery selectors
67366                         a = selector[i] && selector[i].split && ! selector[i].match(/[\[\(:]/) ?
67367                                 selector[i].split(',') :
67368                                 [ selector[i] ];
67370                         for ( j=0, jen=a.length ; j<jen ; j++ ) {
67371                                 res = selectFn( typeof a[j] === 'string' ? $.trim(a[j]) : a[j] );
67373                                 if ( res && res.length ) {
67374                                         out = out.concat( res );
67375                                 }
67376                         }
67377                 }
67379                 // selector extensions
67380                 var ext = _ext.selector[ type ];
67381                 if ( ext.length ) {
67382                         for ( i=0, ien=ext.length ; i<ien ; i++ ) {
67383                                 out = ext[i]( settings, opts, out );
67384                         }
67385                 }
67387                 return _unique( out );
67388         };
67391         var _selector_opts = function ( opts )
67392         {
67393                 if ( ! opts ) {
67394                         opts = {};
67395                 }
67397                 // Backwards compatibility for 1.9- which used the terminology filter rather
67398                 // than search
67399                 if ( opts.filter && opts.search === undefined ) {
67400                         opts.search = opts.filter;
67401                 }
67403                 return $.extend( {
67404                         search: 'none',
67405                         order: 'current',
67406                         page: 'all'
67407                 }, opts );
67408         };
67411         var _selector_first = function ( inst )
67412         {
67413                 // Reduce the API instance to the first item found
67414                 for ( var i=0, ien=inst.length ; i<ien ; i++ ) {
67415                         if ( inst[i].length > 0 ) {
67416                                 // Assign the first element to the first item in the instance
67417                                 // and truncate the instance and context
67418                                 inst[0] = inst[i];
67419                                 inst[0].length = 1;
67420                                 inst.length = 1;
67421                                 inst.context = [ inst.context[i] ];
67423                                 return inst;
67424                         }
67425                 }
67427                 // Not found - return an empty instance
67428                 inst.length = 0;
67429                 return inst;
67430         };
67433         var _selector_row_indexes = function ( settings, opts )
67434         {
67435                 var
67436                         i, ien, tmp, a=[],
67437                         displayFiltered = settings.aiDisplay,
67438                         displayMaster = settings.aiDisplayMaster;
67440                 var
67441                         search = opts.search,  // none, applied, removed
67442                         order  = opts.order,   // applied, current, index (original - compatibility with 1.9)
67443                         page   = opts.page;    // all, current
67445                 if ( _fnDataSource( settings ) == 'ssp' ) {
67446                         // In server-side processing mode, most options are irrelevant since
67447                         // rows not shown don't exist and the index order is the applied order
67448                         // Removed is a special case - for consistency just return an empty
67449                         // array
67450                         return search === 'removed' ?
67451                                 [] :
67452                                 _range( 0, displayMaster.length );
67453                 }
67454                 else if ( page == 'current' ) {
67455                         // Current page implies that order=current and fitler=applied, since it is
67456                         // fairly senseless otherwise, regardless of what order and search actually
67457                         // are
67458                         for ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {
67459                                 a.push( displayFiltered[i] );
67460                         }
67461                 }
67462                 else if ( order == 'current' || order == 'applied' ) {
67463                         if ( search == 'none') {
67464                                 a = displayMaster.slice();
67465                         }
67466                         else if ( search == 'applied' ) {
67467                                 a = displayFiltered.slice();
67468                         }
67469                         else if ( search == 'removed' ) {
67470                                 // O(n+m) solution by creating a hash map
67471                                 var displayFilteredMap = {};
67473                                 for ( var i=0, ien=displayFiltered.length ; i<ien ; i++ ) {
67474                                         displayFilteredMap[displayFiltered[i]] = null;
67475                                 }
67477                                 a = $.map( displayMaster, function (el) {
67478                                         return ! displayFilteredMap.hasOwnProperty(el) ?
67479                                                 el :
67480                                                 null;
67481                                 } );
67482                         }
67483                 }
67484                 else if ( order == 'index' || order == 'original' ) {
67485                         for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
67486                                 if ( search == 'none' ) {
67487                                         a.push( i );
67488                                 }
67489                                 else { // applied | removed
67490                                         tmp = $.inArray( i, displayFiltered );
67492                                         if ((tmp === -1 && search == 'removed') ||
67493                                                 (tmp >= 0   && search == 'applied') )
67494                                         {
67495                                                 a.push( i );
67496                                         }
67497                                 }
67498                         }
67499                 }
67501                 return a;
67502         };
67505         /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
67506          * Rows
67507          *
67508          * {}          - no selector - use all available rows
67509          * {integer}   - row aoData index
67510          * {node}      - TR node
67511          * {string}    - jQuery selector to apply to the TR elements
67512          * {array}     - jQuery array of nodes, or simply an array of TR nodes
67513          *
67514          */
67515         var __row_selector = function ( settings, selector, opts )
67516         {
67517                 var rows;
67518                 var run = function ( sel ) {
67519                         var selInt = _intVal( sel );
67520                         var i, ien;
67521                         var aoData = settings.aoData;
67523                         // Short cut - selector is a number and no options provided (default is
67524                         // all records, so no need to check if the index is in there, since it
67525                         // must be - dev error if the index doesn't exist).
67526                         if ( selInt !== null && ! opts ) {
67527                                 return [ selInt ];
67528                         }
67530                         if ( ! rows ) {
67531                                 rows = _selector_row_indexes( settings, opts );
67532                         }
67534                         if ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {
67535                                 // Selector - integer
67536                                 return [ selInt ];
67537                         }
67538                         else if ( sel === null || sel === undefined || sel === '' ) {
67539                                 // Selector - none
67540                                 return rows;
67541                         }
67543                         // Selector - function
67544                         if ( typeof sel === 'function' ) {
67545                                 return $.map( rows, function (idx) {
67546                                         var row = aoData[ idx ];
67547                                         return sel( idx, row._aData, row.nTr ) ? idx : null;
67548                                 } );
67549                         }
67551                         // Selector - node
67552                         if ( sel.nodeName ) {
67553                                 var rowIdx = sel._DT_RowIndex;  // Property added by DT for fast lookup
67554                                 var cellIdx = sel._DT_CellIndex;
67556                                 if ( rowIdx !== undefined ) {
67557                                         // Make sure that the row is actually still present in the table
67558                                         return aoData[ rowIdx ] && aoData[ rowIdx ].nTr === sel ?
67559                                                 [ rowIdx ] :
67560                                                 [];
67561                                 }
67562                                 else if ( cellIdx ) {
67563                                         return aoData[ cellIdx.row ] && aoData[ cellIdx.row ].nTr === sel ?
67564                                                 [ cellIdx.row ] :
67565                                                 [];
67566                                 }
67567                                 else {
67568                                         var host = $(sel).closest('*[data-dt-row]');
67569                                         return host.length ?
67570                                                 [ host.data('dt-row') ] :
67571                                                 [];
67572                                 }
67573                         }
67575                         // ID selector. Want to always be able to select rows by id, regardless
67576                         // of if the tr element has been created or not, so can't rely upon
67577                         // jQuery here - hence a custom implementation. This does not match
67578                         // Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,
67579                         // but to select it using a CSS selector engine (like Sizzle or
67580                         // querySelect) it would need to need to be escaped for some characters.
67581                         // DataTables simplifies this for row selectors since you can select
67582                         // only a row. A # indicates an id any anything that follows is the id -
67583                         // unescaped.
67584                         if ( typeof sel === 'string' && sel.charAt(0) === '#' ) {
67585                                 // get row index from id
67586                                 var rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];
67587                                 if ( rowObj !== undefined ) {
67588                                         return [ rowObj.idx ];
67589                                 }
67591                                 // need to fall through to jQuery in case there is DOM id that
67592                                 // matches
67593                         }
67595                         // Get nodes in the order from the `rows` array with null values removed
67596                         var nodes = _removeEmpty(
67597                                 _pluck_order( settings.aoData, rows, 'nTr' )
67598                         );
67600                         // Selector - jQuery selector string, array of nodes or jQuery object/
67601                         // As jQuery's .filter() allows jQuery objects to be passed in filter,
67602                         // it also allows arrays, so this will cope with all three options
67603                         return $(nodes)
67604                                 .filter( sel )
67605                                 .map( function () {
67606                                         return this._DT_RowIndex;
67607                                 } )
67608                                 .toArray();
67609                 };
67611                 return _selector_run( 'row', selector, run, settings, opts );
67612         };
67615         _api_register( 'rows()', function ( selector, opts ) {
67616                 // argument shifting
67617                 if ( selector === undefined ) {
67618                         selector = '';
67619                 }
67620                 else if ( $.isPlainObject( selector ) ) {
67621                         opts = selector;
67622                         selector = '';
67623                 }
67625                 opts = _selector_opts( opts );
67627                 var inst = this.iterator( 'table', function ( settings ) {
67628                         return __row_selector( settings, selector, opts );
67629                 }, 1 );
67631                 // Want argument shifting here and in __row_selector?
67632                 inst.selector.rows = selector;
67633                 inst.selector.opts = opts;
67635                 return inst;
67636         } );
67638         _api_register( 'rows().nodes()', function () {
67639                 return this.iterator( 'row', function ( settings, row ) {
67640                         return settings.aoData[ row ].nTr || undefined;
67641                 }, 1 );
67642         } );
67644         _api_register( 'rows().data()', function () {
67645                 return this.iterator( true, 'rows', function ( settings, rows ) {
67646                         return _pluck_order( settings.aoData, rows, '_aData' );
67647                 }, 1 );
67648         } );
67650         _api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {
67651                 return this.iterator( 'row', function ( settings, row ) {
67652                         var r = settings.aoData[ row ];
67653                         return type === 'search' ? r._aFilterData : r._aSortData;
67654                 }, 1 );
67655         } );
67657         _api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {
67658                 return this.iterator( 'row', function ( settings, row ) {
67659                         _fnInvalidate( settings, row, src );
67660                 } );
67661         } );
67663         _api_registerPlural( 'rows().indexes()', 'row().index()', function () {
67664                 return this.iterator( 'row', function ( settings, row ) {
67665                         return row;
67666                 }, 1 );
67667         } );
67669         _api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {
67670                 var a = [];
67671                 var context = this.context;
67673                 // `iterator` will drop undefined values, but in this case we want them
67674                 for ( var i=0, ien=context.length ; i<ien ; i++ ) {
67675                         for ( var j=0, jen=this[i].length ; j<jen ; j++ ) {
67676                                 var id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData );
67677                                 a.push( (hash === true ? '#' : '' )+ id );
67678                         }
67679                 }
67681                 return new _Api( context, a );
67682         } );
67684         _api_registerPlural( 'rows().remove()', 'row().remove()', function () {
67685                 var that = this;
67687                 this.iterator( 'row', function ( settings, row, thatIdx ) {
67688                         var data = settings.aoData;
67689                         var rowData = data[ row ];
67690                         var i, ien, j, jen;
67691                         var loopRow, loopCells;
67693                         data.splice( row, 1 );
67695                         // Update the cached indexes
67696                         for ( i=0, ien=data.length ; i<ien ; i++ ) {
67697                                 loopRow = data[i];
67698                                 loopCells = loopRow.anCells;
67700                                 // Rows
67701                                 if ( loopRow.nTr !== null ) {
67702                                         loopRow.nTr._DT_RowIndex = i;
67703                                 }
67705                                 // Cells
67706                                 if ( loopCells !== null ) {
67707                                         for ( j=0, jen=loopCells.length ; j<jen ; j++ ) {
67708                                                 loopCells[j]._DT_CellIndex.row = i;
67709                                         }
67710                                 }
67711                         }
67713                         // Delete from the display arrays
67714                         _fnDeleteIndex( settings.aiDisplayMaster, row );
67715                         _fnDeleteIndex( settings.aiDisplay, row );
67716                         _fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes
67718                         // For server-side processing tables - subtract the deleted row from the count
67719                         if ( settings._iRecordsDisplay > 0 ) {
67720                                 settings._iRecordsDisplay--;
67721                         }
67723                         // Check for an 'overflow' they case for displaying the table
67724                         _fnLengthOverflow( settings );
67726                         // Remove the row's ID reference if there is one
67727                         var id = settings.rowIdFn( rowData._aData );
67728                         if ( id !== undefined ) {
67729                                 delete settings.aIds[ id ];
67730                         }
67731                 } );
67733                 this.iterator( 'table', function ( settings ) {
67734                         for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
67735                                 settings.aoData[i].idx = i;
67736                         }
67737                 } );
67739                 return this;
67740         } );
67743         _api_register( 'rows.add()', function ( rows ) {
67744                 var newRows = this.iterator( 'table', function ( settings ) {
67745                                 var row, i, ien;
67746                                 var out = [];
67748                                 for ( i=0, ien=rows.length ; i<ien ; i++ ) {
67749                                         row = rows[i];
67751                                         if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
67752                                                 out.push( _fnAddTr( settings, row )[0] );
67753                                         }
67754                                         else {
67755                                                 out.push( _fnAddData( settings, row ) );
67756                                         }
67757                                 }
67759                                 return out;
67760                         }, 1 );
67762                 // Return an Api.rows() extended instance, so rows().nodes() etc can be used
67763                 var modRows = this.rows( -1 );
67764                 modRows.pop();
67765                 $.merge( modRows, newRows );
67767                 return modRows;
67768         } );
67774         /**
67775          *
67776          */
67777         _api_register( 'row()', function ( selector, opts ) {
67778                 return _selector_first( this.rows( selector, opts ) );
67779         } );
67782         _api_register( 'row().data()', function ( data ) {
67783                 var ctx = this.context;
67785                 if ( data === undefined ) {
67786                         // Get
67787                         return ctx.length && this.length ?
67788                                 ctx[0].aoData[ this[0] ]._aData :
67789                                 undefined;
67790                 }
67792                 // Set
67793                 var row = ctx[0].aoData[ this[0] ];
67794                 row._aData = data;
67796                 // If the DOM has an id, and the data source is an array
67797                 if ( $.isArray( data ) && row.nTr.id ) {
67798                         _fnSetObjectDataFn( ctx[0].rowId )( data, row.nTr.id );
67799                 }
67801                 // Automatically invalidate
67802                 _fnInvalidate( ctx[0], this[0], 'data' );
67804                 return this;
67805         } );
67808         _api_register( 'row().node()', function () {
67809                 var ctx = this.context;
67811                 return ctx.length && this.length ?
67812                         ctx[0].aoData[ this[0] ].nTr || null :
67813                         null;
67814         } );
67817         _api_register( 'row.add()', function ( row ) {
67818                 // Allow a jQuery object to be passed in - only a single row is added from
67819                 // it though - the first element in the set
67820                 if ( row instanceof $ && row.length ) {
67821                         row = row[0];
67822                 }
67824                 var rows = this.iterator( 'table', function ( settings ) {
67825                         if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
67826                                 return _fnAddTr( settings, row )[0];
67827                         }
67828                         return _fnAddData( settings, row );
67829                 } );
67831                 // Return an Api.rows() extended instance, with the newly added row selected
67832                 return this.row( rows[0] );
67833         } );
67837         var __details_add = function ( ctx, row, data, klass )
67838         {
67839                 // Convert to array of TR elements
67840                 var rows = [];
67841                 var addRow = function ( r, k ) {
67842                         // Recursion to allow for arrays of jQuery objects
67843                         if ( $.isArray( r ) || r instanceof $ ) {
67844                                 for ( var i=0, ien=r.length ; i<ien ; i++ ) {
67845                                         addRow( r[i], k );
67846                                 }
67847                                 return;
67848                         }
67850                         // If we get a TR element, then just add it directly - up to the dev
67851                         // to add the correct number of columns etc
67852                         if ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {
67853                                 rows.push( r );
67854                         }
67855                         else {
67856                                 // Otherwise create a row with a wrapper
67857                                 var created = $('<tr><td/></tr>').addClass( k );
67858                                 $('td', created)
67859                                         .addClass( k )
67860                                         .html( r )
67861                                         [0].colSpan = _fnVisbleColumns( ctx );
67863                                 rows.push( created[0] );
67864                         }
67865                 };
67867                 addRow( data, klass );
67869                 if ( row._details ) {
67870                         row._details.detach();
67871                 }
67873                 row._details = $(rows);
67875                 // If the children were already shown, that state should be retained
67876                 if ( row._detailsShow ) {
67877                         row._details.insertAfter( row.nTr );
67878                 }
67879         };
67882         var __details_remove = function ( api, idx )
67883         {
67884                 var ctx = api.context;
67886                 if ( ctx.length ) {
67887                         var row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];
67889                         if ( row && row._details ) {
67890                                 row._details.remove();
67892                                 row._detailsShow = undefined;
67893                                 row._details = undefined;
67894                         }
67895                 }
67896         };
67899         var __details_display = function ( api, show ) {
67900                 var ctx = api.context;
67902                 if ( ctx.length && api.length ) {
67903                         var row = ctx[0].aoData[ api[0] ];
67905                         if ( row._details ) {
67906                                 row._detailsShow = show;
67908                                 if ( show ) {
67909                                         row._details.insertAfter( row.nTr );
67910                                 }
67911                                 else {
67912                                         row._details.detach();
67913                                 }
67915                                 __details_events( ctx[0] );
67916                         }
67917                 }
67918         };
67921         var __details_events = function ( settings )
67922         {
67923                 var api = new _Api( settings );
67924                 var namespace = '.dt.DT_details';
67925                 var drawEvent = 'draw'+namespace;
67926                 var colvisEvent = 'column-visibility'+namespace;
67927                 var destroyEvent = 'destroy'+namespace;
67928                 var data = settings.aoData;
67930                 api.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );
67932                 if ( _pluck( data, '_details' ).length > 0 ) {
67933                         // On each draw, insert the required elements into the document
67934                         api.on( drawEvent, function ( e, ctx ) {
67935                                 if ( settings !== ctx ) {
67936                                         return;
67937                                 }
67939                                 api.rows( {page:'current'} ).eq(0).each( function (idx) {
67940                                         // Internal data grab
67941                                         var row = data[ idx ];
67943                                         if ( row._detailsShow ) {
67944                                                 row._details.insertAfter( row.nTr );
67945                                         }
67946                                 } );
67947                         } );
67949                         // Column visibility change - update the colspan
67950                         api.on( colvisEvent, function ( e, ctx, idx, vis ) {
67951                                 if ( settings !== ctx ) {
67952                                         return;
67953                                 }
67955                                 // Update the colspan for the details rows (note, only if it already has
67956                                 // a colspan)
67957                                 var row, visible = _fnVisbleColumns( ctx );
67959                                 for ( var i=0, ien=data.length ; i<ien ; i++ ) {
67960                                         row = data[i];
67962                                         if ( row._details ) {
67963                                                 row._details.children('td[colspan]').attr('colspan', visible );
67964                                         }
67965                                 }
67966                         } );
67968                         // Table destroyed - nuke any child rows
67969                         api.on( destroyEvent, function ( e, ctx ) {
67970                                 if ( settings !== ctx ) {
67971                                         return;
67972                                 }
67974                                 for ( var i=0, ien=data.length ; i<ien ; i++ ) {
67975                                         if ( data[i]._details ) {
67976                                                 __details_remove( api, i );
67977                                         }
67978                                 }
67979                         } );
67980                 }
67981         };
67983         // Strings for the method names to help minification
67984         var _emp = '';
67985         var _child_obj = _emp+'row().child';
67986         var _child_mth = _child_obj+'()';
67988         // data can be:
67989         //  tr
67990         //  string
67991         //  jQuery or array of any of the above
67992         _api_register( _child_mth, function ( data, klass ) {
67993                 var ctx = this.context;
67995                 if ( data === undefined ) {
67996                         // get
67997                         return ctx.length && this.length ?
67998                                 ctx[0].aoData[ this[0] ]._details :
67999                                 undefined;
68000                 }
68001                 else if ( data === true ) {
68002                         // show
68003                         this.child.show();
68004                 }
68005                 else if ( data === false ) {
68006                         // remove
68007                         __details_remove( this );
68008                 }
68009                 else if ( ctx.length && this.length ) {
68010                         // set
68011                         __details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );
68012                 }
68014                 return this;
68015         } );
68018         _api_register( [
68019                 _child_obj+'.show()',
68020                 _child_mth+'.show()' // only when `child()` was called with parameters (without
68021         ], function ( show ) {   // it returns an object and this method is not executed)
68022                 __details_display( this, true );
68023                 return this;
68024         } );
68027         _api_register( [
68028                 _child_obj+'.hide()',
68029                 _child_mth+'.hide()' // only when `child()` was called with parameters (without
68030         ], function () {         // it returns an object and this method is not executed)
68031                 __details_display( this, false );
68032                 return this;
68033         } );
68036         _api_register( [
68037                 _child_obj+'.remove()',
68038                 _child_mth+'.remove()' // only when `child()` was called with parameters (without
68039         ], function () {           // it returns an object and this method is not executed)
68040                 __details_remove( this );
68041                 return this;
68042         } );
68045         _api_register( _child_obj+'.isShown()', function () {
68046                 var ctx = this.context;
68048                 if ( ctx.length && this.length ) {
68049                         // _detailsShown as false or undefined will fall through to return false
68050                         return ctx[0].aoData[ this[0] ]._detailsShow || false;
68051                 }
68052                 return false;
68053         } );
68057         /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
68058          * Columns
68059          *
68060          * {integer}           - column index (>=0 count from left, <0 count from right)
68061          * "{integer}:visIdx"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)
68062          * "{integer}:visible" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)
68063          * "{string}:name"     - column name
68064          * "{string}"          - jQuery selector on column header nodes
68065          *
68066          */
68068         // can be an array of these items, comma separated list, or an array of comma
68069         // separated lists
68071         var __re_column_selector = /^([^:]+):(name|visIdx|visible)$/;
68074         // r1 and r2 are redundant - but it means that the parameters match for the
68075         // iterator callback in columns().data()
68076         var __columnData = function ( settings, column, r1, r2, rows ) {
68077                 var a = [];
68078                 for ( var row=0, ien=rows.length ; row<ien ; row++ ) {
68079                         a.push( _fnGetCellData( settings, rows[row], column ) );
68080                 }
68081                 return a;
68082         };
68085         var __column_selector = function ( settings, selector, opts )
68086         {
68087                 var
68088                         columns = settings.aoColumns,
68089                         names = _pluck( columns, 'sName' ),
68090                         nodes = _pluck( columns, 'nTh' );
68092                 var run = function ( s ) {
68093                         var selInt = _intVal( s );
68095                         // Selector - all
68096                         if ( s === '' ) {
68097                                 return _range( columns.length );
68098                         }
68100                         // Selector - index
68101                         if ( selInt !== null ) {
68102                                 return [ selInt >= 0 ?
68103                                         selInt : // Count from left
68104                                         columns.length + selInt // Count from right (+ because its a negative value)
68105                                 ];
68106                         }
68108                         // Selector = function
68109                         if ( typeof s === 'function' ) {
68110                                 var rows = _selector_row_indexes( settings, opts );
68112                                 return $.map( columns, function (col, idx) {
68113                                         return s(
68114                                                         idx,
68115                                                         __columnData( settings, idx, 0, 0, rows ),
68116                                                         nodes[ idx ]
68117                                                 ) ? idx : null;
68118                                 } );
68119                         }
68121                         // jQuery or string selector
68122                         var match = typeof s === 'string' ?
68123                                 s.match( __re_column_selector ) :
68124                                 '';
68126                         if ( match ) {
68127                                 switch( match[2] ) {
68128                                         case 'visIdx':
68129                                         case 'visible':
68130                                                 var idx = parseInt( match[1], 10 );
68131                                                 // Visible index given, convert to column index
68132                                                 if ( idx < 0 ) {
68133                                                         // Counting from the right
68134                                                         var visColumns = $.map( columns, function (col,i) {
68135                                                                 return col.bVisible ? i : null;
68136                                                         } );
68137                                                         return [ visColumns[ visColumns.length + idx ] ];
68138                                                 }
68139                                                 // Counting from the left
68140                                                 return [ _fnVisibleToColumnIndex( settings, idx ) ];
68142                                         case 'name':
68143                                                 // match by name. `names` is column index complete and in order
68144                                                 return $.map( names, function (name, i) {
68145                                                         return name === match[1] ? i : null;
68146                                                 } );
68148                                         default:
68149                                                 return [];
68150                                 }
68151                         }
68153                         // Cell in the table body
68154                         if ( s.nodeName && s._DT_CellIndex ) {
68155                                 return [ s._DT_CellIndex.column ];
68156                         }
68158                         // jQuery selector on the TH elements for the columns
68159                         var jqResult = $( nodes )
68160                                 .filter( s )
68161                                 .map( function () {
68162                                         return $.inArray( this, nodes ); // `nodes` is column index complete and in order
68163                                 } )
68164                                 .toArray();
68166                         if ( jqResult.length || ! s.nodeName ) {
68167                                 return jqResult;
68168                         }
68170                         // Otherwise a node which might have a `dt-column` data attribute, or be
68171                         // a child or such an element
68172                         var host = $(s).closest('*[data-dt-column]');
68173                         return host.length ?
68174                                 [ host.data('dt-column') ] :
68175                                 [];
68176                 };
68178                 return _selector_run( 'column', selector, run, settings, opts );
68179         };
68182         var __setColumnVis = function ( settings, column, vis ) {
68183                 var
68184                         cols = settings.aoColumns,
68185                         col  = cols[ column ],
68186                         data = settings.aoData,
68187                         row, cells, i, ien, tr;
68189                 // Get
68190                 if ( vis === undefined ) {
68191                         return col.bVisible;
68192                 }
68194                 // Set
68195                 // No change
68196                 if ( col.bVisible === vis ) {
68197                         return;
68198                 }
68200                 if ( vis ) {
68201                         // Insert column
68202                         // Need to decide if we should use appendChild or insertBefore
68203                         var insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );
68205                         for ( i=0, ien=data.length ; i<ien ; i++ ) {
68206                                 tr = data[i].nTr;
68207                                 cells = data[i].anCells;
68209                                 if ( tr ) {
68210                                         // insertBefore can act like appendChild if 2nd arg is null
68211                                         tr.insertBefore( cells[ column ], cells[ insertBefore ] || null );
68212                                 }
68213                         }
68214                 }
68215                 else {
68216                         // Remove column
68217                         $( _pluck( settings.aoData, 'anCells', column ) ).detach();
68218                 }
68220                 // Common actions
68221                 col.bVisible = vis;
68222                 _fnDrawHead( settings, settings.aoHeader );
68223                 _fnDrawHead( settings, settings.aoFooter );
68225                 // Update colspan for no records display. Child rows and extensions will use their own
68226                 // listeners to do this - only need to update the empty table item here
68227                 if ( ! settings.aiDisplay.length ) {
68228                         $(settings.nTBody).find('td[colspan]').attr('colspan', _fnVisbleColumns(settings));
68229                 }
68231                 _fnSaveState( settings );
68232         };
68235         _api_register( 'columns()', function ( selector, opts ) {
68236                 // argument shifting
68237                 if ( selector === undefined ) {
68238                         selector = '';
68239                 }
68240                 else if ( $.isPlainObject( selector ) ) {
68241                         opts = selector;
68242                         selector = '';
68243                 }
68245                 opts = _selector_opts( opts );
68247                 var inst = this.iterator( 'table', function ( settings ) {
68248                         return __column_selector( settings, selector, opts );
68249                 }, 1 );
68251                 // Want argument shifting here and in _row_selector?
68252                 inst.selector.cols = selector;
68253                 inst.selector.opts = opts;
68255                 return inst;
68256         } );
68258         _api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {
68259                 return this.iterator( 'column', function ( settings, column ) {
68260                         return settings.aoColumns[column].nTh;
68261                 }, 1 );
68262         } );
68264         _api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {
68265                 return this.iterator( 'column', function ( settings, column ) {
68266                         return settings.aoColumns[column].nTf;
68267                 }, 1 );
68268         } );
68270         _api_registerPlural( 'columns().data()', 'column().data()', function () {
68271                 return this.iterator( 'column-rows', __columnData, 1 );
68272         } );
68274         _api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {
68275                 return this.iterator( 'column', function ( settings, column ) {
68276                         return settings.aoColumns[column].mData;
68277                 }, 1 );
68278         } );
68280         _api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {
68281                 return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {
68282                         return _pluck_order( settings.aoData, rows,
68283                                 type === 'search' ? '_aFilterData' : '_aSortData', column
68284                         );
68285                 }, 1 );
68286         } );
68288         _api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {
68289                 return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {
68290                         return _pluck_order( settings.aoData, rows, 'anCells', column ) ;
68291                 }, 1 );
68292         } );
68294         _api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {
68295                 var ret = this.iterator( 'column', function ( settings, column ) {
68296                         if ( vis === undefined ) {
68297                                 return settings.aoColumns[ column ].bVisible;
68298                         } // else
68299                         __setColumnVis( settings, column, vis );
68300                 } );
68302                 // Group the column visibility changes
68303                 if ( vis !== undefined ) {
68304                         // Second loop once the first is done for events
68305                         this.iterator( 'column', function ( settings, column ) {
68306                                 _fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis, calc] );
68307                         } );
68309                         if ( calc === undefined || calc ) {
68310                                 this.columns.adjust();
68311                         }
68312                 }
68314                 return ret;
68315         } );
68317         _api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {
68318                 return this.iterator( 'column', function ( settings, column ) {
68319                         return type === 'visible' ?
68320                                 _fnColumnIndexToVisible( settings, column ) :
68321                                 column;
68322                 }, 1 );
68323         } );
68325         _api_register( 'columns.adjust()', function () {
68326                 return this.iterator( 'table', function ( settings ) {
68327                         _fnAdjustColumnSizing( settings );
68328                 }, 1 );
68329         } );
68331         _api_register( 'column.index()', function ( type, idx ) {
68332                 if ( this.context.length !== 0 ) {
68333                         var ctx = this.context[0];
68335                         if ( type === 'fromVisible' || type === 'toData' ) {
68336                                 return _fnVisibleToColumnIndex( ctx, idx );
68337                         }
68338                         else if ( type === 'fromData' || type === 'toVisible' ) {
68339                                 return _fnColumnIndexToVisible( ctx, idx );
68340                         }
68341                 }
68342         } );
68344         _api_register( 'column()', function ( selector, opts ) {
68345                 return _selector_first( this.columns( selector, opts ) );
68346         } );
68350         var __cell_selector = function ( settings, selector, opts )
68351         {
68352                 var data = settings.aoData;
68353                 var rows = _selector_row_indexes( settings, opts );
68354                 var cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );
68355                 var allCells = $( [].concat.apply([], cells) );
68356                 var row;
68357                 var columns = settings.aoColumns.length;
68358                 var a, i, ien, j, o, host;
68360                 var run = function ( s ) {
68361                         var fnSelector = typeof s === 'function';
68363                         if ( s === null || s === undefined || fnSelector ) {
68364                                 // All cells and function selectors
68365                                 a = [];
68367                                 for ( i=0, ien=rows.length ; i<ien ; i++ ) {
68368                                         row = rows[i];
68370                                         for ( j=0 ; j<columns ; j++ ) {
68371                                                 o = {
68372                                                         row: row,
68373                                                         column: j
68374                                                 };
68376                                                 if ( fnSelector ) {
68377                                                         // Selector - function
68378                                                         host = data[ row ];
68380                                                         if ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {
68381                                                                 a.push( o );
68382                                                         }
68383                                                 }
68384                                                 else {
68385                                                         // Selector - all
68386                                                         a.push( o );
68387                                                 }
68388                                         }
68389                                 }
68391                                 return a;
68392                         }
68394                         // Selector - index
68395                         if ( $.isPlainObject( s ) ) {
68396                                 // Valid cell index and its in the array of selectable rows
68397                                 return s.column !== undefined && s.row !== undefined && $.inArray( s.row, rows ) !== -1 ?
68398                                         [s] :
68399                                         [];
68400                         }
68402                         // Selector - jQuery filtered cells
68403                         var jqResult = allCells
68404                                 .filter( s )
68405                                 .map( function (i, el) {
68406                                         return { // use a new object, in case someone changes the values
68407                                                 row:    el._DT_CellIndex.row,
68408                                                 column: el._DT_CellIndex.column
68409                                         };
68410                                 } )
68411                                 .toArray();
68413                         if ( jqResult.length || ! s.nodeName ) {
68414                                 return jqResult;
68415                         }
68417                         // Otherwise the selector is a node, and there is one last option - the
68418                         // element might be a child of an element which has dt-row and dt-column
68419                         // data attributes
68420                         host = $(s).closest('*[data-dt-row]');
68421                         return host.length ?
68422                                 [ {
68423                                         row: host.data('dt-row'),
68424                                         column: host.data('dt-column')
68425                                 } ] :
68426                                 [];
68427                 };
68429                 return _selector_run( 'cell', selector, run, settings, opts );
68430         };
68435         _api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {
68436                 // Argument shifting
68437                 if ( $.isPlainObject( rowSelector ) ) {
68438                         // Indexes
68439                         if ( rowSelector.row === undefined ) {
68440                                 // Selector options in first parameter
68441                                 opts = rowSelector;
68442                                 rowSelector = null;
68443                         }
68444                         else {
68445                                 // Cell index objects in first parameter
68446                                 opts = columnSelector;
68447                                 columnSelector = null;
68448                         }
68449                 }
68450                 if ( $.isPlainObject( columnSelector ) ) {
68451                         opts = columnSelector;
68452                         columnSelector = null;
68453                 }
68455                 // Cell selector
68456                 if ( columnSelector === null || columnSelector === undefined ) {
68457                         return this.iterator( 'table', function ( settings ) {
68458                                 return __cell_selector( settings, rowSelector, _selector_opts( opts ) );
68459                         } );
68460                 }
68462                 // Row + column selector
68463                 var columns = this.columns( columnSelector );
68464                 var rows = this.rows( rowSelector );
68465                 var a, i, ien, j, jen;
68467                 this.iterator( 'table', function ( settings, idx ) {
68468                         a = [];
68470                         for ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {
68471                                 for ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {
68472                                         a.push( {
68473                                                 row:    rows[idx][i],
68474                                                 column: columns[idx][j]
68475                                         } );
68476                                 }
68477                         }
68478                 }, 1 );
68480             // Now pass through the cell selector for options
68481             var cells = this.cells( a, opts );
68483                 $.extend( cells.selector, {
68484                         cols: columnSelector,
68485                         rows: rowSelector,
68486                         opts: opts
68487                 } );
68489                 return cells;
68490         } );
68493         _api_registerPlural( 'cells().nodes()', 'cell().node()', function () {
68494                 return this.iterator( 'cell', function ( settings, row, column ) {
68495                         var data = settings.aoData[ row ];
68497                         return data && data.anCells ?
68498                                 data.anCells[ column ] :
68499                                 undefined;
68500                 }, 1 );
68501         } );
68504         _api_register( 'cells().data()', function () {
68505                 return this.iterator( 'cell', function ( settings, row, column ) {
68506                         return _fnGetCellData( settings, row, column );
68507                 }, 1 );
68508         } );
68511         _api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {
68512                 type = type === 'search' ? '_aFilterData' : '_aSortData';
68514                 return this.iterator( 'cell', function ( settings, row, column ) {
68515                         return settings.aoData[ row ][ type ][ column ];
68516                 }, 1 );
68517         } );
68520         _api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {
68521                 return this.iterator( 'cell', function ( settings, row, column ) {
68522                         return _fnGetCellData( settings, row, column, type );
68523                 }, 1 );
68524         } );
68527         _api_registerPlural( 'cells().indexes()', 'cell().index()', function () {
68528                 return this.iterator( 'cell', function ( settings, row, column ) {
68529                         return {
68530                                 row: row,
68531                                 column: column,
68532                                 columnVisible: _fnColumnIndexToVisible( settings, column )
68533                         };
68534                 }, 1 );
68535         } );
68538         _api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {
68539                 return this.iterator( 'cell', function ( settings, row, column ) {
68540                         _fnInvalidate( settings, row, src, column );
68541                 } );
68542         } );
68546         _api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {
68547                 return _selector_first( this.cells( rowSelector, columnSelector, opts ) );
68548         } );
68551         _api_register( 'cell().data()', function ( data ) {
68552                 var ctx = this.context;
68553                 var cell = this[0];
68555                 if ( data === undefined ) {
68556                         // Get
68557                         return ctx.length && cell.length ?
68558                                 _fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :
68559                                 undefined;
68560                 }
68562                 // Set
68563                 _fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );
68564                 _fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );
68566                 return this;
68567         } );
68571         /**
68572          * Get current ordering (sorting) that has been applied to the table.
68573          *
68574          * @returns {array} 2D array containing the sorting information for the first
68575          *   table in the current context. Each element in the parent array represents
68576          *   a column being sorted upon (i.e. multi-sorting with two columns would have
68577          *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is
68578          *   the column index that the sorting condition applies to, the second is the
68579          *   direction of the sort (`desc` or `asc`) and, optionally, the third is the
68580          *   index of the sorting order from the `column.sorting` initialisation array.
68581          *//**
68582          * Set the ordering for the table.
68583          *
68584          * @param {integer} order Column index to sort upon.
68585          * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)
68586          * @returns {DataTables.Api} this
68587          *//**
68588          * Set the ordering for the table.
68589          *
68590          * @param {array} order 1D array of sorting information to be applied.
68591          * @param {array} [...] Optional additional sorting conditions
68592          * @returns {DataTables.Api} this
68593          *//**
68594          * Set the ordering for the table.
68595          *
68596          * @param {array} order 2D array of sorting information to be applied.
68597          * @returns {DataTables.Api} this
68598          */
68599         _api_register( 'order()', function ( order, dir ) {
68600                 var ctx = this.context;
68602                 if ( order === undefined ) {
68603                         // get
68604                         return ctx.length !== 0 ?
68605                                 ctx[0].aaSorting :
68606                                 undefined;
68607                 }
68609                 // set
68610                 if ( typeof order === 'number' ) {
68611                         // Simple column / direction passed in
68612                         order = [ [ order, dir ] ];
68613                 }
68614                 else if ( order.length && ! $.isArray( order[0] ) ) {
68615                         // Arguments passed in (list of 1D arrays)
68616                         order = Array.prototype.slice.call( arguments );
68617                 }
68618                 // otherwise a 2D array was passed in
68620                 return this.iterator( 'table', function ( settings ) {
68621                         settings.aaSorting = order.slice();
68622                 } );
68623         } );
68626         /**
68627          * Attach a sort listener to an element for a given column
68628          *
68629          * @param {node|jQuery|string} node Identifier for the element(s) to attach the
68630          *   listener to. This can take the form of a single DOM node, a jQuery
68631          *   collection of nodes or a jQuery selector which will identify the node(s).
68632          * @param {integer} column the column that a click on this node will sort on
68633          * @param {function} [callback] callback function when sort is run
68634          * @returns {DataTables.Api} this
68635          */
68636         _api_register( 'order.listener()', function ( node, column, callback ) {
68637                 return this.iterator( 'table', function ( settings ) {
68638                         _fnSortAttachListener( settings, node, column, callback );
68639                 } );
68640         } );
68643         _api_register( 'order.fixed()', function ( set ) {
68644                 if ( ! set ) {
68645                         var ctx = this.context;
68646                         var fixed = ctx.length ?
68647                                 ctx[0].aaSortingFixed :
68648                                 undefined;
68650                         return $.isArray( fixed ) ?
68651                                 { pre: fixed } :
68652                                 fixed;
68653                 }
68655                 return this.iterator( 'table', function ( settings ) {
68656                         settings.aaSortingFixed = $.extend( true, {}, set );
68657                 } );
68658         } );
68661         // Order by the selected column(s)
68662         _api_register( [
68663                 'columns().order()',
68664                 'column().order()'
68665         ], function ( dir ) {
68666                 var that = this;
68668                 return this.iterator( 'table', function ( settings, i ) {
68669                         var sort = [];
68671                         $.each( that[i], function (j, col) {
68672                                 sort.push( [ col, dir ] );
68673                         } );
68675                         settings.aaSorting = sort;
68676                 } );
68677         } );
68681         _api_register( 'search()', function ( input, regex, smart, caseInsen ) {
68682                 var ctx = this.context;
68684                 if ( input === undefined ) {
68685                         // get
68686                         return ctx.length !== 0 ?
68687                                 ctx[0].oPreviousSearch.sSearch :
68688                                 undefined;
68689                 }
68691                 // set
68692                 return this.iterator( 'table', function ( settings ) {
68693                         if ( ! settings.oFeatures.bFilter ) {
68694                                 return;
68695                         }
68697                         _fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {
68698                                 "sSearch": input+"",
68699                                 "bRegex":  regex === null ? false : regex,
68700                                 "bSmart":  smart === null ? true  : smart,
68701                                 "bCaseInsensitive": caseInsen === null ? true : caseInsen
68702                         } ), 1 );
68703                 } );
68704         } );
68707         _api_registerPlural(
68708                 'columns().search()',
68709                 'column().search()',
68710                 function ( input, regex, smart, caseInsen ) {
68711                         return this.iterator( 'column', function ( settings, column ) {
68712                                 var preSearch = settings.aoPreSearchCols;
68714                                 if ( input === undefined ) {
68715                                         // get
68716                                         return preSearch[ column ].sSearch;
68717                                 }
68719                                 // set
68720                                 if ( ! settings.oFeatures.bFilter ) {
68721                                         return;
68722                                 }
68724                                 $.extend( preSearch[ column ], {
68725                                         "sSearch": input+"",
68726                                         "bRegex":  regex === null ? false : regex,
68727                                         "bSmart":  smart === null ? true  : smart,
68728                                         "bCaseInsensitive": caseInsen === null ? true : caseInsen
68729                                 } );
68731                                 _fnFilterComplete( settings, settings.oPreviousSearch, 1 );
68732                         } );
68733                 }
68734         );
68736         /*
68737          * State API methods
68738          */
68740         _api_register( 'state()', function () {
68741                 return this.context.length ?
68742                         this.context[0].oSavedState :
68743                         null;
68744         } );
68747         _api_register( 'state.clear()', function () {
68748                 return this.iterator( 'table', function ( settings ) {
68749                         // Save an empty object
68750                         settings.fnStateSaveCallback.call( settings.oInstance, settings, {} );
68751                 } );
68752         } );
68755         _api_register( 'state.loaded()', function () {
68756                 return this.context.length ?
68757                         this.context[0].oLoadedState :
68758                         null;
68759         } );
68762         _api_register( 'state.save()', function () {
68763                 return this.iterator( 'table', function ( settings ) {
68764                         _fnSaveState( settings );
68765                 } );
68766         } );
68770         /**
68771          * Provide a common method for plug-ins to check the version of DataTables being
68772          * used, in order to ensure compatibility.
68773          *
68774          *  @param {string} version Version string to check for, in the format "X.Y.Z".
68775          *    Note that the formats "X" and "X.Y" are also acceptable.
68776          *  @returns {boolean} true if this version of DataTables is greater or equal to
68777          *    the required version, or false if this version of DataTales is not
68778          *    suitable
68779          *  @static
68780          *  @dtopt API-Static
68781          *
68782          *  @example
68783          *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );
68784          */
68785         DataTable.versionCheck = DataTable.fnVersionCheck = function( version )
68786         {
68787                 var aThis = DataTable.version.split('.');
68788                 var aThat = version.split('.');
68789                 var iThis, iThat;
68791                 for ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {
68792                         iThis = parseInt( aThis[i], 10 ) || 0;
68793                         iThat = parseInt( aThat[i], 10 ) || 0;
68795                         // Parts are the same, keep comparing
68796                         if (iThis === iThat) {
68797                                 continue;
68798                         }
68800                         // Parts are different, return immediately
68801                         return iThis > iThat;
68802                 }
68804                 return true;
68805         };
68808         /**
68809          * Check if a `<table>` node is a DataTable table already or not.
68810          *
68811          *  @param {node|jquery|string} table Table node, jQuery object or jQuery
68812          *      selector for the table to test. Note that if more than more than one
68813          *      table is passed on, only the first will be checked
68814          *  @returns {boolean} true the table given is a DataTable, or false otherwise
68815          *  @static
68816          *  @dtopt API-Static
68817          *
68818          *  @example
68819          *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {
68820          *      $('#example').dataTable();
68821          *    }
68822          */
68823         DataTable.isDataTable = DataTable.fnIsDataTable = function ( table )
68824         {
68825                 var t = $(table).get(0);
68826                 var is = false;
68828                 if ( table instanceof DataTable.Api ) {
68829                         return true;
68830                 }
68832                 $.each( DataTable.settings, function (i, o) {
68833                         var head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;
68834                         var foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;
68836                         if ( o.nTable === t || head === t || foot === t ) {
68837                                 is = true;
68838                         }
68839                 } );
68841                 return is;
68842         };
68845         /**
68846          * Get all DataTable tables that have been initialised - optionally you can
68847          * select to get only currently visible tables.
68848          *
68849          *  @param {boolean} [visible=false] Flag to indicate if you want all (default)
68850          *    or visible tables only.
68851          *  @returns {array} Array of `table` nodes (not DataTable instances) which are
68852          *    DataTables
68853          *  @static
68854          *  @dtopt API-Static
68855          *
68856          *  @example
68857          *    $.each( $.fn.dataTable.tables(true), function () {
68858          *      $(table).DataTable().columns.adjust();
68859          *    } );
68860          */
68861         DataTable.tables = DataTable.fnTables = function ( visible )
68862         {
68863                 var api = false;
68865                 if ( $.isPlainObject( visible ) ) {
68866                         api = visible.api;
68867                         visible = visible.visible;
68868                 }
68870                 var a = $.map( DataTable.settings, function (o) {
68871                         if ( !visible || (visible && $(o.nTable).is(':visible')) ) {
68872                                 return o.nTable;
68873                         }
68874                 } );
68876                 return api ?
68877                         new _Api( a ) :
68878                         a;
68879         };
68882         /**
68883          * Convert from camel case parameters to Hungarian notation. This is made public
68884          * for the extensions to provide the same ability as DataTables core to accept
68885          * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase
68886          * parameters.
68887          *
68888          *  @param {object} src The model object which holds all parameters that can be
68889          *    mapped.
68890          *  @param {object} user The object to convert from camel case to Hungarian.
68891          *  @param {boolean} force When set to `true`, properties which already have a
68892          *    Hungarian value in the `user` object will be overwritten. Otherwise they
68893          *    won't be.
68894          */
68895         DataTable.camelToHungarian = _fnCamelToHungarian;
68899         /**
68900          *
68901          */
68902         _api_register( '$()', function ( selector, opts ) {
68903                 var
68904                         rows   = this.rows( opts ).nodes(), // Get all rows
68905                         jqRows = $(rows);
68907                 return $( [].concat(
68908                         jqRows.filter( selector ).toArray(),
68909                         jqRows.find( selector ).toArray()
68910                 ) );
68911         } );
68914         // jQuery functions to operate on the tables
68915         $.each( [ 'on', 'one', 'off' ], function (i, key) {
68916                 _api_register( key+'()', function ( /* event, handler */ ) {
68917                         var args = Array.prototype.slice.call(arguments);
68919                         // Add the `dt` namespace automatically if it isn't already present
68920                         args[0] = $.map( args[0].split( /\s/ ), function ( e ) {
68921                                 return ! e.match(/\.dt\b/) ?
68922                                         e+'.dt' :
68923                                         e;
68924                                 } ).join( ' ' );
68926                         var inst = $( this.tables().nodes() );
68927                         inst[key].apply( inst, args );
68928                         return this;
68929                 } );
68930         } );
68933         _api_register( 'clear()', function () {
68934                 return this.iterator( 'table', function ( settings ) {
68935                         _fnClearTable( settings );
68936                 } );
68937         } );
68940         _api_register( 'settings()', function () {
68941                 return new _Api( this.context, this.context );
68942         } );
68945         _api_register( 'init()', function () {
68946                 var ctx = this.context;
68947                 return ctx.length ? ctx[0].oInit : null;
68948         } );
68951         _api_register( 'data()', function () {
68952                 return this.iterator( 'table', function ( settings ) {
68953                         return _pluck( settings.aoData, '_aData' );
68954                 } ).flatten();
68955         } );
68958         _api_register( 'destroy()', function ( remove ) {
68959                 remove = remove || false;
68961                 return this.iterator( 'table', function ( settings ) {
68962                         var orig      = settings.nTableWrapper.parentNode;
68963                         var classes   = settings.oClasses;
68964                         var table     = settings.nTable;
68965                         var tbody     = settings.nTBody;
68966                         var thead     = settings.nTHead;
68967                         var tfoot     = settings.nTFoot;
68968                         var jqTable   = $(table);
68969                         var jqTbody   = $(tbody);
68970                         var jqWrapper = $(settings.nTableWrapper);
68971                         var rows      = $.map( settings.aoData, function (r) { return r.nTr; } );
68972                         var i, ien;
68974                         // Flag to note that the table is currently being destroyed - no action
68975                         // should be taken
68976                         settings.bDestroying = true;
68978                         // Fire off the destroy callbacks for plug-ins etc
68979                         _fnCallbackFire( settings, "aoDestroyCallback", "destroy", [settings] );
68981                         // If not being removed from the document, make all columns visible
68982                         if ( ! remove ) {
68983                                 new _Api( settings ).columns().visible( true );
68984                         }
68986                         // Blitz all `DT` namespaced events (these are internal events, the
68987                         // lowercase, `dt` events are user subscribed and they are responsible
68988                         // for removing them
68989                         jqWrapper.off('.DT').find(':not(tbody *)').off('.DT');
68990                         $(window).off('.DT-'+settings.sInstance);
68992                         // When scrolling we had to break the table up - restore it
68993                         if ( table != thead.parentNode ) {
68994                                 jqTable.children('thead').detach();
68995                                 jqTable.append( thead );
68996                         }
68998                         if ( tfoot && table != tfoot.parentNode ) {
68999                                 jqTable.children('tfoot').detach();
69000                                 jqTable.append( tfoot );
69001                         }
69003                         settings.aaSorting = [];
69004                         settings.aaSortingFixed = [];
69005                         _fnSortingClasses( settings );
69007                         $( rows ).removeClass( settings.asStripeClasses.join(' ') );
69009                         $('th, td', thead).removeClass( classes.sSortable+' '+
69010                                 classes.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone
69011                         );
69013                         // Add the TR elements back into the table in their original order
69014                         jqTbody.children().detach();
69015                         jqTbody.append( rows );
69017                         // Remove the DataTables generated nodes, events and classes
69018                         var removedMethod = remove ? 'remove' : 'detach';
69019                         jqTable[ removedMethod ]();
69020                         jqWrapper[ removedMethod ]();
69022                         // If we need to reattach the table to the document
69023                         if ( ! remove && orig ) {
69024                                 // insertBefore acts like appendChild if !arg[1]
69025                                 orig.insertBefore( table, settings.nTableReinsertBefore );
69027                                 // Restore the width of the original table - was read from the style property,
69028                                 // so we can restore directly to that
69029                                 jqTable
69030                                         .css( 'width', settings.sDestroyWidth )
69031                                         .removeClass( classes.sTable );
69033                                 // If the were originally stripe classes - then we add them back here.
69034                                 // Note this is not fool proof (for example if not all rows had stripe
69035                                 // classes - but it's a good effort without getting carried away
69036                                 ien = settings.asDestroyStripes.length;
69038                                 if ( ien ) {
69039                                         jqTbody.children().each( function (i) {
69040                                                 $(this).addClass( settings.asDestroyStripes[i % ien] );
69041                                         } );
69042                                 }
69043                         }
69045                         /* Remove the settings object from the settings array */
69046                         var idx = $.inArray( settings, DataTable.settings );
69047                         if ( idx !== -1 ) {
69048                                 DataTable.settings.splice( idx, 1 );
69049                         }
69050                 } );
69051         } );
69054         // Add the `every()` method for rows, columns and cells in a compact form
69055         $.each( [ 'column', 'row', 'cell' ], function ( i, type ) {
69056                 _api_register( type+'s().every()', function ( fn ) {
69057                         var opts = this.selector.opts;
69058                         var api = this;
69060                         return this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {
69061                                 // Rows and columns:
69062                                 //  arg1 - index
69063                                 //  arg2 - table counter
69064                                 //  arg3 - loop counter
69065                                 //  arg4 - undefined
69066                                 // Cells:
69067                                 //  arg1 - row index
69068                                 //  arg2 - column index
69069                                 //  arg3 - table counter
69070                                 //  arg4 - loop counter
69071                                 fn.call(
69072                                         api[ type ](
69073                                                 arg1,
69074                                                 type==='cell' ? arg2 : opts,
69075                                                 type==='cell' ? opts : undefined
69076                                         ),
69077                                         arg1, arg2, arg3, arg4
69078                                 );
69079                         } );
69080                 } );
69081         } );
69084         // i18n method for extensions to be able to use the language object from the
69085         // DataTable
69086         _api_register( 'i18n()', function ( token, def, plural ) {
69087                 var ctx = this.context[0];
69088                 var resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );
69090                 if ( resolved === undefined ) {
69091                         resolved = def;
69092                 }
69094                 if ( plural !== undefined && $.isPlainObject( resolved ) ) {
69095                         resolved = resolved[ plural ] !== undefined ?
69096                                 resolved[ plural ] :
69097                                 resolved._;
69098                 }
69100                 return resolved.replace( '%d', plural ); // nb: plural might be undefined,
69101         } );
69103         /**
69104          * Version string for plug-ins to check compatibility. Allowed format is
69105          * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used
69106          * only for non-release builds. See http://semver.org/ for more information.
69107          *  @member
69108          *  @type string
69109          *  @default Version number
69110          */
69111         DataTable.version = "1.10.18";
69113         /**
69114          * Private data store, containing all of the settings objects that are
69115          * created for the tables on a given page.
69116          *
69117          * Note that the `DataTable.settings` object is aliased to
69118          * `jQuery.fn.dataTableExt` through which it may be accessed and
69119          * manipulated, or `jQuery.fn.dataTable.settings`.
69120          *  @member
69121          *  @type array
69122          *  @default []
69123          *  @private
69124          */
69125         DataTable.settings = [];
69127         /**
69128          * Object models container, for the various models that DataTables has
69129          * available to it. These models define the objects that are used to hold
69130          * the active state and configuration of the table.
69131          *  @namespace
69132          */
69133         DataTable.models = {};
69137         /**
69138          * Template object for the way in which DataTables holds information about
69139          * search information for the global filter and individual column filters.
69140          *  @namespace
69141          */
69142         DataTable.models.oSearch = {
69143                 /**
69144                  * Flag to indicate if the filtering should be case insensitive or not
69145                  *  @type boolean
69146                  *  @default true
69147                  */
69148                 "bCaseInsensitive": true,
69150                 /**
69151                  * Applied search term
69152                  *  @type string
69153                  *  @default <i>Empty string</i>
69154                  */
69155                 "sSearch": "",
69157                 /**
69158                  * Flag to indicate if the search term should be interpreted as a
69159                  * regular expression (true) or not (false) and therefore and special
69160                  * regex characters escaped.
69161                  *  @type boolean
69162                  *  @default false
69163                  */
69164                 "bRegex": false,
69166                 /**
69167                  * Flag to indicate if DataTables is to use its smart filtering or not.
69168                  *  @type boolean
69169                  *  @default true
69170                  */
69171                 "bSmart": true
69172         };
69177         /**
69178          * Template object for the way in which DataTables holds information about
69179          * each individual row. This is the object format used for the settings
69180          * aoData array.
69181          *  @namespace
69182          */
69183         DataTable.models.oRow = {
69184                 /**
69185                  * TR element for the row
69186                  *  @type node
69187                  *  @default null
69188                  */
69189                 "nTr": null,
69191                 /**
69192                  * Array of TD elements for each row. This is null until the row has been
69193                  * created.
69194                  *  @type array nodes
69195                  *  @default []
69196                  */
69197                 "anCells": null,
69199                 /**
69200                  * Data object from the original data source for the row. This is either
69201                  * an array if using the traditional form of DataTables, or an object if
69202                  * using mData options. The exact type will depend on the passed in
69203                  * data from the data source, or will be an array if using DOM a data
69204                  * source.
69205                  *  @type array|object
69206                  *  @default []
69207                  */
69208                 "_aData": [],
69210                 /**
69211                  * Sorting data cache - this array is ostensibly the same length as the
69212                  * number of columns (although each index is generated only as it is
69213                  * needed), and holds the data that is used for sorting each column in the
69214                  * row. We do this cache generation at the start of the sort in order that
69215                  * the formatting of the sort data need be done only once for each cell
69216                  * per sort. This array should not be read from or written to by anything
69217                  * other than the master sorting methods.
69218                  *  @type array
69219                  *  @default null
69220                  *  @private
69221                  */
69222                 "_aSortData": null,
69224                 /**
69225                  * Per cell filtering data cache. As per the sort data cache, used to
69226                  * increase the performance of the filtering in DataTables
69227                  *  @type array
69228                  *  @default null
69229                  *  @private
69230                  */
69231                 "_aFilterData": null,
69233                 /**
69234                  * Filtering data cache. This is the same as the cell filtering cache, but
69235                  * in this case a string rather than an array. This is easily computed with
69236                  * a join on `_aFilterData`, but is provided as a cache so the join isn't
69237                  * needed on every search (memory traded for performance)
69238                  *  @type array
69239                  *  @default null
69240                  *  @private
69241                  */
69242                 "_sFilterRow": null,
69244                 /**
69245                  * Cache of the class name that DataTables has applied to the row, so we
69246                  * can quickly look at this variable rather than needing to do a DOM check
69247                  * on className for the nTr property.
69248                  *  @type string
69249                  *  @default <i>Empty string</i>
69250                  *  @private
69251                  */
69252                 "_sRowStripe": "",
69254                 /**
69255                  * Denote if the original data source was from the DOM, or the data source
69256                  * object. This is used for invalidating data, so DataTables can
69257                  * automatically read data from the original source, unless uninstructed
69258                  * otherwise.
69259                  *  @type string
69260                  *  @default null
69261                  *  @private
69262                  */
69263                 "src": null,
69265                 /**
69266                  * Index in the aoData array. This saves an indexOf lookup when we have the
69267                  * object, but want to know the index
69268                  *  @type integer
69269                  *  @default -1
69270                  *  @private
69271                  */
69272                 "idx": -1
69273         };
69276         /**
69277          * Template object for the column information object in DataTables. This object
69278          * is held in the settings aoColumns array and contains all the information that
69279          * DataTables needs about each individual column.
69280          *
69281          * Note that this object is related to {@link DataTable.defaults.column}
69282          * but this one is the internal data store for DataTables's cache of columns.
69283          * It should NOT be manipulated outside of DataTables. Any configuration should
69284          * be done through the initialisation options.
69285          *  @namespace
69286          */
69287         DataTable.models.oColumn = {
69288                 /**
69289                  * Column index. This could be worked out on-the-fly with $.inArray, but it
69290                  * is faster to just hold it as a variable
69291                  *  @type integer
69292                  *  @default null
69293                  */
69294                 "idx": null,
69296                 /**
69297                  * A list of the columns that sorting should occur on when this column
69298                  * is sorted. That this property is an array allows multi-column sorting
69299                  * to be defined for a column (for example first name / last name columns
69300                  * would benefit from this). The values are integers pointing to the
69301                  * columns to be sorted on (typically it will be a single integer pointing
69302                  * at itself, but that doesn't need to be the case).
69303                  *  @type array
69304                  */
69305                 "aDataSort": null,
69307                 /**
69308                  * Define the sorting directions that are applied to the column, in sequence
69309                  * as the column is repeatedly sorted upon - i.e. the first value is used
69310                  * as the sorting direction when the column if first sorted (clicked on).
69311                  * Sort it again (click again) and it will move on to the next index.
69312                  * Repeat until loop.
69313                  *  @type array
69314                  */
69315                 "asSorting": null,
69317                 /**
69318                  * Flag to indicate if the column is searchable, and thus should be included
69319                  * in the filtering or not.
69320                  *  @type boolean
69321                  */
69322                 "bSearchable": null,
69324                 /**
69325                  * Flag to indicate if the column is sortable or not.
69326                  *  @type boolean
69327                  */
69328                 "bSortable": null,
69330                 /**
69331                  * Flag to indicate if the column is currently visible in the table or not
69332                  *  @type boolean
69333                  */
69334                 "bVisible": null,
69336                 /**
69337                  * Store for manual type assignment using the `column.type` option. This
69338                  * is held in store so we can manipulate the column's `sType` property.
69339                  *  @type string
69340                  *  @default null
69341                  *  @private
69342                  */
69343                 "_sManualType": null,
69345                 /**
69346                  * Flag to indicate if HTML5 data attributes should be used as the data
69347                  * source for filtering or sorting. True is either are.
69348                  *  @type boolean
69349                  *  @default false
69350                  *  @private
69351                  */
69352                 "_bAttrSrc": false,
69354                 /**
69355                  * Developer definable function that is called whenever a cell is created (Ajax source,
69356                  * etc) or processed for input (DOM source). This can be used as a compliment to mRender
69357                  * allowing you to modify the DOM element (add background colour for example) when the
69358                  * element is available.
69359                  *  @type function
69360                  *  @param {element} nTd The TD node that has been created
69361                  *  @param {*} sData The Data for the cell
69362                  *  @param {array|object} oData The data for the whole row
69363                  *  @param {int} iRow The row index for the aoData data store
69364                  *  @default null
69365                  */
69366                 "fnCreatedCell": null,
69368                 /**
69369                  * Function to get data from a cell in a column. You should <b>never</b>
69370                  * access data directly through _aData internally in DataTables - always use
69371                  * the method attached to this property. It allows mData to function as
69372                  * required. This function is automatically assigned by the column
69373                  * initialisation method
69374                  *  @type function
69375                  *  @param {array|object} oData The data array/object for the array
69376                  *    (i.e. aoData[]._aData)
69377                  *  @param {string} sSpecific The specific data type you want to get -
69378                  *    'display', 'type' 'filter' 'sort'
69379                  *  @returns {*} The data for the cell from the given row's data
69380                  *  @default null
69381                  */
69382                 "fnGetData": null,
69384                 /**
69385                  * Function to set data for a cell in the column. You should <b>never</b>
69386                  * set the data directly to _aData internally in DataTables - always use
69387                  * this method. It allows mData to function as required. This function
69388                  * is automatically assigned by the column initialisation method
69389                  *  @type function
69390                  *  @param {array|object} oData The data array/object for the array
69391                  *    (i.e. aoData[]._aData)
69392                  *  @param {*} sValue Value to set
69393                  *  @default null
69394                  */
69395                 "fnSetData": null,
69397                 /**
69398                  * Property to read the value for the cells in the column from the data
69399                  * source array / object. If null, then the default content is used, if a
69400                  * function is given then the return from the function is used.
69401                  *  @type function|int|string|null
69402                  *  @default null
69403                  */
69404                 "mData": null,
69406                 /**
69407                  * Partner property to mData which is used (only when defined) to get
69408                  * the data - i.e. it is basically the same as mData, but without the
69409                  * 'set' option, and also the data fed to it is the result from mData.
69410                  * This is the rendering method to match the data method of mData.
69411                  *  @type function|int|string|null
69412                  *  @default null
69413                  */
69414                 "mRender": null,
69416                 /**
69417                  * Unique header TH/TD element for this column - this is what the sorting
69418                  * listener is attached to (if sorting is enabled.)
69419                  *  @type node
69420                  *  @default null
69421                  */
69422                 "nTh": null,
69424                 /**
69425                  * Unique footer TH/TD element for this column (if there is one). Not used
69426                  * in DataTables as such, but can be used for plug-ins to reference the
69427                  * footer for each column.
69428                  *  @type node
69429                  *  @default null
69430                  */
69431                 "nTf": null,
69433                 /**
69434                  * The class to apply to all TD elements in the table's TBODY for the column
69435                  *  @type string
69436                  *  @default null
69437                  */
69438                 "sClass": null,
69440                 /**
69441                  * When DataTables calculates the column widths to assign to each column,
69442                  * it finds the longest string in each column and then constructs a
69443                  * temporary table and reads the widths from that. The problem with this
69444                  * is that "mmm" is much wider then "iiii", but the latter is a longer
69445                  * string - thus the calculation can go wrong (doing it properly and putting
69446                  * it into an DOM object and measuring that is horribly(!) slow). Thus as
69447                  * a "work around" we provide this option. It will append its value to the
69448                  * text that is found to be the longest string for the column - i.e. padding.
69449                  *  @type string
69450                  */
69451                 "sContentPadding": null,
69453                 /**
69454                  * Allows a default value to be given for a column's data, and will be used
69455                  * whenever a null data source is encountered (this can be because mData
69456                  * is set to null, or because the data source itself is null).
69457                  *  @type string
69458                  *  @default null
69459                  */
69460                 "sDefaultContent": null,
69462                 /**
69463                  * Name for the column, allowing reference to the column by name as well as
69464                  * by index (needs a lookup to work by name).
69465                  *  @type string
69466                  */
69467                 "sName": null,
69469                 /**
69470                  * Custom sorting data type - defines which of the available plug-ins in
69471                  * afnSortData the custom sorting will use - if any is defined.
69472                  *  @type string
69473                  *  @default std
69474                  */
69475                 "sSortDataType": 'std',
69477                 /**
69478                  * Class to be applied to the header element when sorting on this column
69479                  *  @type string
69480                  *  @default null
69481                  */
69482                 "sSortingClass": null,
69484                 /**
69485                  * Class to be applied to the header element when sorting on this column -
69486                  * when jQuery UI theming is used.
69487                  *  @type string
69488                  *  @default null
69489                  */
69490                 "sSortingClassJUI": null,
69492                 /**
69493                  * Title of the column - what is seen in the TH element (nTh).
69494                  *  @type string
69495                  */
69496                 "sTitle": null,
69498                 /**
69499                  * Column sorting and filtering type
69500                  *  @type string
69501                  *  @default null
69502                  */
69503                 "sType": null,
69505                 /**
69506                  * Width of the column
69507                  *  @type string
69508                  *  @default null
69509                  */
69510                 "sWidth": null,
69512                 /**
69513                  * Width of the column when it was first "encountered"
69514                  *  @type string
69515                  *  @default null
69516                  */
69517                 "sWidthOrig": null
69518         };
69521         /*
69522          * Developer note: The properties of the object below are given in Hungarian
69523          * notation, that was used as the interface for DataTables prior to v1.10, however
69524          * from v1.10 onwards the primary interface is camel case. In order to avoid
69525          * breaking backwards compatibility utterly with this change, the Hungarian
69526          * version is still, internally the primary interface, but is is not documented
69527          * - hence the @name tags in each doc comment. This allows a Javascript function
69528          * to create a map from Hungarian notation to camel case (going the other direction
69529          * would require each property to be listed, which would at around 3K to the size
69530          * of DataTables, while this method is about a 0.5K hit.
69531          *
69532          * Ultimately this does pave the way for Hungarian notation to be dropped
69533          * completely, but that is a massive amount of work and will break current
69534          * installs (therefore is on-hold until v2).
69535          */
69537         /**
69538          * Initialisation options that can be given to DataTables at initialisation
69539          * time.
69540          *  @namespace
69541          */
69542         DataTable.defaults = {
69543                 /**
69544                  * An array of data to use for the table, passed in at initialisation which
69545                  * will be used in preference to any data which is already in the DOM. This is
69546                  * particularly useful for constructing tables purely in Javascript, for
69547                  * example with a custom Ajax call.
69548                  *  @type array
69549                  *  @default null
69550                  *
69551                  *  @dtopt Option
69552                  *  @name DataTable.defaults.data
69553                  *
69554                  *  @example
69555                  *    // Using a 2D array data source
69556                  *    $(document).ready( function () {
69557                  *      $('#example').dataTable( {
69558                  *        "data": [
69559                  *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],
69560                  *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],
69561                  *        ],
69562                  *        "columns": [
69563                  *          { "title": "Engine" },
69564                  *          { "title": "Browser" },
69565                  *          { "title": "Platform" },
69566                  *          { "title": "Version" },
69567                  *          { "title": "Grade" }
69568                  *        ]
69569                  *      } );
69570                  *    } );
69571                  *
69572                  *  @example
69573                  *    // Using an array of objects as a data source (`data`)
69574                  *    $(document).ready( function () {
69575                  *      $('#example').dataTable( {
69576                  *        "data": [
69577                  *          {
69578                  *            "engine":   "Trident",
69579                  *            "browser":  "Internet Explorer 4.0",
69580                  *            "platform": "Win 95+",
69581                  *            "version":  4,
69582                  *            "grade":    "X"
69583                  *          },
69584                  *          {
69585                  *            "engine":   "Trident",
69586                  *            "browser":  "Internet Explorer 5.0",
69587                  *            "platform": "Win 95+",
69588                  *            "version":  5,
69589                  *            "grade":    "C"
69590                  *          }
69591                  *        ],
69592                  *        "columns": [
69593                  *          { "title": "Engine",   "data": "engine" },
69594                  *          { "title": "Browser",  "data": "browser" },
69595                  *          { "title": "Platform", "data": "platform" },
69596                  *          { "title": "Version",  "data": "version" },
69597                  *          { "title": "Grade",    "data": "grade" }
69598                  *        ]
69599                  *      } );
69600                  *    } );
69601                  */
69602                 "aaData": null,
69605                 /**
69606                  * If ordering is enabled, then DataTables will perform a first pass sort on
69607                  * initialisation. You can define which column(s) the sort is performed
69608                  * upon, and the sorting direction, with this variable. The `sorting` array
69609                  * should contain an array for each column to be sorted initially containing
69610                  * the column's index and a direction string ('asc' or 'desc').
69611                  *  @type array
69612                  *  @default [[0,'asc']]
69613                  *
69614                  *  @dtopt Option
69615                  *  @name DataTable.defaults.order
69616                  *
69617                  *  @example
69618                  *    // Sort by 3rd column first, and then 4th column
69619                  *    $(document).ready( function() {
69620                  *      $('#example').dataTable( {
69621                  *        "order": [[2,'asc'], [3,'desc']]
69622                  *      } );
69623                  *    } );
69624                  *
69625                  *    // No initial sorting
69626                  *    $(document).ready( function() {
69627                  *      $('#example').dataTable( {
69628                  *        "order": []
69629                  *      } );
69630                  *    } );
69631                  */
69632                 "aaSorting": [[0,'asc']],
69635                 /**
69636                  * This parameter is basically identical to the `sorting` parameter, but
69637                  * cannot be overridden by user interaction with the table. What this means
69638                  * is that you could have a column (visible or hidden) which the sorting
69639                  * will always be forced on first - any sorting after that (from the user)
69640                  * will then be performed as required. This can be useful for grouping rows
69641                  * together.
69642                  *  @type array
69643                  *  @default null
69644                  *
69645                  *  @dtopt Option
69646                  *  @name DataTable.defaults.orderFixed
69647                  *
69648                  *  @example
69649                  *    $(document).ready( function() {
69650                  *      $('#example').dataTable( {
69651                  *        "orderFixed": [[0,'asc']]
69652                  *      } );
69653                  *    } )
69654                  */
69655                 "aaSortingFixed": [],
69658                 /**
69659                  * DataTables can be instructed to load data to display in the table from a
69660                  * Ajax source. This option defines how that Ajax call is made and where to.
69661                  *
69662                  * The `ajax` property has three different modes of operation, depending on
69663                  * how it is defined. These are:
69664                  *
69665                  * * `string` - Set the URL from where the data should be loaded from.
69666                  * * `object` - Define properties for `jQuery.ajax`.
69667                  * * `function` - Custom data get function
69668                  *
69669                  * `string`
69670                  * --------
69671                  *
69672                  * As a string, the `ajax` property simply defines the URL from which
69673                  * DataTables will load data.
69674                  *
69675                  * `object`
69676                  * --------
69677                  *
69678                  * As an object, the parameters in the object are passed to
69679                  * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control
69680                  * of the Ajax request. DataTables has a number of default parameters which
69681                  * you can override using this option. Please refer to the jQuery
69682                  * documentation for a full description of the options available, although
69683                  * the following parameters provide additional options in DataTables or
69684                  * require special consideration:
69685                  *
69686                  * * `data` - As with jQuery, `data` can be provided as an object, but it
69687                  *   can also be used as a function to manipulate the data DataTables sends
69688                  *   to the server. The function takes a single parameter, an object of
69689                  *   parameters with the values that DataTables has readied for sending. An
69690                  *   object may be returned which will be merged into the DataTables
69691                  *   defaults, or you can add the items to the object that was passed in and
69692                  *   not return anything from the function. This supersedes `fnServerParams`
69693                  *   from DataTables 1.9-.
69694                  *
69695                  * * `dataSrc` - By default DataTables will look for the property `data` (or
69696                  *   `aaData` for compatibility with DataTables 1.9-) when obtaining data
69697                  *   from an Ajax source or for server-side processing - this parameter
69698                  *   allows that property to be changed. You can use Javascript dotted
69699                  *   object notation to get a data source for multiple levels of nesting, or
69700                  *   it my be used as a function. As a function it takes a single parameter,
69701                  *   the JSON returned from the server, which can be manipulated as
69702                  *   required, with the returned value being that used by DataTables as the
69703                  *   data source for the table. This supersedes `sAjaxDataProp` from
69704                  *   DataTables 1.9-.
69705                  *
69706                  * * `success` - Should not be overridden it is used internally in
69707                  *   DataTables. To manipulate / transform the data returned by the server
69708                  *   use `ajax.dataSrc`, or use `ajax` as a function (see below).
69709                  *
69710                  * `function`
69711                  * ----------
69712                  *
69713                  * As a function, making the Ajax call is left up to yourself allowing
69714                  * complete control of the Ajax request. Indeed, if desired, a method other
69715                  * than Ajax could be used to obtain the required data, such as Web storage
69716                  * or an AIR database.
69717                  *
69718                  * The function is given four parameters and no return is required. The
69719                  * parameters are:
69720                  *
69721                  * 1. _object_ - Data to send to the server
69722                  * 2. _function_ - Callback function that must be executed when the required
69723                  *    data has been obtained. That data should be passed into the callback
69724                  *    as the only parameter
69725                  * 3. _object_ - DataTables settings object for the table
69726                  *
69727                  * Note that this supersedes `fnServerData` from DataTables 1.9-.
69728                  *
69729                  *  @type string|object|function
69730                  *  @default null
69731                  *
69732                  *  @dtopt Option
69733                  *  @name DataTable.defaults.ajax
69734                  *  @since 1.10.0
69735                  *
69736                  * @example
69737                  *   // Get JSON data from a file via Ajax.
69738                  *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).
69739                  *   $('#example').dataTable( {
69740                  *     "ajax": "data.json"
69741                  *   } );
69742                  *
69743                  * @example
69744                  *   // Get JSON data from a file via Ajax, using `dataSrc` to change
69745                  *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)
69746                  *   $('#example').dataTable( {
69747                  *     "ajax": {
69748                  *       "url": "data.json",
69749                  *       "dataSrc": "tableData"
69750                  *     }
69751                  *   } );
69752                  *
69753                  * @example
69754                  *   // Get JSON data from a file via Ajax, using `dataSrc` to read data
69755                  *   // from a plain array rather than an array in an object
69756                  *   $('#example').dataTable( {
69757                  *     "ajax": {
69758                  *       "url": "data.json",
69759                  *       "dataSrc": ""
69760                  *     }
69761                  *   } );
69762                  *
69763                  * @example
69764                  *   // Manipulate the data returned from the server - add a link to data
69765                  *   // (note this can, should, be done using `render` for the column - this
69766                  *   // is just a simple example of how the data can be manipulated).
69767                  *   $('#example').dataTable( {
69768                  *     "ajax": {
69769                  *       "url": "data.json",
69770                  *       "dataSrc": function ( json ) {
69771                  *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {
69772                  *           json[i][0] = '<a href="/message/'+json[i][0]+'>View message</a>';
69773                  *         }
69774                  *         return json;
69775                  *       }
69776                  *     }
69777                  *   } );
69778                  *
69779                  * @example
69780                  *   // Add data to the request
69781                  *   $('#example').dataTable( {
69782                  *     "ajax": {
69783                  *       "url": "data.json",
69784                  *       "data": function ( d ) {
69785                  *         return {
69786                  *           "extra_search": $('#extra').val()
69787                  *         };
69788                  *       }
69789                  *     }
69790                  *   } );
69791                  *
69792                  * @example
69793                  *   // Send request as POST
69794                  *   $('#example').dataTable( {
69795                  *     "ajax": {
69796                  *       "url": "data.json",
69797                  *       "type": "POST"
69798                  *     }
69799                  *   } );
69800                  *
69801                  * @example
69802                  *   // Get the data from localStorage (could interface with a form for
69803                  *   // adding, editing and removing rows).
69804                  *   $('#example').dataTable( {
69805                  *     "ajax": function (data, callback, settings) {
69806                  *       callback(
69807                  *         JSON.parse( localStorage.getItem('dataTablesData') )
69808                  *       );
69809                  *     }
69810                  *   } );
69811                  */
69812                 "ajax": null,
69815                 /**
69816                  * This parameter allows you to readily specify the entries in the length drop
69817                  * down menu that DataTables shows when pagination is enabled. It can be
69818                  * either a 1D array of options which will be used for both the displayed
69819                  * option and the value, or a 2D array which will use the array in the first
69820                  * position as the value, and the array in the second position as the
69821                  * displayed options (useful for language strings such as 'All').
69822                  *
69823                  * Note that the `pageLength` property will be automatically set to the
69824                  * first value given in this array, unless `pageLength` is also provided.
69825                  *  @type array
69826                  *  @default [ 10, 25, 50, 100 ]
69827                  *
69828                  *  @dtopt Option
69829                  *  @name DataTable.defaults.lengthMenu
69830                  *
69831                  *  @example
69832                  *    $(document).ready( function() {
69833                  *      $('#example').dataTable( {
69834                  *        "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
69835                  *      } );
69836                  *    } );
69837                  */
69838                 "aLengthMenu": [ 10, 25, 50, 100 ],
69841                 /**
69842                  * The `columns` option in the initialisation parameter allows you to define
69843                  * details about the way individual columns behave. For a full list of
69844                  * column options that can be set, please see
69845                  * {@link DataTable.defaults.column}. Note that if you use `columns` to
69846                  * define your columns, you must have an entry in the array for every single
69847                  * column that you have in your table (these can be null if you don't which
69848                  * to specify any options).
69849                  *  @member
69850                  *
69851                  *  @name DataTable.defaults.column
69852                  */
69853                 "aoColumns": null,
69855                 /**
69856                  * Very similar to `columns`, `columnDefs` allows you to target a specific
69857                  * column, multiple columns, or all columns, using the `targets` property of
69858                  * each object in the array. This allows great flexibility when creating
69859                  * tables, as the `columnDefs` arrays can be of any length, targeting the
69860                  * columns you specifically want. `columnDefs` may use any of the column
69861                  * options available: {@link DataTable.defaults.column}, but it _must_
69862                  * have `targets` defined in each object in the array. Values in the `targets`
69863                  * array may be:
69864                  *   <ul>
69865                  *     <li>a string - class name will be matched on the TH for the column</li>
69866                  *     <li>0 or a positive integer - column index counting from the left</li>
69867                  *     <li>a negative integer - column index counting from the right</li>
69868                  *     <li>the string "_all" - all columns (i.e. assign a default)</li>
69869                  *   </ul>
69870                  *  @member
69871                  *
69872                  *  @name DataTable.defaults.columnDefs
69873                  */
69874                 "aoColumnDefs": null,
69877                 /**
69878                  * Basically the same as `search`, this parameter defines the individual column
69879                  * filtering state at initialisation time. The array must be of the same size
69880                  * as the number of columns, and each element be an object with the parameters
69881                  * `search` and `escapeRegex` (the latter is optional). 'null' is also
69882                  * accepted and the default will be used.
69883                  *  @type array
69884                  *  @default []
69885                  *
69886                  *  @dtopt Option
69887                  *  @name DataTable.defaults.searchCols
69888                  *
69889                  *  @example
69890                  *    $(document).ready( function() {
69891                  *      $('#example').dataTable( {
69892                  *        "searchCols": [
69893                  *          null,
69894                  *          { "search": "My filter" },
69895                  *          null,
69896                  *          { "search": "^[0-9]", "escapeRegex": false }
69897                  *        ]
69898                  *      } );
69899                  *    } )
69900                  */
69901                 "aoSearchCols": [],
69904                 /**
69905                  * An array of CSS classes that should be applied to displayed rows. This
69906                  * array may be of any length, and DataTables will apply each class
69907                  * sequentially, looping when required.
69908                  *  @type array
69909                  *  @default null <i>Will take the values determined by the `oClasses.stripe*`
69910                  *    options</i>
69911                  *
69912                  *  @dtopt Option
69913                  *  @name DataTable.defaults.stripeClasses
69914                  *
69915                  *  @example
69916                  *    $(document).ready( function() {
69917                  *      $('#example').dataTable( {
69918                  *        "stripeClasses": [ 'strip1', 'strip2', 'strip3' ]
69919                  *      } );
69920                  *    } )
69921                  */
69922                 "asStripeClasses": null,
69925                 /**
69926                  * Enable or disable automatic column width calculation. This can be disabled
69927                  * as an optimisation (it takes some time to calculate the widths) if the
69928                  * tables widths are passed in using `columns`.
69929                  *  @type boolean
69930                  *  @default true
69931                  *
69932                  *  @dtopt Features
69933                  *  @name DataTable.defaults.autoWidth
69934                  *
69935                  *  @example
69936                  *    $(document).ready( function () {
69937                  *      $('#example').dataTable( {
69938                  *        "autoWidth": false
69939                  *      } );
69940                  *    } );
69941                  */
69942                 "bAutoWidth": true,
69945                 /**
69946                  * Deferred rendering can provide DataTables with a huge speed boost when you
69947                  * are using an Ajax or JS data source for the table. This option, when set to
69948                  * true, will cause DataTables to defer the creation of the table elements for
69949                  * each row until they are needed for a draw - saving a significant amount of
69950                  * time.
69951                  *  @type boolean
69952                  *  @default false
69953                  *
69954                  *  @dtopt Features
69955                  *  @name DataTable.defaults.deferRender
69956                  *
69957                  *  @example
69958                  *    $(document).ready( function() {
69959                  *      $('#example').dataTable( {
69960                  *        "ajax": "sources/arrays.txt",
69961                  *        "deferRender": true
69962                  *      } );
69963                  *    } );
69964                  */
69965                 "bDeferRender": false,
69968                 /**
69969                  * Replace a DataTable which matches the given selector and replace it with
69970                  * one which has the properties of the new initialisation object passed. If no
69971                  * table matches the selector, then the new DataTable will be constructed as
69972                  * per normal.
69973                  *  @type boolean
69974                  *  @default false
69975                  *
69976                  *  @dtopt Options
69977                  *  @name DataTable.defaults.destroy
69978                  *
69979                  *  @example
69980                  *    $(document).ready( function() {
69981                  *      $('#example').dataTable( {
69982                  *        "srollY": "200px",
69983                  *        "paginate": false
69984                  *      } );
69985                  *
69986                  *      // Some time later....
69987                  *      $('#example').dataTable( {
69988                  *        "filter": false,
69989                  *        "destroy": true
69990                  *      } );
69991                  *    } );
69992                  */
69993                 "bDestroy": false,
69996                 /**
69997                  * Enable or disable filtering of data. Filtering in DataTables is "smart" in
69998                  * that it allows the end user to input multiple words (space separated) and
69999                  * will match a row containing those words, even if not in the order that was
70000                  * specified (this allow matching across multiple columns). Note that if you
70001                  * wish to use filtering in DataTables this must remain 'true' - to remove the
70002                  * default filtering input box and retain filtering abilities, please use
70003                  * {@link DataTable.defaults.dom}.
70004                  *  @type boolean
70005                  *  @default true
70006                  *
70007                  *  @dtopt Features
70008                  *  @name DataTable.defaults.searching
70009                  *
70010                  *  @example
70011                  *    $(document).ready( function () {
70012                  *      $('#example').dataTable( {
70013                  *        "searching": false
70014                  *      } );
70015                  *    } );
70016                  */
70017                 "bFilter": true,
70020                 /**
70021                  * Enable or disable the table information display. This shows information
70022                  * about the data that is currently visible on the page, including information
70023                  * about filtered data if that action is being performed.
70024                  *  @type boolean
70025                  *  @default true
70026                  *
70027                  *  @dtopt Features
70028                  *  @name DataTable.defaults.info
70029                  *
70030                  *  @example
70031                  *    $(document).ready( function () {
70032                  *      $('#example').dataTable( {
70033                  *        "info": false
70034                  *      } );
70035                  *    } );
70036                  */
70037                 "bInfo": true,
70040                 /**
70041                  * Allows the end user to select the size of a formatted page from a select
70042                  * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).
70043                  *  @type boolean
70044                  *  @default true
70045                  *
70046                  *  @dtopt Features
70047                  *  @name DataTable.defaults.lengthChange
70048                  *
70049                  *  @example
70050                  *    $(document).ready( function () {
70051                  *      $('#example').dataTable( {
70052                  *        "lengthChange": false
70053                  *      } );
70054                  *    } );
70055                  */
70056                 "bLengthChange": true,
70059                 /**
70060                  * Enable or disable pagination.
70061                  *  @type boolean
70062                  *  @default true
70063                  *
70064                  *  @dtopt Features
70065                  *  @name DataTable.defaults.paging
70066                  *
70067                  *  @example
70068                  *    $(document).ready( function () {
70069                  *      $('#example').dataTable( {
70070                  *        "paging": false
70071                  *      } );
70072                  *    } );
70073                  */
70074                 "bPaginate": true,
70077                 /**
70078                  * Enable or disable the display of a 'processing' indicator when the table is
70079                  * being processed (e.g. a sort). This is particularly useful for tables with
70080                  * large amounts of data where it can take a noticeable amount of time to sort
70081                  * the entries.
70082                  *  @type boolean
70083                  *  @default false
70084                  *
70085                  *  @dtopt Features
70086                  *  @name DataTable.defaults.processing
70087                  *
70088                  *  @example
70089                  *    $(document).ready( function () {
70090                  *      $('#example').dataTable( {
70091                  *        "processing": true
70092                  *      } );
70093                  *    } );
70094                  */
70095                 "bProcessing": false,
70098                 /**
70099                  * Retrieve the DataTables object for the given selector. Note that if the
70100                  * table has already been initialised, this parameter will cause DataTables
70101                  * to simply return the object that has already been set up - it will not take
70102                  * account of any changes you might have made to the initialisation object
70103                  * passed to DataTables (setting this parameter to true is an acknowledgement
70104                  * that you understand this). `destroy` can be used to reinitialise a table if
70105                  * you need.
70106                  *  @type boolean
70107                  *  @default false
70108                  *
70109                  *  @dtopt Options
70110                  *  @name DataTable.defaults.retrieve
70111                  *
70112                  *  @example
70113                  *    $(document).ready( function() {
70114                  *      initTable();
70115                  *      tableActions();
70116                  *    } );
70117                  *
70118                  *    function initTable ()
70119                  *    {
70120                  *      return $('#example').dataTable( {
70121                  *        "scrollY": "200px",
70122                  *        "paginate": false,
70123                  *        "retrieve": true
70124                  *      } );
70125                  *    }
70126                  *
70127                  *    function tableActions ()
70128                  *    {
70129                  *      var table = initTable();
70130                  *      // perform API operations with oTable
70131                  *    }
70132                  */
70133                 "bRetrieve": false,
70136                 /**
70137                  * When vertical (y) scrolling is enabled, DataTables will force the height of
70138                  * the table's viewport to the given height at all times (useful for layout).
70139                  * However, this can look odd when filtering data down to a small data set,
70140                  * and the footer is left "floating" further down. This parameter (when
70141                  * enabled) will cause DataTables to collapse the table's viewport down when
70142                  * the result set will fit within the given Y height.
70143                  *  @type boolean
70144                  *  @default false
70145                  *
70146                  *  @dtopt Options
70147                  *  @name DataTable.defaults.scrollCollapse
70148                  *
70149                  *  @example
70150                  *    $(document).ready( function() {
70151                  *      $('#example').dataTable( {
70152                  *        "scrollY": "200",
70153                  *        "scrollCollapse": true
70154                  *      } );
70155                  *    } );
70156                  */
70157                 "bScrollCollapse": false,
70160                 /**
70161                  * Configure DataTables to use server-side processing. Note that the
70162                  * `ajax` parameter must also be given in order to give DataTables a
70163                  * source to obtain the required data for each draw.
70164                  *  @type boolean
70165                  *  @default false
70166                  *
70167                  *  @dtopt Features
70168                  *  @dtopt Server-side
70169                  *  @name DataTable.defaults.serverSide
70170                  *
70171                  *  @example
70172                  *    $(document).ready( function () {
70173                  *      $('#example').dataTable( {
70174                  *        "serverSide": true,
70175                  *        "ajax": "xhr.php"
70176                  *      } );
70177                  *    } );
70178                  */
70179                 "bServerSide": false,
70182                 /**
70183                  * Enable or disable sorting of columns. Sorting of individual columns can be
70184                  * disabled by the `sortable` option for each column.
70185                  *  @type boolean
70186                  *  @default true
70187                  *
70188                  *  @dtopt Features
70189                  *  @name DataTable.defaults.ordering
70190                  *
70191                  *  @example
70192                  *    $(document).ready( function () {
70193                  *      $('#example').dataTable( {
70194                  *        "ordering": false
70195                  *      } );
70196                  *    } );
70197                  */
70198                 "bSort": true,
70201                 /**
70202                  * Enable or display DataTables' ability to sort multiple columns at the
70203                  * same time (activated by shift-click by the user).
70204                  *  @type boolean
70205                  *  @default true
70206                  *
70207                  *  @dtopt Options
70208                  *  @name DataTable.defaults.orderMulti
70209                  *
70210                  *  @example
70211                  *    // Disable multiple column sorting ability
70212                  *    $(document).ready( function () {
70213                  *      $('#example').dataTable( {
70214                  *        "orderMulti": false
70215                  *      } );
70216                  *    } );
70217                  */
70218                 "bSortMulti": true,
70221                 /**
70222                  * Allows control over whether DataTables should use the top (true) unique
70223                  * cell that is found for a single column, or the bottom (false - default).
70224                  * This is useful when using complex headers.
70225                  *  @type boolean
70226                  *  @default false
70227                  *
70228                  *  @dtopt Options
70229                  *  @name DataTable.defaults.orderCellsTop
70230                  *
70231                  *  @example
70232                  *    $(document).ready( function() {
70233                  *      $('#example').dataTable( {
70234                  *        "orderCellsTop": true
70235                  *      } );
70236                  *    } );
70237                  */
70238                 "bSortCellsTop": false,
70241                 /**
70242                  * Enable or disable the addition of the classes `sorting\_1`, `sorting\_2` and
70243                  * `sorting\_3` to the columns which are currently being sorted on. This is
70244                  * presented as a feature switch as it can increase processing time (while
70245                  * classes are removed and added) so for large data sets you might want to
70246                  * turn this off.
70247                  *  @type boolean
70248                  *  @default true
70249                  *
70250                  *  @dtopt Features
70251                  *  @name DataTable.defaults.orderClasses
70252                  *
70253                  *  @example
70254                  *    $(document).ready( function () {
70255                  *      $('#example').dataTable( {
70256                  *        "orderClasses": false
70257                  *      } );
70258                  *    } );
70259                  */
70260                 "bSortClasses": true,
70263                 /**
70264                  * Enable or disable state saving. When enabled HTML5 `localStorage` will be
70265                  * used to save table display information such as pagination information,
70266                  * display length, filtering and sorting. As such when the end user reloads
70267                  * the page the display display will match what thy had previously set up.
70268                  *
70269                  * Due to the use of `localStorage` the default state saving is not supported
70270                  * in IE6 or 7. If state saving is required in those browsers, use
70271                  * `stateSaveCallback` to provide a storage solution such as cookies.
70272                  *  @type boolean
70273                  *  @default false
70274                  *
70275                  *  @dtopt Features
70276                  *  @name DataTable.defaults.stateSave
70277                  *
70278                  *  @example
70279                  *    $(document).ready( function () {
70280                  *      $('#example').dataTable( {
70281                  *        "stateSave": true
70282                  *      } );
70283                  *    } );
70284                  */
70285                 "bStateSave": false,
70288                 /**
70289                  * This function is called when a TR element is created (and all TD child
70290                  * elements have been inserted), or registered if using a DOM source, allowing
70291                  * manipulation of the TR element (adding classes etc).
70292                  *  @type function
70293                  *  @param {node} row "TR" element for the current row
70294                  *  @param {array} data Raw data array for this row
70295                  *  @param {int} dataIndex The index of this row in the internal aoData array
70296                  *
70297                  *  @dtopt Callbacks
70298                  *  @name DataTable.defaults.createdRow
70299                  *
70300                  *  @example
70301                  *    $(document).ready( function() {
70302                  *      $('#example').dataTable( {
70303                  *        "createdRow": function( row, data, dataIndex ) {
70304                  *          // Bold the grade for all 'A' grade browsers
70305                  *          if ( data[4] == "A" )
70306                  *          {
70307                  *            $('td:eq(4)', row).html( '<b>A</b>' );
70308                  *          }
70309                  *        }
70310                  *      } );
70311                  *    } );
70312                  */
70313                 "fnCreatedRow": null,
70316                 /**
70317                  * This function is called on every 'draw' event, and allows you to
70318                  * dynamically modify any aspect you want about the created DOM.
70319                  *  @type function
70320                  *  @param {object} settings DataTables settings object
70321                  *
70322                  *  @dtopt Callbacks
70323                  *  @name DataTable.defaults.drawCallback
70324                  *
70325                  *  @example
70326                  *    $(document).ready( function() {
70327                  *      $('#example').dataTable( {
70328                  *        "drawCallback": function( settings ) {
70329                  *          alert( 'DataTables has redrawn the table' );
70330                  *        }
70331                  *      } );
70332                  *    } );
70333                  */
70334                 "fnDrawCallback": null,
70337                 /**
70338                  * Identical to fnHeaderCallback() but for the table footer this function
70339                  * allows you to modify the table footer on every 'draw' event.
70340                  *  @type function
70341                  *  @param {node} foot "TR" element for the footer
70342                  *  @param {array} data Full table data (as derived from the original HTML)
70343                  *  @param {int} start Index for the current display starting point in the
70344                  *    display array
70345                  *  @param {int} end Index for the current display ending point in the
70346                  *    display array
70347                  *  @param {array int} display Index array to translate the visual position
70348                  *    to the full data array
70349                  *
70350                  *  @dtopt Callbacks
70351                  *  @name DataTable.defaults.footerCallback
70352                  *
70353                  *  @example
70354                  *    $(document).ready( function() {
70355                  *      $('#example').dataTable( {
70356                  *        "footerCallback": function( tfoot, data, start, end, display ) {
70357                  *          tfoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+start;
70358                  *        }
70359                  *      } );
70360                  *    } )
70361                  */
70362                 "fnFooterCallback": null,
70365                 /**
70366                  * When rendering large numbers in the information element for the table
70367                  * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers
70368                  * to have a comma separator for the 'thousands' units (e.g. 1 million is
70369                  * rendered as "1,000,000") to help readability for the end user. This
70370                  * function will override the default method DataTables uses.
70371                  *  @type function
70372                  *  @member
70373                  *  @param {int} toFormat number to be formatted
70374                  *  @returns {string} formatted string for DataTables to show the number
70375                  *
70376                  *  @dtopt Callbacks
70377                  *  @name DataTable.defaults.formatNumber
70378                  *
70379                  *  @example
70380                  *    // Format a number using a single quote for the separator (note that
70381                  *    // this can also be done with the language.thousands option)
70382                  *    $(document).ready( function() {
70383                  *      $('#example').dataTable( {
70384                  *        "formatNumber": function ( toFormat ) {
70385                  *          return toFormat.toString().replace(
70386                  *            /\B(?=(\d{3})+(?!\d))/g, "'"
70387                  *          );
70388                  *        };
70389                  *      } );
70390                  *    } );
70391                  */
70392                 "fnFormatNumber": function ( toFormat ) {
70393                         return toFormat.toString().replace(
70394                                 /\B(?=(\d{3})+(?!\d))/g,
70395                                 this.oLanguage.sThousands
70396                         );
70397                 },
70400                 /**
70401                  * This function is called on every 'draw' event, and allows you to
70402                  * dynamically modify the header row. This can be used to calculate and
70403                  * display useful information about the table.
70404                  *  @type function
70405                  *  @param {node} head "TR" element for the header
70406                  *  @param {array} data Full table data (as derived from the original HTML)
70407                  *  @param {int} start Index for the current display starting point in the
70408                  *    display array
70409                  *  @param {int} end Index for the current display ending point in the
70410                  *    display array
70411                  *  @param {array int} display Index array to translate the visual position
70412                  *    to the full data array
70413                  *
70414                  *  @dtopt Callbacks
70415                  *  @name DataTable.defaults.headerCallback
70416                  *
70417                  *  @example
70418                  *    $(document).ready( function() {
70419                  *      $('#example').dataTable( {
70420                  *        "fheaderCallback": function( head, data, start, end, display ) {
70421                  *          head.getElementsByTagName('th')[0].innerHTML = "Displaying "+(end-start)+" records";
70422                  *        }
70423                  *      } );
70424                  *    } )
70425                  */
70426                 "fnHeaderCallback": null,
70429                 /**
70430                  * The information element can be used to convey information about the current
70431                  * state of the table. Although the internationalisation options presented by
70432                  * DataTables are quite capable of dealing with most customisations, there may
70433                  * be times where you wish to customise the string further. This callback
70434                  * allows you to do exactly that.
70435                  *  @type function
70436                  *  @param {object} oSettings DataTables settings object
70437                  *  @param {int} start Starting position in data for the draw
70438                  *  @param {int} end End position in data for the draw
70439                  *  @param {int} max Total number of rows in the table (regardless of
70440                  *    filtering)
70441                  *  @param {int} total Total number of rows in the data set, after filtering
70442                  *  @param {string} pre The string that DataTables has formatted using it's
70443                  *    own rules
70444                  *  @returns {string} The string to be displayed in the information element.
70445                  *
70446                  *  @dtopt Callbacks
70447                  *  @name DataTable.defaults.infoCallback
70448                  *
70449                  *  @example
70450                  *    $('#example').dataTable( {
70451                  *      "infoCallback": function( settings, start, end, max, total, pre ) {
70452                  *        return start +" to "+ end;
70453                  *      }
70454                  *    } );
70455                  */
70456                 "fnInfoCallback": null,
70459                 /**
70460                  * Called when the table has been initialised. Normally DataTables will
70461                  * initialise sequentially and there will be no need for this function,
70462                  * however, this does not hold true when using external language information
70463                  * since that is obtained using an async XHR call.
70464                  *  @type function
70465                  *  @param {object} settings DataTables settings object
70466                  *  @param {object} json The JSON object request from the server - only
70467                  *    present if client-side Ajax sourced data is used
70468                  *
70469                  *  @dtopt Callbacks
70470                  *  @name DataTable.defaults.initComplete
70471                  *
70472                  *  @example
70473                  *    $(document).ready( function() {
70474                  *      $('#example').dataTable( {
70475                  *        "initComplete": function(settings, json) {
70476                  *          alert( 'DataTables has finished its initialisation.' );
70477                  *        }
70478                  *      } );
70479                  *    } )
70480                  */
70481                 "fnInitComplete": null,
70484                 /**
70485                  * Called at the very start of each table draw and can be used to cancel the
70486                  * draw by returning false, any other return (including undefined) results in
70487                  * the full draw occurring).
70488                  *  @type function
70489                  *  @param {object} settings DataTables settings object
70490                  *  @returns {boolean} False will cancel the draw, anything else (including no
70491                  *    return) will allow it to complete.
70492                  *
70493                  *  @dtopt Callbacks
70494                  *  @name DataTable.defaults.preDrawCallback
70495                  *
70496                  *  @example
70497                  *    $(document).ready( function() {
70498                  *      $('#example').dataTable( {
70499                  *        "preDrawCallback": function( settings ) {
70500                  *          if ( $('#test').val() == 1 ) {
70501                  *            return false;
70502                  *          }
70503                  *        }
70504                  *      } );
70505                  *    } );
70506                  */
70507                 "fnPreDrawCallback": null,
70510                 /**
70511                  * This function allows you to 'post process' each row after it have been
70512                  * generated for each table draw, but before it is rendered on screen. This
70513                  * function might be used for setting the row class name etc.
70514                  *  @type function
70515                  *  @param {node} row "TR" element for the current row
70516                  *  @param {array} data Raw data array for this row
70517                  *  @param {int} displayIndex The display index for the current table draw
70518                  *  @param {int} displayIndexFull The index of the data in the full list of
70519                  *    rows (after filtering)
70520                  *
70521                  *  @dtopt Callbacks
70522                  *  @name DataTable.defaults.rowCallback
70523                  *
70524                  *  @example
70525                  *    $(document).ready( function() {
70526                  *      $('#example').dataTable( {
70527                  *        "rowCallback": function( row, data, displayIndex, displayIndexFull ) {
70528                  *          // Bold the grade for all 'A' grade browsers
70529                  *          if ( data[4] == "A" ) {
70530                  *            $('td:eq(4)', row).html( '<b>A</b>' );
70531                  *          }
70532                  *        }
70533                  *      } );
70534                  *    } );
70535                  */
70536                 "fnRowCallback": null,
70539                 /**
70540                  * __Deprecated__ The functionality provided by this parameter has now been
70541                  * superseded by that provided through `ajax`, which should be used instead.
70542                  *
70543                  * This parameter allows you to override the default function which obtains
70544                  * the data from the server so something more suitable for your application.
70545                  * For example you could use POST data, or pull information from a Gears or
70546                  * AIR database.
70547                  *  @type function
70548                  *  @member
70549                  *  @param {string} source HTTP source to obtain the data from (`ajax`)
70550                  *  @param {array} data A key/value pair object containing the data to send
70551                  *    to the server
70552                  *  @param {function} callback to be called on completion of the data get
70553                  *    process that will draw the data on the page.
70554                  *  @param {object} settings DataTables settings object
70555                  *
70556                  *  @dtopt Callbacks
70557                  *  @dtopt Server-side
70558                  *  @name DataTable.defaults.serverData
70559                  *
70560                  *  @deprecated 1.10. Please use `ajax` for this functionality now.
70561                  */
70562                 "fnServerData": null,
70565                 /**
70566                  * __Deprecated__ The functionality provided by this parameter has now been
70567                  * superseded by that provided through `ajax`, which should be used instead.
70568                  *
70569                  *  It is often useful to send extra data to the server when making an Ajax
70570                  * request - for example custom filtering information, and this callback
70571                  * function makes it trivial to send extra information to the server. The
70572                  * passed in parameter is the data set that has been constructed by
70573                  * DataTables, and you can add to this or modify it as you require.
70574                  *  @type function
70575                  *  @param {array} data Data array (array of objects which are name/value
70576                  *    pairs) that has been constructed by DataTables and will be sent to the
70577                  *    server. In the case of Ajax sourced data with server-side processing
70578                  *    this will be an empty array, for server-side processing there will be a
70579                  *    significant number of parameters!
70580                  *  @returns {undefined} Ensure that you modify the data array passed in,
70581                  *    as this is passed by reference.
70582                  *
70583                  *  @dtopt Callbacks
70584                  *  @dtopt Server-side
70585                  *  @name DataTable.defaults.serverParams
70586                  *
70587                  *  @deprecated 1.10. Please use `ajax` for this functionality now.
70588                  */
70589                 "fnServerParams": null,
70592                 /**
70593                  * Load the table state. With this function you can define from where, and how, the
70594                  * state of a table is loaded. By default DataTables will load from `localStorage`
70595                  * but you might wish to use a server-side database or cookies.
70596                  *  @type function
70597                  *  @member
70598                  *  @param {object} settings DataTables settings object
70599                  *  @param {object} callback Callback that can be executed when done. It
70600                  *    should be passed the loaded state object.
70601                  *  @return {object} The DataTables state object to be loaded
70602                  *
70603                  *  @dtopt Callbacks
70604                  *  @name DataTable.defaults.stateLoadCallback
70605                  *
70606                  *  @example
70607                  *    $(document).ready( function() {
70608                  *      $('#example').dataTable( {
70609                  *        "stateSave": true,
70610                  *        "stateLoadCallback": function (settings, callback) {
70611                  *          $.ajax( {
70612                  *            "url": "/state_load",
70613                  *            "dataType": "json",
70614                  *            "success": function (json) {
70615                  *              callback( json );
70616                  *            }
70617                  *          } );
70618                  *        }
70619                  *      } );
70620                  *    } );
70621                  */
70622                 "fnStateLoadCallback": function ( settings ) {
70623                         try {
70624                                 return JSON.parse(
70625                                         (settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(
70626                                                 'DataTables_'+settings.sInstance+'_'+location.pathname
70627                                         )
70628                                 );
70629                         } catch (e) {}
70630                 },
70633                 /**
70634                  * Callback which allows modification of the saved state prior to loading that state.
70635                  * This callback is called when the table is loading state from the stored data, but
70636                  * prior to the settings object being modified by the saved state. Note that for
70637                  * plug-in authors, you should use the `stateLoadParams` event to load parameters for
70638                  * a plug-in.
70639                  *  @type function
70640                  *  @param {object} settings DataTables settings object
70641                  *  @param {object} data The state object that is to be loaded
70642                  *
70643                  *  @dtopt Callbacks
70644                  *  @name DataTable.defaults.stateLoadParams
70645                  *
70646                  *  @example
70647                  *    // Remove a saved filter, so filtering is never loaded
70648                  *    $(document).ready( function() {
70649                  *      $('#example').dataTable( {
70650                  *        "stateSave": true,
70651                  *        "stateLoadParams": function (settings, data) {
70652                  *          data.oSearch.sSearch = "";
70653                  *        }
70654                  *      } );
70655                  *    } );
70656                  *
70657                  *  @example
70658                  *    // Disallow state loading by returning false
70659                  *    $(document).ready( function() {
70660                  *      $('#example').dataTable( {
70661                  *        "stateSave": true,
70662                  *        "stateLoadParams": function (settings, data) {
70663                  *          return false;
70664                  *        }
70665                  *      } );
70666                  *    } );
70667                  */
70668                 "fnStateLoadParams": null,
70671                 /**
70672                  * Callback that is called when the state has been loaded from the state saving method
70673                  * and the DataTables settings object has been modified as a result of the loaded state.
70674                  *  @type function
70675                  *  @param {object} settings DataTables settings object
70676                  *  @param {object} data The state object that was loaded
70677                  *
70678                  *  @dtopt Callbacks
70679                  *  @name DataTable.defaults.stateLoaded
70680                  *
70681                  *  @example
70682                  *    // Show an alert with the filtering value that was saved
70683                  *    $(document).ready( function() {
70684                  *      $('#example').dataTable( {
70685                  *        "stateSave": true,
70686                  *        "stateLoaded": function (settings, data) {
70687                  *          alert( 'Saved filter was: '+data.oSearch.sSearch );
70688                  *        }
70689                  *      } );
70690                  *    } );
70691                  */
70692                 "fnStateLoaded": null,
70695                 /**
70696                  * Save the table state. This function allows you to define where and how the state
70697                  * information for the table is stored By default DataTables will use `localStorage`
70698                  * but you might wish to use a server-side database or cookies.
70699                  *  @type function
70700                  *  @member
70701                  *  @param {object} settings DataTables settings object
70702                  *  @param {object} data The state object to be saved
70703                  *
70704                  *  @dtopt Callbacks
70705                  *  @name DataTable.defaults.stateSaveCallback
70706                  *
70707                  *  @example
70708                  *    $(document).ready( function() {
70709                  *      $('#example').dataTable( {
70710                  *        "stateSave": true,
70711                  *        "stateSaveCallback": function (settings, data) {
70712                  *          // Send an Ajax request to the server with the state object
70713                  *          $.ajax( {
70714                  *            "url": "/state_save",
70715                  *            "data": data,
70716                  *            "dataType": "json",
70717                  *            "method": "POST"
70718                  *            "success": function () {}
70719                  *          } );
70720                  *        }
70721                  *      } );
70722                  *    } );
70723                  */
70724                 "fnStateSaveCallback": function ( settings, data ) {
70725                         try {
70726                                 (settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(
70727                                         'DataTables_'+settings.sInstance+'_'+location.pathname,
70728                                         JSON.stringify( data )
70729                                 );
70730                         } catch (e) {}
70731                 },
70734                 /**
70735                  * Callback which allows modification of the state to be saved. Called when the table
70736                  * has changed state a new state save is required. This method allows modification of
70737                  * the state saving object prior to actually doing the save, including addition or
70738                  * other state properties or modification. Note that for plug-in authors, you should
70739                  * use the `stateSaveParams` event to save parameters for a plug-in.
70740                  *  @type function
70741                  *  @param {object} settings DataTables settings object
70742                  *  @param {object} data The state object to be saved
70743                  *
70744                  *  @dtopt Callbacks
70745                  *  @name DataTable.defaults.stateSaveParams
70746                  *
70747                  *  @example
70748                  *    // Remove a saved filter, so filtering is never saved
70749                  *    $(document).ready( function() {
70750                  *      $('#example').dataTable( {
70751                  *        "stateSave": true,
70752                  *        "stateSaveParams": function (settings, data) {
70753                  *          data.oSearch.sSearch = "";
70754                  *        }
70755                  *      } );
70756                  *    } );
70757                  */
70758                 "fnStateSaveParams": null,
70761                 /**
70762                  * Duration for which the saved state information is considered valid. After this period
70763                  * has elapsed the state will be returned to the default.
70764                  * Value is given in seconds.
70765                  *  @type int
70766                  *  @default 7200 <i>(2 hours)</i>
70767                  *
70768                  *  @dtopt Options
70769                  *  @name DataTable.defaults.stateDuration
70770                  *
70771                  *  @example
70772                  *    $(document).ready( function() {
70773                  *      $('#example').dataTable( {
70774                  *        "stateDuration": 60*60*24; // 1 day
70775                  *      } );
70776                  *    } )
70777                  */
70778                 "iStateDuration": 7200,
70781                 /**
70782                  * When enabled DataTables will not make a request to the server for the first
70783                  * page draw - rather it will use the data already on the page (no sorting etc
70784                  * will be applied to it), thus saving on an XHR at load time. `deferLoading`
70785                  * is used to indicate that deferred loading is required, but it is also used
70786                  * to tell DataTables how many records there are in the full table (allowing
70787                  * the information element and pagination to be displayed correctly). In the case
70788                  * where a filtering is applied to the table on initial load, this can be
70789                  * indicated by giving the parameter as an array, where the first element is
70790                  * the number of records available after filtering and the second element is the
70791                  * number of records without filtering (allowing the table information element
70792                  * to be shown correctly).
70793                  *  @type int | array
70794                  *  @default null
70795                  *
70796                  *  @dtopt Options
70797                  *  @name DataTable.defaults.deferLoading
70798                  *
70799                  *  @example
70800                  *    // 57 records available in the table, no filtering applied
70801                  *    $(document).ready( function() {
70802                  *      $('#example').dataTable( {
70803                  *        "serverSide": true,
70804                  *        "ajax": "scripts/server_processing.php",
70805                  *        "deferLoading": 57
70806                  *      } );
70807                  *    } );
70808                  *
70809                  *  @example
70810                  *    // 57 records after filtering, 100 without filtering (an initial filter applied)
70811                  *    $(document).ready( function() {
70812                  *      $('#example').dataTable( {
70813                  *        "serverSide": true,
70814                  *        "ajax": "scripts/server_processing.php",
70815                  *        "deferLoading": [ 57, 100 ],
70816                  *        "search": {
70817                  *          "search": "my_filter"
70818                  *        }
70819                  *      } );
70820                  *    } );
70821                  */
70822                 "iDeferLoading": null,
70825                 /**
70826                  * Number of rows to display on a single page when using pagination. If
70827                  * feature enabled (`lengthChange`) then the end user will be able to override
70828                  * this to a custom setting using a pop-up menu.
70829                  *  @type int
70830                  *  @default 10
70831                  *
70832                  *  @dtopt Options
70833                  *  @name DataTable.defaults.pageLength
70834                  *
70835                  *  @example
70836                  *    $(document).ready( function() {
70837                  *      $('#example').dataTable( {
70838                  *        "pageLength": 50
70839                  *      } );
70840                  *    } )
70841                  */
70842                 "iDisplayLength": 10,
70845                 /**
70846                  * Define the starting point for data display when using DataTables with
70847                  * pagination. Note that this parameter is the number of records, rather than
70848                  * the page number, so if you have 10 records per page and want to start on
70849                  * the third page, it should be "20".
70850                  *  @type int
70851                  *  @default 0
70852                  *
70853                  *  @dtopt Options
70854                  *  @name DataTable.defaults.displayStart
70855                  *
70856                  *  @example
70857                  *    $(document).ready( function() {
70858                  *      $('#example').dataTable( {
70859                  *        "displayStart": 20
70860                  *      } );
70861                  *    } )
70862                  */
70863                 "iDisplayStart": 0,
70866                 /**
70867                  * By default DataTables allows keyboard navigation of the table (sorting, paging,
70868                  * and filtering) by adding a `tabindex` attribute to the required elements. This
70869                  * allows you to tab through the controls and press the enter key to activate them.
70870                  * The tabindex is default 0, meaning that the tab follows the flow of the document.
70871                  * You can overrule this using this parameter if you wish. Use a value of -1 to
70872                  * disable built-in keyboard navigation.
70873                  *  @type int
70874                  *  @default 0
70875                  *
70876                  *  @dtopt Options
70877                  *  @name DataTable.defaults.tabIndex
70878                  *
70879                  *  @example
70880                  *    $(document).ready( function() {
70881                  *      $('#example').dataTable( {
70882                  *        "tabIndex": 1
70883                  *      } );
70884                  *    } );
70885                  */
70886                 "iTabIndex": 0,
70889                 /**
70890                  * Classes that DataTables assigns to the various components and features
70891                  * that it adds to the HTML table. This allows classes to be configured
70892                  * during initialisation in addition to through the static
70893                  * {@link DataTable.ext.oStdClasses} object).
70894                  *  @namespace
70895                  *  @name DataTable.defaults.classes
70896                  */
70897                 "oClasses": {},
70900                 /**
70901                  * All strings that DataTables uses in the user interface that it creates
70902                  * are defined in this object, allowing you to modified them individually or
70903                  * completely replace them all as required.
70904                  *  @namespace
70905                  *  @name DataTable.defaults.language
70906                  */
70907                 "oLanguage": {
70908                         /**
70909                          * Strings that are used for WAI-ARIA labels and controls only (these are not
70910                          * actually visible on the page, but will be read by screenreaders, and thus
70911                          * must be internationalised as well).
70912                          *  @namespace
70913                          *  @name DataTable.defaults.language.aria
70914                          */
70915                         "oAria": {
70916                                 /**
70917                                  * ARIA label that is added to the table headers when the column may be
70918                                  * sorted ascending by activing the column (click or return when focused).
70919                                  * Note that the column header is prefixed to this string.
70920                                  *  @type string
70921                                  *  @default : activate to sort column ascending
70922                                  *
70923                                  *  @dtopt Language
70924                                  *  @name DataTable.defaults.language.aria.sortAscending
70925                                  *
70926                                  *  @example
70927                                  *    $(document).ready( function() {
70928                                  *      $('#example').dataTable( {
70929                                  *        "language": {
70930                                  *          "aria": {
70931                                  *            "sortAscending": " - click/return to sort ascending"
70932                                  *          }
70933                                  *        }
70934                                  *      } );
70935                                  *    } );
70936                                  */
70937                                 "sSortAscending": ": activate to sort column ascending",
70939                                 /**
70940                                  * ARIA label that is added to the table headers when the column may be
70941                                  * sorted descending by activing the column (click or return when focused).
70942                                  * Note that the column header is prefixed to this string.
70943                                  *  @type string
70944                                  *  @default : activate to sort column ascending
70945                                  *
70946                                  *  @dtopt Language
70947                                  *  @name DataTable.defaults.language.aria.sortDescending
70948                                  *
70949                                  *  @example
70950                                  *    $(document).ready( function() {
70951                                  *      $('#example').dataTable( {
70952                                  *        "language": {
70953                                  *          "aria": {
70954                                  *            "sortDescending": " - click/return to sort descending"
70955                                  *          }
70956                                  *        }
70957                                  *      } );
70958                                  *    } );
70959                                  */
70960                                 "sSortDescending": ": activate to sort column descending"
70961                         },
70963                         /**
70964                          * Pagination string used by DataTables for the built-in pagination
70965                          * control types.
70966                          *  @namespace
70967                          *  @name DataTable.defaults.language.paginate
70968                          */
70969                         "oPaginate": {
70970                                 /**
70971                                  * Text to use when using the 'full_numbers' type of pagination for the
70972                                  * button to take the user to the first page.
70973                                  *  @type string
70974                                  *  @default First
70975                                  *
70976                                  *  @dtopt Language
70977                                  *  @name DataTable.defaults.language.paginate.first
70978                                  *
70979                                  *  @example
70980                                  *    $(document).ready( function() {
70981                                  *      $('#example').dataTable( {
70982                                  *        "language": {
70983                                  *          "paginate": {
70984                                  *            "first": "First page"
70985                                  *          }
70986                                  *        }
70987                                  *      } );
70988                                  *    } );
70989                                  */
70990                                 "sFirst": "First",
70993                                 /**
70994                                  * Text to use when using the 'full_numbers' type of pagination for the
70995                                  * button to take the user to the last page.
70996                                  *  @type string
70997                                  *  @default Last
70998                                  *
70999                                  *  @dtopt Language
71000                                  *  @name DataTable.defaults.language.paginate.last
71001                                  *
71002                                  *  @example
71003                                  *    $(document).ready( function() {
71004                                  *      $('#example').dataTable( {
71005                                  *        "language": {
71006                                  *          "paginate": {
71007                                  *            "last": "Last page"
71008                                  *          }
71009                                  *        }
71010                                  *      } );
71011                                  *    } );
71012                                  */
71013                                 "sLast": "Last",
71016                                 /**
71017                                  * Text to use for the 'next' pagination button (to take the user to the
71018                                  * next page).
71019                                  *  @type string
71020                                  *  @default Next
71021                                  *
71022                                  *  @dtopt Language
71023                                  *  @name DataTable.defaults.language.paginate.next
71024                                  *
71025                                  *  @example
71026                                  *    $(document).ready( function() {
71027                                  *      $('#example').dataTable( {
71028                                  *        "language": {
71029                                  *          "paginate": {
71030                                  *            "next": "Next page"
71031                                  *          }
71032                                  *        }
71033                                  *      } );
71034                                  *    } );
71035                                  */
71036                                 "sNext": "Next",
71039                                 /**
71040                                  * Text to use for the 'previous' pagination button (to take the user to
71041                                  * the previous page).
71042                                  *  @type string
71043                                  *  @default Previous
71044                                  *
71045                                  *  @dtopt Language
71046                                  *  @name DataTable.defaults.language.paginate.previous
71047                                  *
71048                                  *  @example
71049                                  *    $(document).ready( function() {
71050                                  *      $('#example').dataTable( {
71051                                  *        "language": {
71052                                  *          "paginate": {
71053                                  *            "previous": "Previous page"
71054                                  *          }
71055                                  *        }
71056                                  *      } );
71057                                  *    } );
71058                                  */
71059                                 "sPrevious": "Previous"
71060                         },
71062                         /**
71063                          * This string is shown in preference to `zeroRecords` when the table is
71064                          * empty of data (regardless of filtering). Note that this is an optional
71065                          * parameter - if it is not given, the value of `zeroRecords` will be used
71066                          * instead (either the default or given value).
71067                          *  @type string
71068                          *  @default No data available in table
71069                          *
71070                          *  @dtopt Language
71071                          *  @name DataTable.defaults.language.emptyTable
71072                          *
71073                          *  @example
71074                          *    $(document).ready( function() {
71075                          *      $('#example').dataTable( {
71076                          *        "language": {
71077                          *          "emptyTable": "No data available in table"
71078                          *        }
71079                          *      } );
71080                          *    } );
71081                          */
71082                         "sEmptyTable": "No data available in table",
71085                         /**
71086                          * This string gives information to the end user about the information
71087                          * that is current on display on the page. The following tokens can be
71088                          * used in the string and will be dynamically replaced as the table
71089                          * display updates. This tokens can be placed anywhere in the string, or
71090                          * removed as needed by the language requires:
71091                          *
71092                          * * `\_START\_` - Display index of the first record on the current page
71093                          * * `\_END\_` - Display index of the last record on the current page
71094                          * * `\_TOTAL\_` - Number of records in the table after filtering
71095                          * * `\_MAX\_` - Number of records in the table without filtering
71096                          * * `\_PAGE\_` - Current page number
71097                          * * `\_PAGES\_` - Total number of pages of data in the table
71098                          *
71099                          *  @type string
71100                          *  @default Showing _START_ to _END_ of _TOTAL_ entries
71101                          *
71102                          *  @dtopt Language
71103                          *  @name DataTable.defaults.language.info
71104                          *
71105                          *  @example
71106                          *    $(document).ready( function() {
71107                          *      $('#example').dataTable( {
71108                          *        "language": {
71109                          *          "info": "Showing page _PAGE_ of _PAGES_"
71110                          *        }
71111                          *      } );
71112                          *    } );
71113                          */
71114                         "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
71117                         /**
71118                          * Display information string for when the table is empty. Typically the
71119                          * format of this string should match `info`.
71120                          *  @type string
71121                          *  @default Showing 0 to 0 of 0 entries
71122                          *
71123                          *  @dtopt Language
71124                          *  @name DataTable.defaults.language.infoEmpty
71125                          *
71126                          *  @example
71127                          *    $(document).ready( function() {
71128                          *      $('#example').dataTable( {
71129                          *        "language": {
71130                          *          "infoEmpty": "No entries to show"
71131                          *        }
71132                          *      } );
71133                          *    } );
71134                          */
71135                         "sInfoEmpty": "Showing 0 to 0 of 0 entries",
71138                         /**
71139                          * When a user filters the information in a table, this string is appended
71140                          * to the information (`info`) to give an idea of how strong the filtering
71141                          * is. The variable _MAX_ is dynamically updated.
71142                          *  @type string
71143                          *  @default (filtered from _MAX_ total entries)
71144                          *
71145                          *  @dtopt Language
71146                          *  @name DataTable.defaults.language.infoFiltered
71147                          *
71148                          *  @example
71149                          *    $(document).ready( function() {
71150                          *      $('#example').dataTable( {
71151                          *        "language": {
71152                          *          "infoFiltered": " - filtering from _MAX_ records"
71153                          *        }
71154                          *      } );
71155                          *    } );
71156                          */
71157                         "sInfoFiltered": "(filtered from _MAX_ total entries)",
71160                         /**
71161                          * If can be useful to append extra information to the info string at times,
71162                          * and this variable does exactly that. This information will be appended to
71163                          * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are
71164                          * being used) at all times.
71165                          *  @type string
71166                          *  @default <i>Empty string</i>
71167                          *
71168                          *  @dtopt Language
71169                          *  @name DataTable.defaults.language.infoPostFix
71170                          *
71171                          *  @example
71172                          *    $(document).ready( function() {
71173                          *      $('#example').dataTable( {
71174                          *        "language": {
71175                          *          "infoPostFix": "All records shown are derived from real information."
71176                          *        }
71177                          *      } );
71178                          *    } );
71179                          */
71180                         "sInfoPostFix": "",
71183                         /**
71184                          * This decimal place operator is a little different from the other
71185                          * language options since DataTables doesn't output floating point
71186                          * numbers, so it won't ever use this for display of a number. Rather,
71187                          * what this parameter does is modify the sort methods of the table so
71188                          * that numbers which are in a format which has a character other than
71189                          * a period (`.`) as a decimal place will be sorted numerically.
71190                          *
71191                          * Note that numbers with different decimal places cannot be shown in
71192                          * the same table and still be sortable, the table must be consistent.
71193                          * However, multiple different tables on the page can use different
71194                          * decimal place characters.
71195                          *  @type string
71196                          *  @default
71197                          *
71198                          *  @dtopt Language
71199                          *  @name DataTable.defaults.language.decimal
71200                          *
71201                          *  @example
71202                          *    $(document).ready( function() {
71203                          *      $('#example').dataTable( {
71204                          *        "language": {
71205                          *          "decimal": ","
71206                          *          "thousands": "."
71207                          *        }
71208                          *      } );
71209                          *    } );
71210                          */
71211                         "sDecimal": "",
71214                         /**
71215                          * DataTables has a build in number formatter (`formatNumber`) which is
71216                          * used to format large numbers that are used in the table information.
71217                          * By default a comma is used, but this can be trivially changed to any
71218                          * character you wish with this parameter.
71219                          *  @type string
71220                          *  @default ,
71221                          *
71222                          *  @dtopt Language
71223                          *  @name DataTable.defaults.language.thousands
71224                          *
71225                          *  @example
71226                          *    $(document).ready( function() {
71227                          *      $('#example').dataTable( {
71228                          *        "language": {
71229                          *          "thousands": "'"
71230                          *        }
71231                          *      } );
71232                          *    } );
71233                          */
71234                         "sThousands": ",",
71237                         /**
71238                          * Detail the action that will be taken when the drop down menu for the
71239                          * pagination length option is changed. The '_MENU_' variable is replaced
71240                          * with a default select list of 10, 25, 50 and 100, and can be replaced
71241                          * with a custom select box if required.
71242                          *  @type string
71243                          *  @default Show _MENU_ entries
71244                          *
71245                          *  @dtopt Language
71246                          *  @name DataTable.defaults.language.lengthMenu
71247                          *
71248                          *  @example
71249                          *    // Language change only
71250                          *    $(document).ready( function() {
71251                          *      $('#example').dataTable( {
71252                          *        "language": {
71253                          *          "lengthMenu": "Display _MENU_ records"
71254                          *        }
71255                          *      } );
71256                          *    } );
71257                          *
71258                          *  @example
71259                          *    // Language and options change
71260                          *    $(document).ready( function() {
71261                          *      $('#example').dataTable( {
71262                          *        "language": {
71263                          *          "lengthMenu": 'Display <select>'+
71264                          *            '<option value="10">10</option>'+
71265                          *            '<option value="20">20</option>'+
71266                          *            '<option value="30">30</option>'+
71267                          *            '<option value="40">40</option>'+
71268                          *            '<option value="50">50</option>'+
71269                          *            '<option value="-1">All</option>'+
71270                          *            '</select> records'
71271                          *        }
71272                          *      } );
71273                          *    } );
71274                          */
71275                         "sLengthMenu": "Show _MENU_ entries",
71278                         /**
71279                          * When using Ajax sourced data and during the first draw when DataTables is
71280                          * gathering the data, this message is shown in an empty row in the table to
71281                          * indicate to the end user the the data is being loaded. Note that this
71282                          * parameter is not used when loading data by server-side processing, just
71283                          * Ajax sourced data with client-side processing.
71284                          *  @type string
71285                          *  @default Loading...
71286                          *
71287                          *  @dtopt Language
71288                          *  @name DataTable.defaults.language.loadingRecords
71289                          *
71290                          *  @example
71291                          *    $(document).ready( function() {
71292                          *      $('#example').dataTable( {
71293                          *        "language": {
71294                          *          "loadingRecords": "Please wait - loading..."
71295                          *        }
71296                          *      } );
71297                          *    } );
71298                          */
71299                         "sLoadingRecords": "Loading...",
71302                         /**
71303                          * Text which is displayed when the table is processing a user action
71304                          * (usually a sort command or similar).
71305                          *  @type string
71306                          *  @default Processing...
71307                          *
71308                          *  @dtopt Language
71309                          *  @name DataTable.defaults.language.processing
71310                          *
71311                          *  @example
71312                          *    $(document).ready( function() {
71313                          *      $('#example').dataTable( {
71314                          *        "language": {
71315                          *          "processing": "DataTables is currently busy"
71316                          *        }
71317                          *      } );
71318                          *    } );
71319                          */
71320                         "sProcessing": "Processing...",
71323                         /**
71324                          * Details the actions that will be taken when the user types into the
71325                          * filtering input text box. The variable "_INPUT_", if used in the string,
71326                          * is replaced with the HTML text box for the filtering input allowing
71327                          * control over where it appears in the string. If "_INPUT_" is not given
71328                          * then the input box is appended to the string automatically.
71329                          *  @type string
71330                          *  @default Search:
71331                          *
71332                          *  @dtopt Language
71333                          *  @name DataTable.defaults.language.search
71334                          *
71335                          *  @example
71336                          *    // Input text box will be appended at the end automatically
71337                          *    $(document).ready( function() {
71338                          *      $('#example').dataTable( {
71339                          *        "language": {
71340                          *          "search": "Filter records:"
71341                          *        }
71342                          *      } );
71343                          *    } );
71344                          *
71345                          *  @example
71346                          *    // Specify where the filter should appear
71347                          *    $(document).ready( function() {
71348                          *      $('#example').dataTable( {
71349                          *        "language": {
71350                          *          "search": "Apply filter _INPUT_ to table"
71351                          *        }
71352                          *      } );
71353                          *    } );
71354                          */
71355                         "sSearch": "Search:",
71358                         /**
71359                          * Assign a `placeholder` attribute to the search `input` element
71360                          *  @type string
71361                          *  @default
71362                          *
71363                          *  @dtopt Language
71364                          *  @name DataTable.defaults.language.searchPlaceholder
71365                          */
71366                         "sSearchPlaceholder": "",
71369                         /**
71370                          * All of the language information can be stored in a file on the
71371                          * server-side, which DataTables will look up if this parameter is passed.
71372                          * It must store the URL of the language file, which is in a JSON format,
71373                          * and the object has the same properties as the oLanguage object in the
71374                          * initialiser object (i.e. the above parameters). Please refer to one of
71375                          * the example language files to see how this works in action.
71376                          *  @type string
71377                          *  @default <i>Empty string - i.e. disabled</i>
71378                          *
71379                          *  @dtopt Language
71380                          *  @name DataTable.defaults.language.url
71381                          *
71382                          *  @example
71383                          *    $(document).ready( function() {
71384                          *      $('#example').dataTable( {
71385                          *        "language": {
71386                          *          "url": "http://www.sprymedia.co.uk/dataTables/lang.txt"
71387                          *        }
71388                          *      } );
71389                          *    } );
71390                          */
71391                         "sUrl": "",
71394                         /**
71395                          * Text shown inside the table records when the is no information to be
71396                          * displayed after filtering. `emptyTable` is shown when there is simply no
71397                          * information in the table at all (regardless of filtering).
71398                          *  @type string
71399                          *  @default No matching records found
71400                          *
71401                          *  @dtopt Language
71402                          *  @name DataTable.defaults.language.zeroRecords
71403                          *
71404                          *  @example
71405                          *    $(document).ready( function() {
71406                          *      $('#example').dataTable( {
71407                          *        "language": {
71408                          *          "zeroRecords": "No records to display"
71409                          *        }
71410                          *      } );
71411                          *    } );
71412                          */
71413                         "sZeroRecords": "No matching records found"
71414                 },
71417                 /**
71418                  * This parameter allows you to have define the global filtering state at
71419                  * initialisation time. As an object the `search` parameter must be
71420                  * defined, but all other parameters are optional. When `regex` is true,
71421                  * the search string will be treated as a regular expression, when false
71422                  * (default) it will be treated as a straight string. When `smart`
71423                  * DataTables will use it's smart filtering methods (to word match at
71424                  * any point in the data), when false this will not be done.
71425                  *  @namespace
71426                  *  @extends DataTable.models.oSearch
71427                  *
71428                  *  @dtopt Options
71429                  *  @name DataTable.defaults.search
71430                  *
71431                  *  @example
71432                  *    $(document).ready( function() {
71433                  *      $('#example').dataTable( {
71434                  *        "search": {"search": "Initial search"}
71435                  *      } );
71436                  *    } )
71437                  */
71438                 "oSearch": $.extend( {}, DataTable.models.oSearch ),
71441                 /**
71442                  * __Deprecated__ The functionality provided by this parameter has now been
71443                  * superseded by that provided through `ajax`, which should be used instead.
71444                  *
71445                  * By default DataTables will look for the property `data` (or `aaData` for
71446                  * compatibility with DataTables 1.9-) when obtaining data from an Ajax
71447                  * source or for server-side processing - this parameter allows that
71448                  * property to be changed. You can use Javascript dotted object notation to
71449                  * get a data source for multiple levels of nesting.
71450                  *  @type string
71451                  *  @default data
71452                  *
71453                  *  @dtopt Options
71454                  *  @dtopt Server-side
71455                  *  @name DataTable.defaults.ajaxDataProp
71456                  *
71457                  *  @deprecated 1.10. Please use `ajax` for this functionality now.
71458                  */
71459                 "sAjaxDataProp": "data",
71462                 /**
71463                  * __Deprecated__ The functionality provided by this parameter has now been
71464                  * superseded by that provided through `ajax`, which should be used instead.
71465                  *
71466                  * You can instruct DataTables to load data from an external
71467                  * source using this parameter (use aData if you want to pass data in you
71468                  * already have). Simply provide a url a JSON object can be obtained from.
71469                  *  @type string
71470                  *  @default null
71471                  *
71472                  *  @dtopt Options
71473                  *  @dtopt Server-side
71474                  *  @name DataTable.defaults.ajaxSource
71475                  *
71476                  *  @deprecated 1.10. Please use `ajax` for this functionality now.
71477                  */
71478                 "sAjaxSource": null,
71481                 /**
71482                  * This initialisation variable allows you to specify exactly where in the
71483                  * DOM you want DataTables to inject the various controls it adds to the page
71484                  * (for example you might want the pagination controls at the top of the
71485                  * table). DIV elements (with or without a custom class) can also be added to
71486                  * aid styling. The follow syntax is used:
71487                  *   <ul>
71488                  *     <li>The following options are allowed:
71489                  *       <ul>
71490                  *         <li>'l' - Length changing</li>
71491                  *         <li>'f' - Filtering input</li>
71492                  *         <li>'t' - The table!</li>
71493                  *         <li>'i' - Information</li>
71494                  *         <li>'p' - Pagination</li>
71495                  *         <li>'r' - pRocessing</li>
71496                  *       </ul>
71497                  *     </li>
71498                  *     <li>The following constants are allowed:
71499                  *       <ul>
71500                  *         <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>
71501                  *         <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>
71502                  *       </ul>
71503                  *     </li>
71504                  *     <li>The following syntax is expected:
71505                  *       <ul>
71506                  *         <li>'&lt;' and '&gt;' - div elements</li>
71507                  *         <li>'&lt;"class" and '&gt;' - div with a class</li>
71508                  *         <li>'&lt;"#id" and '&gt;' - div with an ID</li>
71509                  *       </ul>
71510                  *     </li>
71511                  *     <li>Examples:
71512                  *       <ul>
71513                  *         <li>'&lt;"wrapper"flipt&gt;'</li>
71514                  *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>
71515                  *       </ul>
71516                  *     </li>
71517                  *   </ul>
71518                  *  @type string
71519                  *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>
71520                  *    <"H"lfr>t<"F"ip> <i>(when `jQueryUI` is true)</i>
71521                  *
71522                  *  @dtopt Options
71523                  *  @name DataTable.defaults.dom
71524                  *
71525                  *  @example
71526                  *    $(document).ready( function() {
71527                  *      $('#example').dataTable( {
71528                  *        "dom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&gt;'
71529                  *      } );
71530                  *    } );
71531                  */
71532                 "sDom": "lfrtip",
71535                 /**
71536                  * Search delay option. This will throttle full table searches that use the
71537                  * DataTables provided search input element (it does not effect calls to
71538                  * `dt-api search()`, providing a delay before the search is made.
71539                  *  @type integer
71540                  *  @default 0
71541                  *
71542                  *  @dtopt Options
71543                  *  @name DataTable.defaults.searchDelay
71544                  *
71545                  *  @example
71546                  *    $(document).ready( function() {
71547                  *      $('#example').dataTable( {
71548                  *        "searchDelay": 200
71549                  *      } );
71550                  *    } )
71551                  */
71552                 "searchDelay": null,
71555                 /**
71556                  * DataTables features six different built-in options for the buttons to
71557                  * display for pagination control:
71558                  *
71559                  * * `numbers` - Page number buttons only
71560                  * * `simple` - 'Previous' and 'Next' buttons only
71561                  * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers
71562                  * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons
71563                  * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers
71564                  * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers
71565                  *
71566                  * Further methods can be added using {@link DataTable.ext.oPagination}.
71567                  *  @type string
71568                  *  @default simple_numbers
71569                  *
71570                  *  @dtopt Options
71571                  *  @name DataTable.defaults.pagingType
71572                  *
71573                  *  @example
71574                  *    $(document).ready( function() {
71575                  *      $('#example').dataTable( {
71576                  *        "pagingType": "full_numbers"
71577                  *      } );
71578                  *    } )
71579                  */
71580                 "sPaginationType": "simple_numbers",
71583                 /**
71584                  * Enable horizontal scrolling. When a table is too wide to fit into a
71585                  * certain layout, or you have a large number of columns in the table, you
71586                  * can enable x-scrolling to show the table in a viewport, which can be
71587                  * scrolled. This property can be `true` which will allow the table to
71588                  * scroll horizontally when needed, or any CSS unit, or a number (in which
71589                  * case it will be treated as a pixel measurement). Setting as simply `true`
71590                  * is recommended.
71591                  *  @type boolean|string
71592                  *  @default <i>blank string - i.e. disabled</i>
71593                  *
71594                  *  @dtopt Features
71595                  *  @name DataTable.defaults.scrollX
71596                  *
71597                  *  @example
71598                  *    $(document).ready( function() {
71599                  *      $('#example').dataTable( {
71600                  *        "scrollX": true,
71601                  *        "scrollCollapse": true
71602                  *      } );
71603                  *    } );
71604                  */
71605                 "sScrollX": "",
71608                 /**
71609                  * This property can be used to force a DataTable to use more width than it
71610                  * might otherwise do when x-scrolling is enabled. For example if you have a
71611                  * table which requires to be well spaced, this parameter is useful for
71612                  * "over-sizing" the table, and thus forcing scrolling. This property can by
71613                  * any CSS unit, or a number (in which case it will be treated as a pixel
71614                  * measurement).
71615                  *  @type string
71616                  *  @default <i>blank string - i.e. disabled</i>
71617                  *
71618                  *  @dtopt Options
71619                  *  @name DataTable.defaults.scrollXInner
71620                  *
71621                  *  @example
71622                  *    $(document).ready( function() {
71623                  *      $('#example').dataTable( {
71624                  *        "scrollX": "100%",
71625                  *        "scrollXInner": "110%"
71626                  *      } );
71627                  *    } );
71628                  */
71629                 "sScrollXInner": "",
71632                 /**
71633                  * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
71634                  * to the given height, and enable scrolling for any data which overflows the
71635                  * current viewport. This can be used as an alternative to paging to display
71636                  * a lot of data in a small area (although paging and scrolling can both be
71637                  * enabled at the same time). This property can be any CSS unit, or a number
71638                  * (in which case it will be treated as a pixel measurement).
71639                  *  @type string
71640                  *  @default <i>blank string - i.e. disabled</i>
71641                  *
71642                  *  @dtopt Features
71643                  *  @name DataTable.defaults.scrollY
71644                  *
71645                  *  @example
71646                  *    $(document).ready( function() {
71647                  *      $('#example').dataTable( {
71648                  *        "scrollY": "200px",
71649                  *        "paginate": false
71650                  *      } );
71651                  *    } );
71652                  */
71653                 "sScrollY": "",
71656                 /**
71657                  * __Deprecated__ The functionality provided by this parameter has now been
71658                  * superseded by that provided through `ajax`, which should be used instead.
71659                  *
71660                  * Set the HTTP method that is used to make the Ajax call for server-side
71661                  * processing or Ajax sourced data.
71662                  *  @type string
71663                  *  @default GET
71664                  *
71665                  *  @dtopt Options
71666                  *  @dtopt Server-side
71667                  *  @name DataTable.defaults.serverMethod
71668                  *
71669                  *  @deprecated 1.10. Please use `ajax` for this functionality now.
71670                  */
71671                 "sServerMethod": "GET",
71674                 /**
71675                  * DataTables makes use of renderers when displaying HTML elements for
71676                  * a table. These renderers can be added or modified by plug-ins to
71677                  * generate suitable mark-up for a site. For example the Bootstrap
71678                  * integration plug-in for DataTables uses a paging button renderer to
71679                  * display pagination buttons in the mark-up required by Bootstrap.
71680                  *
71681                  * For further information about the renderers available see
71682                  * DataTable.ext.renderer
71683                  *  @type string|object
71684                  *  @default null
71685                  *
71686                  *  @name DataTable.defaults.renderer
71687                  *
71688                  */
71689                 "renderer": null,
71692                 /**
71693                  * Set the data property name that DataTables should use to get a row's id
71694                  * to set as the `id` property in the node.
71695                  *  @type string
71696                  *  @default DT_RowId
71697                  *
71698                  *  @name DataTable.defaults.rowId
71699                  */
71700                 "rowId": "DT_RowId"
71701         };
71703         _fnHungarianMap( DataTable.defaults );
71707         /*
71708          * Developer note - See note in model.defaults.js about the use of Hungarian
71709          * notation and camel case.
71710          */
71712         /**
71713          * Column options that can be given to DataTables at initialisation time.
71714          *  @namespace
71715          */
71716         DataTable.defaults.column = {
71717                 /**
71718                  * Define which column(s) an order will occur on for this column. This
71719                  * allows a column's ordering to take multiple columns into account when
71720                  * doing a sort or use the data from a different column. For example first
71721                  * name / last name columns make sense to do a multi-column sort over the
71722                  * two columns.
71723                  *  @type array|int
71724                  *  @default null <i>Takes the value of the column index automatically</i>
71725                  *
71726                  *  @name DataTable.defaults.column.orderData
71727                  *  @dtopt Columns
71728                  *
71729                  *  @example
71730                  *    // Using `columnDefs`
71731                  *    $(document).ready( function() {
71732                  *      $('#example').dataTable( {
71733                  *        "columnDefs": [
71734                  *          { "orderData": [ 0, 1 ], "targets": [ 0 ] },
71735                  *          { "orderData": [ 1, 0 ], "targets": [ 1 ] },
71736                  *          { "orderData": 2, "targets": [ 2 ] }
71737                  *        ]
71738                  *      } );
71739                  *    } );
71740                  *
71741                  *  @example
71742                  *    // Using `columns`
71743                  *    $(document).ready( function() {
71744                  *      $('#example').dataTable( {
71745                  *        "columns": [
71746                  *          { "orderData": [ 0, 1 ] },
71747                  *          { "orderData": [ 1, 0 ] },
71748                  *          { "orderData": 2 },
71749                  *          null,
71750                  *          null
71751                  *        ]
71752                  *      } );
71753                  *    } );
71754                  */
71755                 "aDataSort": null,
71756                 "iDataSort": -1,
71759                 /**
71760                  * You can control the default ordering direction, and even alter the
71761                  * behaviour of the sort handler (i.e. only allow ascending ordering etc)
71762                  * using this parameter.
71763                  *  @type array
71764                  *  @default [ 'asc', 'desc' ]
71765                  *
71766                  *  @name DataTable.defaults.column.orderSequence
71767                  *  @dtopt Columns
71768                  *
71769                  *  @example
71770                  *    // Using `columnDefs`
71771                  *    $(document).ready( function() {
71772                  *      $('#example').dataTable( {
71773                  *        "columnDefs": [
71774                  *          { "orderSequence": [ "asc" ], "targets": [ 1 ] },
71775                  *          { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] },
71776                  *          { "orderSequence": [ "desc" ], "targets": [ 3 ] }
71777                  *        ]
71778                  *      } );
71779                  *    } );
71780                  *
71781                  *  @example
71782                  *    // Using `columns`
71783                  *    $(document).ready( function() {
71784                  *      $('#example').dataTable( {
71785                  *        "columns": [
71786                  *          null,
71787                  *          { "orderSequence": [ "asc" ] },
71788                  *          { "orderSequence": [ "desc", "asc", "asc" ] },
71789                  *          { "orderSequence": [ "desc" ] },
71790                  *          null
71791                  *        ]
71792                  *      } );
71793                  *    } );
71794                  */
71795                 "asSorting": [ 'asc', 'desc' ],
71798                 /**
71799                  * Enable or disable filtering on the data in this column.
71800                  *  @type boolean
71801                  *  @default true
71802                  *
71803                  *  @name DataTable.defaults.column.searchable
71804                  *  @dtopt Columns
71805                  *
71806                  *  @example
71807                  *    // Using `columnDefs`
71808                  *    $(document).ready( function() {
71809                  *      $('#example').dataTable( {
71810                  *        "columnDefs": [
71811                  *          { "searchable": false, "targets": [ 0 ] }
71812                  *        ] } );
71813                  *    } );
71814                  *
71815                  *  @example
71816                  *    // Using `columns`
71817                  *    $(document).ready( function() {
71818                  *      $('#example').dataTable( {
71819                  *        "columns": [
71820                  *          { "searchable": false },
71821                  *          null,
71822                  *          null,
71823                  *          null,
71824                  *          null
71825                  *        ] } );
71826                  *    } );
71827                  */
71828                 "bSearchable": true,
71831                 /**
71832                  * Enable or disable ordering on this column.
71833                  *  @type boolean
71834                  *  @default true
71835                  *
71836                  *  @name DataTable.defaults.column.orderable
71837                  *  @dtopt Columns
71838                  *
71839                  *  @example
71840                  *    // Using `columnDefs`
71841                  *    $(document).ready( function() {
71842                  *      $('#example').dataTable( {
71843                  *        "columnDefs": [
71844                  *          { "orderable": false, "targets": [ 0 ] }
71845                  *        ] } );
71846                  *    } );
71847                  *
71848                  *  @example
71849                  *    // Using `columns`
71850                  *    $(document).ready( function() {
71851                  *      $('#example').dataTable( {
71852                  *        "columns": [
71853                  *          { "orderable": false },
71854                  *          null,
71855                  *          null,
71856                  *          null,
71857                  *          null
71858                  *        ] } );
71859                  *    } );
71860                  */
71861                 "bSortable": true,
71864                 /**
71865                  * Enable or disable the display of this column.
71866                  *  @type boolean
71867                  *  @default true
71868                  *
71869                  *  @name DataTable.defaults.column.visible
71870                  *  @dtopt Columns
71871                  *
71872                  *  @example
71873                  *    // Using `columnDefs`
71874                  *    $(document).ready( function() {
71875                  *      $('#example').dataTable( {
71876                  *        "columnDefs": [
71877                  *          { "visible": false, "targets": [ 0 ] }
71878                  *        ] } );
71879                  *    } );
71880                  *
71881                  *  @example
71882                  *    // Using `columns`
71883                  *    $(document).ready( function() {
71884                  *      $('#example').dataTable( {
71885                  *        "columns": [
71886                  *          { "visible": false },
71887                  *          null,
71888                  *          null,
71889                  *          null,
71890                  *          null
71891                  *        ] } );
71892                  *    } );
71893                  */
71894                 "bVisible": true,
71897                 /**
71898                  * Developer definable function that is called whenever a cell is created (Ajax source,
71899                  * etc) or processed for input (DOM source). This can be used as a compliment to mRender
71900                  * allowing you to modify the DOM element (add background colour for example) when the
71901                  * element is available.
71902                  *  @type function
71903                  *  @param {element} td The TD node that has been created
71904                  *  @param {*} cellData The Data for the cell
71905                  *  @param {array|object} rowData The data for the whole row
71906                  *  @param {int} row The row index for the aoData data store
71907                  *  @param {int} col The column index for aoColumns
71908                  *
71909                  *  @name DataTable.defaults.column.createdCell
71910                  *  @dtopt Columns
71911                  *
71912                  *  @example
71913                  *    $(document).ready( function() {
71914                  *      $('#example').dataTable( {
71915                  *        "columnDefs": [ {
71916                  *          "targets": [3],
71917                  *          "createdCell": function (td, cellData, rowData, row, col) {
71918                  *            if ( cellData == "1.7" ) {
71919                  *              $(td).css('color', 'blue')
71920                  *            }
71921                  *          }
71922                  *        } ]
71923                  *      });
71924                  *    } );
71925                  */
71926                 "fnCreatedCell": null,
71929                 /**
71930                  * This parameter has been replaced by `data` in DataTables to ensure naming
71931                  * consistency. `dataProp` can still be used, as there is backwards
71932                  * compatibility in DataTables for this option, but it is strongly
71933                  * recommended that you use `data` in preference to `dataProp`.
71934                  *  @name DataTable.defaults.column.dataProp
71935                  */
71938                 /**
71939                  * This property can be used to read data from any data source property,
71940                  * including deeply nested objects / properties. `data` can be given in a
71941                  * number of different ways which effect its behaviour:
71942                  *
71943                  * * `integer` - treated as an array index for the data source. This is the
71944                  *   default that DataTables uses (incrementally increased for each column).
71945                  * * `string` - read an object property from the data source. There are
71946                  *   three 'special' options that can be used in the string to alter how
71947                  *   DataTables reads the data from the source object:
71948                  *    * `.` - Dotted Javascript notation. Just as you use a `.` in
71949                  *      Javascript to read from nested objects, so to can the options
71950                  *      specified in `data`. For example: `browser.version` or
71951                  *      `browser.name`. If your object parameter name contains a period, use
71952                  *      `\\` to escape it - i.e. `first\\.name`.
71953                  *    * `[]` - Array notation. DataTables can automatically combine data
71954                  *      from and array source, joining the data with the characters provided
71955                  *      between the two brackets. For example: `name[, ]` would provide a
71956                  *      comma-space separated list from the source array. If no characters
71957                  *      are provided between the brackets, the original array source is
71958                  *      returned.
71959                  *    * `()` - Function notation. Adding `()` to the end of a parameter will
71960                  *      execute a function of the name given. For example: `browser()` for a
71961                  *      simple function on the data source, `browser.version()` for a
71962                  *      function in a nested property or even `browser().version` to get an
71963                  *      object property if the function called returns an object. Note that
71964                  *      function notation is recommended for use in `render` rather than
71965                  *      `data` as it is much simpler to use as a renderer.
71966                  * * `null` - use the original data source for the row rather than plucking
71967                  *   data directly from it. This action has effects on two other
71968                  *   initialisation options:
71969                  *    * `defaultContent` - When null is given as the `data` option and
71970                  *      `defaultContent` is specified for the column, the value defined by
71971                  *      `defaultContent` will be used for the cell.
71972                  *    * `render` - When null is used for the `data` option and the `render`
71973                  *      option is specified for the column, the whole data source for the
71974                  *      row is used for the renderer.
71975                  * * `function` - the function given will be executed whenever DataTables
71976                  *   needs to set or get the data for a cell in the column. The function
71977                  *   takes three parameters:
71978                  *    * Parameters:
71979                  *      * `{array|object}` The data source for the row
71980                  *      * `{string}` The type call data requested - this will be 'set' when
71981                  *        setting data or 'filter', 'display', 'type', 'sort' or undefined
71982                  *        when gathering data. Note that when `undefined` is given for the
71983                  *        type DataTables expects to get the raw data for the object back<
71984                  *      * `{*}` Data to set when the second parameter is 'set'.
71985                  *    * Return:
71986                  *      * The return value from the function is not required when 'set' is
71987                  *        the type of call, but otherwise the return is what will be used
71988                  *        for the data requested.
71989                  *
71990                  * Note that `data` is a getter and setter option. If you just require
71991                  * formatting of data for output, you will likely want to use `render` which
71992                  * is simply a getter and thus simpler to use.
71993                  *
71994                  * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The
71995                  * name change reflects the flexibility of this property and is consistent
71996                  * with the naming of mRender. If 'mDataProp' is given, then it will still
71997                  * be used by DataTables, as it automatically maps the old name to the new
71998                  * if required.
71999                  *
72000                  *  @type string|int|function|null
72001                  *  @default null <i>Use automatically calculated column index</i>
72002                  *
72003                  *  @name DataTable.defaults.column.data
72004                  *  @dtopt Columns
72005                  *
72006                  *  @example
72007                  *    // Read table data from objects
72008                  *    // JSON structure for each row:
72009                  *    //   {
72010                  *    //      "engine": {value},
72011                  *    //      "browser": {value},
72012                  *    //      "platform": {value},
72013                  *    //      "version": {value},
72014                  *    //      "grade": {value}
72015                  *    //   }
72016                  *    $(document).ready( function() {
72017                  *      $('#example').dataTable( {
72018                  *        "ajaxSource": "sources/objects.txt",
72019                  *        "columns": [
72020                  *          { "data": "engine" },
72021                  *          { "data": "browser" },
72022                  *          { "data": "platform" },
72023                  *          { "data": "version" },
72024                  *          { "data": "grade" }
72025                  *        ]
72026                  *      } );
72027                  *    } );
72028                  *
72029                  *  @example
72030                  *    // Read information from deeply nested objects
72031                  *    // JSON structure for each row:
72032                  *    //   {
72033                  *    //      "engine": {value},
72034                  *    //      "browser": {value},
72035                  *    //      "platform": {
72036                  *    //         "inner": {value}
72037                  *    //      },
72038                  *    //      "details": [
72039                  *    //         {value}, {value}
72040                  *    //      ]
72041                  *    //   }
72042                  *    $(document).ready( function() {
72043                  *      $('#example').dataTable( {
72044                  *        "ajaxSource": "sources/deep.txt",
72045                  *        "columns": [
72046                  *          { "data": "engine" },
72047                  *          { "data": "browser" },
72048                  *          { "data": "platform.inner" },
72049                  *          { "data": "details.0" },
72050                  *          { "data": "details.1" }
72051                  *        ]
72052                  *      } );
72053                  *    } );
72054                  *
72055                  *  @example
72056                  *    // Using `data` as a function to provide different information for
72057                  *    // sorting, filtering and display. In this case, currency (price)
72058                  *    $(document).ready( function() {
72059                  *      $('#example').dataTable( {
72060                  *        "columnDefs": [ {
72061                  *          "targets": [ 0 ],
72062                  *          "data": function ( source, type, val ) {
72063                  *            if (type === 'set') {
72064                  *              source.price = val;
72065                  *              // Store the computed dislay and filter values for efficiency
72066                  *              source.price_display = val=="" ? "" : "$"+numberFormat(val);
72067                  *              source.price_filter  = val=="" ? "" : "$"+numberFormat(val)+" "+val;
72068                  *              return;
72069                  *            }
72070                  *            else if (type === 'display') {
72071                  *              return source.price_display;
72072                  *            }
72073                  *            else if (type === 'filter') {
72074                  *              return source.price_filter;
72075                  *            }
72076                  *            // 'sort', 'type' and undefined all just use the integer
72077                  *            return source.price;
72078                  *          }
72079                  *        } ]
72080                  *      } );
72081                  *    } );
72082                  *
72083                  *  @example
72084                  *    // Using default content
72085                  *    $(document).ready( function() {
72086                  *      $('#example').dataTable( {
72087                  *        "columnDefs": [ {
72088                  *          "targets": [ 0 ],
72089                  *          "data": null,
72090                  *          "defaultContent": "Click to edit"
72091                  *        } ]
72092                  *      } );
72093                  *    } );
72094                  *
72095                  *  @example
72096                  *    // Using array notation - outputting a list from an array
72097                  *    $(document).ready( function() {
72098                  *      $('#example').dataTable( {
72099                  *        "columnDefs": [ {
72100                  *          "targets": [ 0 ],
72101                  *          "data": "name[, ]"
72102                  *        } ]
72103                  *      } );
72104                  *    } );
72105                  *
72106                  */
72107                 "mData": null,
72110                 /**
72111                  * This property is the rendering partner to `data` and it is suggested that
72112                  * when you want to manipulate data for display (including filtering,
72113                  * sorting etc) without altering the underlying data for the table, use this
72114                  * property. `render` can be considered to be the the read only companion to
72115                  * `data` which is read / write (then as such more complex). Like `data`
72116                  * this option can be given in a number of different ways to effect its
72117                  * behaviour:
72118                  *
72119                  * * `integer` - treated as an array index for the data source. This is the
72120                  *   default that DataTables uses (incrementally increased for each column).
72121                  * * `string` - read an object property from the data source. There are
72122                  *   three 'special' options that can be used in the string to alter how
72123                  *   DataTables reads the data from the source object:
72124                  *    * `.` - Dotted Javascript notation. Just as you use a `.` in
72125                  *      Javascript to read from nested objects, so to can the options
72126                  *      specified in `data`. For example: `browser.version` or
72127                  *      `browser.name`. If your object parameter name contains a period, use
72128                  *      `\\` to escape it - i.e. `first\\.name`.
72129                  *    * `[]` - Array notation. DataTables can automatically combine data
72130                  *      from and array source, joining the data with the characters provided
72131                  *      between the two brackets. For example: `name[, ]` would provide a
72132                  *      comma-space separated list from the source array. If no characters
72133                  *      are provided between the brackets, the original array source is
72134                  *      returned.
72135                  *    * `()` - Function notation. Adding `()` to the end of a parameter will
72136                  *      execute a function of the name given. For example: `browser()` for a
72137                  *      simple function on the data source, `browser.version()` for a
72138                  *      function in a nested property or even `browser().version` to get an
72139                  *      object property if the function called returns an object.
72140                  * * `object` - use different data for the different data types requested by
72141                  *   DataTables ('filter', 'display', 'type' or 'sort'). The property names
72142                  *   of the object is the data type the property refers to and the value can
72143                  *   defined using an integer, string or function using the same rules as
72144                  *   `render` normally does. Note that an `_` option _must_ be specified.
72145                  *   This is the default value to use if you haven't specified a value for
72146                  *   the data type requested by DataTables.
72147                  * * `function` - the function given will be executed whenever DataTables
72148                  *   needs to set or get the data for a cell in the column. The function
72149                  *   takes three parameters:
72150                  *    * Parameters:
72151                  *      * {array|object} The data source for the row (based on `data`)
72152                  *      * {string} The type call data requested - this will be 'filter',
72153                  *        'display', 'type' or 'sort'.
72154                  *      * {array|object} The full data source for the row (not based on
72155                  *        `data`)
72156                  *    * Return:
72157                  *      * The return value from the function is what will be used for the
72158                  *        data requested.
72159                  *
72160                  *  @type string|int|function|object|null
72161                  *  @default null Use the data source value.
72162                  *
72163                  *  @name DataTable.defaults.column.render
72164                  *  @dtopt Columns
72165                  *
72166                  *  @example
72167                  *    // Create a comma separated list from an array of objects
72168                  *    $(document).ready( function() {
72169                  *      $('#example').dataTable( {
72170                  *        "ajaxSource": "sources/deep.txt",
72171                  *        "columns": [
72172                  *          { "data": "engine" },
72173                  *          { "data": "browser" },
72174                  *          {
72175                  *            "data": "platform",
72176                  *            "render": "[, ].name"
72177                  *          }
72178                  *        ]
72179                  *      } );
72180                  *    } );
72181                  *
72182                  *  @example
72183                  *    // Execute a function to obtain data
72184                  *    $(document).ready( function() {
72185                  *      $('#example').dataTable( {
72186                  *        "columnDefs": [ {
72187                  *          "targets": [ 0 ],
72188                  *          "data": null, // Use the full data source object for the renderer's source
72189                  *          "render": "browserName()"
72190                  *        } ]
72191                  *      } );
72192                  *    } );
72193                  *
72194                  *  @example
72195                  *    // As an object, extracting different data for the different types
72196                  *    // This would be used with a data source such as:
72197                  *    //   { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" }
72198                  *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`
72199                  *    // (which has both forms) is used for filtering for if a user inputs either format, while
72200                  *    // the formatted phone number is the one that is shown in the table.
72201                  *    $(document).ready( function() {
72202                  *      $('#example').dataTable( {
72203                  *        "columnDefs": [ {
72204                  *          "targets": [ 0 ],
72205                  *          "data": null, // Use the full data source object for the renderer's source
72206                  *          "render": {
72207                  *            "_": "phone",
72208                  *            "filter": "phone_filter",
72209                  *            "display": "phone_display"
72210                  *          }
72211                  *        } ]
72212                  *      } );
72213                  *    } );
72214                  *
72215                  *  @example
72216                  *    // Use as a function to create a link from the data source
72217                  *    $(document).ready( function() {
72218                  *      $('#example').dataTable( {
72219                  *        "columnDefs": [ {
72220                  *          "targets": [ 0 ],
72221                  *          "data": "download_link",
72222                  *          "render": function ( data, type, full ) {
72223                  *            return '<a href="'+data+'">Download</a>';
72224                  *          }
72225                  *        } ]
72226                  *      } );
72227                  *    } );
72228                  */
72229                 "mRender": null,
72232                 /**
72233                  * Change the cell type created for the column - either TD cells or TH cells. This
72234                  * can be useful as TH cells have semantic meaning in the table body, allowing them
72235                  * to act as a header for a row (you may wish to add scope='row' to the TH elements).
72236                  *  @type string
72237                  *  @default td
72238                  *
72239                  *  @name DataTable.defaults.column.cellType
72240                  *  @dtopt Columns
72241                  *
72242                  *  @example
72243                  *    // Make the first column use TH cells
72244                  *    $(document).ready( function() {
72245                  *      $('#example').dataTable( {
72246                  *        "columnDefs": [ {
72247                  *          "targets": [ 0 ],
72248                  *          "cellType": "th"
72249                  *        } ]
72250                  *      } );
72251                  *    } );
72252                  */
72253                 "sCellType": "td",
72256                 /**
72257                  * Class to give to each cell in this column.
72258                  *  @type string
72259                  *  @default <i>Empty string</i>
72260                  *
72261                  *  @name DataTable.defaults.column.class
72262                  *  @dtopt Columns
72263                  *
72264                  *  @example
72265                  *    // Using `columnDefs`
72266                  *    $(document).ready( function() {
72267                  *      $('#example').dataTable( {
72268                  *        "columnDefs": [
72269                  *          { "class": "my_class", "targets": [ 0 ] }
72270                  *        ]
72271                  *      } );
72272                  *    } );
72273                  *
72274                  *  @example
72275                  *    // Using `columns`
72276                  *    $(document).ready( function() {
72277                  *      $('#example').dataTable( {
72278                  *        "columns": [
72279                  *          { "class": "my_class" },
72280                  *          null,
72281                  *          null,
72282                  *          null,
72283                  *          null
72284                  *        ]
72285                  *      } );
72286                  *    } );
72287                  */
72288                 "sClass": "",
72290                 /**
72291                  * When DataTables calculates the column widths to assign to each column,
72292                  * it finds the longest string in each column and then constructs a
72293                  * temporary table and reads the widths from that. The problem with this
72294                  * is that "mmm" is much wider then "iiii", but the latter is a longer
72295                  * string - thus the calculation can go wrong (doing it properly and putting
72296                  * it into an DOM object and measuring that is horribly(!) slow). Thus as
72297                  * a "work around" we provide this option. It will append its value to the
72298                  * text that is found to be the longest string for the column - i.e. padding.
72299                  * Generally you shouldn't need this!
72300                  *  @type string
72301                  *  @default <i>Empty string<i>
72302                  *
72303                  *  @name DataTable.defaults.column.contentPadding
72304                  *  @dtopt Columns
72305                  *
72306                  *  @example
72307                  *    // Using `columns`
72308                  *    $(document).ready( function() {
72309                  *      $('#example').dataTable( {
72310                  *        "columns": [
72311                  *          null,
72312                  *          null,
72313                  *          null,
72314                  *          {
72315                  *            "contentPadding": "mmm"
72316                  *          }
72317                  *        ]
72318                  *      } );
72319                  *    } );
72320                  */
72321                 "sContentPadding": "",
72324                 /**
72325                  * Allows a default value to be given for a column's data, and will be used
72326                  * whenever a null data source is encountered (this can be because `data`
72327                  * is set to null, or because the data source itself is null).
72328                  *  @type string
72329                  *  @default null
72330                  *
72331                  *  @name DataTable.defaults.column.defaultContent
72332                  *  @dtopt Columns
72333                  *
72334                  *  @example
72335                  *    // Using `columnDefs`
72336                  *    $(document).ready( function() {
72337                  *      $('#example').dataTable( {
72338                  *        "columnDefs": [
72339                  *          {
72340                  *            "data": null,
72341                  *            "defaultContent": "Edit",
72342                  *            "targets": [ -1 ]
72343                  *          }
72344                  *        ]
72345                  *      } );
72346                  *    } );
72347                  *
72348                  *  @example
72349                  *    // Using `columns`
72350                  *    $(document).ready( function() {
72351                  *      $('#example').dataTable( {
72352                  *        "columns": [
72353                  *          null,
72354                  *          null,
72355                  *          null,
72356                  *          {
72357                  *            "data": null,
72358                  *            "defaultContent": "Edit"
72359                  *          }
72360                  *        ]
72361                  *      } );
72362                  *    } );
72363                  */
72364                 "sDefaultContent": null,
72367                 /**
72368                  * This parameter is only used in DataTables' server-side processing. It can
72369                  * be exceptionally useful to know what columns are being displayed on the
72370                  * client side, and to map these to database fields. When defined, the names
72371                  * also allow DataTables to reorder information from the server if it comes
72372                  * back in an unexpected order (i.e. if you switch your columns around on the
72373                  * client-side, your server-side code does not also need updating).
72374                  *  @type string
72375                  *  @default <i>Empty string</i>
72376                  *
72377                  *  @name DataTable.defaults.column.name
72378                  *  @dtopt Columns
72379                  *
72380                  *  @example
72381                  *    // Using `columnDefs`
72382                  *    $(document).ready( function() {
72383                  *      $('#example').dataTable( {
72384                  *        "columnDefs": [
72385                  *          { "name": "engine", "targets": [ 0 ] },
72386                  *          { "name": "browser", "targets": [ 1 ] },
72387                  *          { "name": "platform", "targets": [ 2 ] },
72388                  *          { "name": "version", "targets": [ 3 ] },
72389                  *          { "name": "grade", "targets": [ 4 ] }
72390                  *        ]
72391                  *      } );
72392                  *    } );
72393                  *
72394                  *  @example
72395                  *    // Using `columns`
72396                  *    $(document).ready( function() {
72397                  *      $('#example').dataTable( {
72398                  *        "columns": [
72399                  *          { "name": "engine" },
72400                  *          { "name": "browser" },
72401                  *          { "name": "platform" },
72402                  *          { "name": "version" },
72403                  *          { "name": "grade" }
72404                  *        ]
72405                  *      } );
72406                  *    } );
72407                  */
72408                 "sName": "",
72411                 /**
72412                  * Defines a data source type for the ordering which can be used to read
72413                  * real-time information from the table (updating the internally cached
72414                  * version) prior to ordering. This allows ordering to occur on user
72415                  * editable elements such as form inputs.
72416                  *  @type string
72417                  *  @default std
72418                  *
72419                  *  @name DataTable.defaults.column.orderDataType
72420                  *  @dtopt Columns
72421                  *
72422                  *  @example
72423                  *    // Using `columnDefs`
72424                  *    $(document).ready( function() {
72425                  *      $('#example').dataTable( {
72426                  *        "columnDefs": [
72427                  *          { "orderDataType": "dom-text", "targets": [ 2, 3 ] },
72428                  *          { "type": "numeric", "targets": [ 3 ] },
72429                  *          { "orderDataType": "dom-select", "targets": [ 4 ] },
72430                  *          { "orderDataType": "dom-checkbox", "targets": [ 5 ] }
72431                  *        ]
72432                  *      } );
72433                  *    } );
72434                  *
72435                  *  @example
72436                  *    // Using `columns`
72437                  *    $(document).ready( function() {
72438                  *      $('#example').dataTable( {
72439                  *        "columns": [
72440                  *          null,
72441                  *          null,
72442                  *          { "orderDataType": "dom-text" },
72443                  *          { "orderDataType": "dom-text", "type": "numeric" },
72444                  *          { "orderDataType": "dom-select" },
72445                  *          { "orderDataType": "dom-checkbox" }
72446                  *        ]
72447                  *      } );
72448                  *    } );
72449                  */
72450                 "sSortDataType": "std",
72453                 /**
72454                  * The title of this column.
72455                  *  @type string
72456                  *  @default null <i>Derived from the 'TH' value for this column in the
72457                  *    original HTML table.</i>
72458                  *
72459                  *  @name DataTable.defaults.column.title
72460                  *  @dtopt Columns
72461                  *
72462                  *  @example
72463                  *    // Using `columnDefs`
72464                  *    $(document).ready( function() {
72465                  *      $('#example').dataTable( {
72466                  *        "columnDefs": [
72467                  *          { "title": "My column title", "targets": [ 0 ] }
72468                  *        ]
72469                  *      } );
72470                  *    } );
72471                  *
72472                  *  @example
72473                  *    // Using `columns`
72474                  *    $(document).ready( function() {
72475                  *      $('#example').dataTable( {
72476                  *        "columns": [
72477                  *          { "title": "My column title" },
72478                  *          null,
72479                  *          null,
72480                  *          null,
72481                  *          null
72482                  *        ]
72483                  *      } );
72484                  *    } );
72485                  */
72486                 "sTitle": null,
72489                 /**
72490                  * The type allows you to specify how the data for this column will be
72491                  * ordered. Four types (string, numeric, date and html (which will strip
72492                  * HTML tags before ordering)) are currently available. Note that only date
72493                  * formats understood by Javascript's Date() object will be accepted as type
72494                  * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string',
72495                  * 'numeric', 'date' or 'html' (by default). Further types can be adding
72496                  * through plug-ins.
72497                  *  @type string
72498                  *  @default null <i>Auto-detected from raw data</i>
72499                  *
72500                  *  @name DataTable.defaults.column.type
72501                  *  @dtopt Columns
72502                  *
72503                  *  @example
72504                  *    // Using `columnDefs`
72505                  *    $(document).ready( function() {
72506                  *      $('#example').dataTable( {
72507                  *        "columnDefs": [
72508                  *          { "type": "html", "targets": [ 0 ] }
72509                  *        ]
72510                  *      } );
72511                  *    } );
72512                  *
72513                  *  @example
72514                  *    // Using `columns`
72515                  *    $(document).ready( function() {
72516                  *      $('#example').dataTable( {
72517                  *        "columns": [
72518                  *          { "type": "html" },
72519                  *          null,
72520                  *          null,
72521                  *          null,
72522                  *          null
72523                  *        ]
72524                  *      } );
72525                  *    } );
72526                  */
72527                 "sType": null,
72530                 /**
72531                  * Defining the width of the column, this parameter may take any CSS value
72532                  * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not
72533                  * been given a specific width through this interface ensuring that the table
72534                  * remains readable.
72535                  *  @type string
72536                  *  @default null <i>Automatic</i>
72537                  *
72538                  *  @name DataTable.defaults.column.width
72539                  *  @dtopt Columns
72540                  *
72541                  *  @example
72542                  *    // Using `columnDefs`
72543                  *    $(document).ready( function() {
72544                  *      $('#example').dataTable( {
72545                  *        "columnDefs": [
72546                  *          { "width": "20%", "targets": [ 0 ] }
72547                  *        ]
72548                  *      } );
72549                  *    } );
72550                  *
72551                  *  @example
72552                  *    // Using `columns`
72553                  *    $(document).ready( function() {
72554                  *      $('#example').dataTable( {
72555                  *        "columns": [
72556                  *          { "width": "20%" },
72557                  *          null,
72558                  *          null,
72559                  *          null,
72560                  *          null
72561                  *        ]
72562                  *      } );
72563                  *    } );
72564                  */
72565                 "sWidth": null
72566         };
72568         _fnHungarianMap( DataTable.defaults.column );
72572         /**
72573          * DataTables settings object - this holds all the information needed for a
72574          * given table, including configuration, data and current application of the
72575          * table options. DataTables does not have a single instance for each DataTable
72576          * with the settings attached to that instance, but rather instances of the
72577          * DataTable "class" are created on-the-fly as needed (typically by a
72578          * $().dataTable() call) and the settings object is then applied to that
72579          * instance.
72580          *
72581          * Note that this object is related to {@link DataTable.defaults} but this
72582          * one is the internal data store for DataTables's cache of columns. It should
72583          * NOT be manipulated outside of DataTables. Any configuration should be done
72584          * through the initialisation options.
72585          *  @namespace
72586          *  @todo Really should attach the settings object to individual instances so we
72587          *    don't need to create new instances on each $().dataTable() call (if the
72588          *    table already exists). It would also save passing oSettings around and
72589          *    into every single function. However, this is a very significant
72590          *    architecture change for DataTables and will almost certainly break
72591          *    backwards compatibility with older installations. This is something that
72592          *    will be done in 2.0.
72593          */
72594         DataTable.models.oSettings = {
72595                 /**
72596                  * Primary features of DataTables and their enablement state.
72597                  *  @namespace
72598                  */
72599                 "oFeatures": {
72601                         /**
72602                          * Flag to say if DataTables should automatically try to calculate the
72603                          * optimum table and columns widths (true) or not (false).
72604                          * Note that this parameter will be set by the initialisation routine. To
72605                          * set a default use {@link DataTable.defaults}.
72606                          *  @type boolean
72607                          */
72608                         "bAutoWidth": null,
72610                         /**
72611                          * Delay the creation of TR and TD elements until they are actually
72612                          * needed by a driven page draw. This can give a significant speed
72613                          * increase for Ajax source and Javascript source data, but makes no
72614                          * difference at all fro DOM and server-side processing tables.
72615                          * Note that this parameter will be set by the initialisation routine. To
72616                          * set a default use {@link DataTable.defaults}.
72617                          *  @type boolean
72618                          */
72619                         "bDeferRender": null,
72621                         /**
72622                          * Enable filtering on the table or not. Note that if this is disabled
72623                          * then there is no filtering at all on the table, including fnFilter.
72624                          * To just remove the filtering input use sDom and remove the 'f' option.
72625                          * Note that this parameter will be set by the initialisation routine. To
72626                          * set a default use {@link DataTable.defaults}.
72627                          *  @type boolean
72628                          */
72629                         "bFilter": null,
72631                         /**
72632                          * Table information element (the 'Showing x of y records' div) enable
72633                          * flag.
72634                          * Note that this parameter will be set by the initialisation routine. To
72635                          * set a default use {@link DataTable.defaults}.
72636                          *  @type boolean
72637                          */
72638                         "bInfo": null,
72640                         /**
72641                          * Present a user control allowing the end user to change the page size
72642                          * when pagination is enabled.
72643                          * Note that this parameter will be set by the initialisation routine. To
72644                          * set a default use {@link DataTable.defaults}.
72645                          *  @type boolean
72646                          */
72647                         "bLengthChange": null,
72649                         /**
72650                          * Pagination enabled or not. Note that if this is disabled then length
72651                          * changing must also be disabled.
72652                          * Note that this parameter will be set by the initialisation routine. To
72653                          * set a default use {@link DataTable.defaults}.
72654                          *  @type boolean
72655                          */
72656                         "bPaginate": null,
72658                         /**
72659                          * Processing indicator enable flag whenever DataTables is enacting a
72660                          * user request - typically an Ajax request for server-side processing.
72661                          * Note that this parameter will be set by the initialisation routine. To
72662                          * set a default use {@link DataTable.defaults}.
72663                          *  @type boolean
72664                          */
72665                         "bProcessing": null,
72667                         /**
72668                          * Server-side processing enabled flag - when enabled DataTables will
72669                          * get all data from the server for every draw - there is no filtering,
72670                          * sorting or paging done on the client-side.
72671                          * Note that this parameter will be set by the initialisation routine. To
72672                          * set a default use {@link DataTable.defaults}.
72673                          *  @type boolean
72674                          */
72675                         "bServerSide": null,
72677                         /**
72678                          * Sorting enablement flag.
72679                          * Note that this parameter will be set by the initialisation routine. To
72680                          * set a default use {@link DataTable.defaults}.
72681                          *  @type boolean
72682                          */
72683                         "bSort": null,
72685                         /**
72686                          * Multi-column sorting
72687                          * Note that this parameter will be set by the initialisation routine. To
72688                          * set a default use {@link DataTable.defaults}.
72689                          *  @type boolean
72690                          */
72691                         "bSortMulti": null,
72693                         /**
72694                          * Apply a class to the columns which are being sorted to provide a
72695                          * visual highlight or not. This can slow things down when enabled since
72696                          * there is a lot of DOM interaction.
72697                          * Note that this parameter will be set by the initialisation routine. To
72698                          * set a default use {@link DataTable.defaults}.
72699                          *  @type boolean
72700                          */
72701                         "bSortClasses": null,
72703                         /**
72704                          * State saving enablement flag.
72705                          * Note that this parameter will be set by the initialisation routine. To
72706                          * set a default use {@link DataTable.defaults}.
72707                          *  @type boolean
72708                          */
72709                         "bStateSave": null
72710                 },
72713                 /**
72714                  * Scrolling settings for a table.
72715                  *  @namespace
72716                  */
72717                 "oScroll": {
72718                         /**
72719                          * When the table is shorter in height than sScrollY, collapse the
72720                          * table container down to the height of the table (when true).
72721                          * Note that this parameter will be set by the initialisation routine. To
72722                          * set a default use {@link DataTable.defaults}.
72723                          *  @type boolean
72724                          */
72725                         "bCollapse": null,
72727                         /**
72728                          * Width of the scrollbar for the web-browser's platform. Calculated
72729                          * during table initialisation.
72730                          *  @type int
72731                          *  @default 0
72732                          */
72733                         "iBarWidth": 0,
72735                         /**
72736                          * Viewport width for horizontal scrolling. Horizontal scrolling is
72737                          * disabled if an empty string.
72738                          * Note that this parameter will be set by the initialisation routine. To
72739                          * set a default use {@link DataTable.defaults}.
72740                          *  @type string
72741                          */
72742                         "sX": null,
72744                         /**
72745                          * Width to expand the table to when using x-scrolling. Typically you
72746                          * should not need to use this.
72747                          * Note that this parameter will be set by the initialisation routine. To
72748                          * set a default use {@link DataTable.defaults}.
72749                          *  @type string
72750                          *  @deprecated
72751                          */
72752                         "sXInner": null,
72754                         /**
72755                          * Viewport height for vertical scrolling. Vertical scrolling is disabled
72756                          * if an empty string.
72757                          * Note that this parameter will be set by the initialisation routine. To
72758                          * set a default use {@link DataTable.defaults}.
72759                          *  @type string
72760                          */
72761                         "sY": null
72762                 },
72764                 /**
72765                  * Language information for the table.
72766                  *  @namespace
72767                  *  @extends DataTable.defaults.oLanguage
72768                  */
72769                 "oLanguage": {
72770                         /**
72771                          * Information callback function. See
72772                          * {@link DataTable.defaults.fnInfoCallback}
72773                          *  @type function
72774                          *  @default null
72775                          */
72776                         "fnInfoCallback": null
72777                 },
72779                 /**
72780                  * Browser support parameters
72781                  *  @namespace
72782                  */
72783                 "oBrowser": {
72784                         /**
72785                          * Indicate if the browser incorrectly calculates width:100% inside a
72786                          * scrolling element (IE6/7)
72787                          *  @type boolean
72788                          *  @default false
72789                          */
72790                         "bScrollOversize": false,
72792                         /**
72793                          * Determine if the vertical scrollbar is on the right or left of the
72794                          * scrolling container - needed for rtl language layout, although not
72795                          * all browsers move the scrollbar (Safari).
72796                          *  @type boolean
72797                          *  @default false
72798                          */
72799                         "bScrollbarLeft": false,
72801                         /**
72802                          * Flag for if `getBoundingClientRect` is fully supported or not
72803                          *  @type boolean
72804                          *  @default false
72805                          */
72806                         "bBounding": false,
72808                         /**
72809                          * Browser scrollbar width
72810                          *  @type integer
72811                          *  @default 0
72812                          */
72813                         "barWidth": 0
72814                 },
72817                 "ajax": null,
72820                 /**
72821                  * Array referencing the nodes which are used for the features. The
72822                  * parameters of this object match what is allowed by sDom - i.e.
72823                  *   <ul>
72824                  *     <li>'l' - Length changing</li>
72825                  *     <li>'f' - Filtering input</li>
72826                  *     <li>'t' - The table!</li>
72827                  *     <li>'i' - Information</li>
72828                  *     <li>'p' - Pagination</li>
72829                  *     <li>'r' - pRocessing</li>
72830                  *   </ul>
72831                  *  @type array
72832                  *  @default []
72833                  */
72834                 "aanFeatures": [],
72836                 /**
72837                  * Store data information - see {@link DataTable.models.oRow} for detailed
72838                  * information.
72839                  *  @type array
72840                  *  @default []
72841                  */
72842                 "aoData": [],
72844                 /**
72845                  * Array of indexes which are in the current display (after filtering etc)
72846                  *  @type array
72847                  *  @default []
72848                  */
72849                 "aiDisplay": [],
72851                 /**
72852                  * Array of indexes for display - no filtering
72853                  *  @type array
72854                  *  @default []
72855                  */
72856                 "aiDisplayMaster": [],
72858                 /**
72859                  * Map of row ids to data indexes
72860                  *  @type object
72861                  *  @default {}
72862                  */
72863                 "aIds": {},
72865                 /**
72866                  * Store information about each column that is in use
72867                  *  @type array
72868                  *  @default []
72869                  */
72870                 "aoColumns": [],
72872                 /**
72873                  * Store information about the table's header
72874                  *  @type array
72875                  *  @default []
72876                  */
72877                 "aoHeader": [],
72879                 /**
72880                  * Store information about the table's footer
72881                  *  @type array
72882                  *  @default []
72883                  */
72884                 "aoFooter": [],
72886                 /**
72887                  * Store the applied global search information in case we want to force a
72888                  * research or compare the old search to a new one.
72889                  * Note that this parameter will be set by the initialisation routine. To
72890                  * set a default use {@link DataTable.defaults}.
72891                  *  @namespace
72892                  *  @extends DataTable.models.oSearch
72893                  */
72894                 "oPreviousSearch": {},
72896                 /**
72897                  * Store the applied search for each column - see
72898                  * {@link DataTable.models.oSearch} for the format that is used for the
72899                  * filtering information for each column.
72900                  *  @type array
72901                  *  @default []
72902                  */
72903                 "aoPreSearchCols": [],
72905                 /**
72906                  * Sorting that is applied to the table. Note that the inner arrays are
72907                  * used in the following manner:
72908                  * <ul>
72909                  *   <li>Index 0 - column number</li>
72910                  *   <li>Index 1 - current sorting direction</li>
72911                  * </ul>
72912                  * Note that this parameter will be set by the initialisation routine. To
72913                  * set a default use {@link DataTable.defaults}.
72914                  *  @type array
72915                  *  @todo These inner arrays should really be objects
72916                  */
72917                 "aaSorting": null,
72919                 /**
72920                  * Sorting that is always applied to the table (i.e. prefixed in front of
72921                  * aaSorting).
72922                  * Note that this parameter will be set by the initialisation routine. To
72923                  * set a default use {@link DataTable.defaults}.
72924                  *  @type array
72925                  *  @default []
72926                  */
72927                 "aaSortingFixed": [],
72929                 /**
72930                  * Classes to use for the striping of a table.
72931                  * Note that this parameter will be set by the initialisation routine. To
72932                  * set a default use {@link DataTable.defaults}.
72933                  *  @type array
72934                  *  @default []
72935                  */
72936                 "asStripeClasses": null,
72938                 /**
72939                  * If restoring a table - we should restore its striping classes as well
72940                  *  @type array
72941                  *  @default []
72942                  */
72943                 "asDestroyStripes": [],
72945                 /**
72946                  * If restoring a table - we should restore its width
72947                  *  @type int
72948                  *  @default 0
72949                  */
72950                 "sDestroyWidth": 0,
72952                 /**
72953                  * Callback functions array for every time a row is inserted (i.e. on a draw).
72954                  *  @type array
72955                  *  @default []
72956                  */
72957                 "aoRowCallback": [],
72959                 /**
72960                  * Callback functions for the header on each draw.
72961                  *  @type array
72962                  *  @default []
72963                  */
72964                 "aoHeaderCallback": [],
72966                 /**
72967                  * Callback function for the footer on each draw.
72968                  *  @type array
72969                  *  @default []
72970                  */
72971                 "aoFooterCallback": [],
72973                 /**
72974                  * Array of callback functions for draw callback functions
72975                  *  @type array
72976                  *  @default []
72977                  */
72978                 "aoDrawCallback": [],
72980                 /**
72981                  * Array of callback functions for row created function
72982                  *  @type array
72983                  *  @default []
72984                  */
72985                 "aoRowCreatedCallback": [],
72987                 /**
72988                  * Callback functions for just before the table is redrawn. A return of
72989                  * false will be used to cancel the draw.
72990                  *  @type array
72991                  *  @default []
72992                  */
72993                 "aoPreDrawCallback": [],
72995                 /**
72996                  * Callback functions for when the table has been initialised.
72997                  *  @type array
72998                  *  @default []
72999                  */
73000                 "aoInitComplete": [],
73003                 /**
73004                  * Callbacks for modifying the settings to be stored for state saving, prior to
73005                  * saving state.
73006                  *  @type array
73007                  *  @default []
73008                  */
73009                 "aoStateSaveParams": [],
73011                 /**
73012                  * Callbacks for modifying the settings that have been stored for state saving
73013                  * prior to using the stored values to restore the state.
73014                  *  @type array
73015                  *  @default []
73016                  */
73017                 "aoStateLoadParams": [],
73019                 /**
73020                  * Callbacks for operating on the settings object once the saved state has been
73021                  * loaded
73022                  *  @type array
73023                  *  @default []
73024                  */
73025                 "aoStateLoaded": [],
73027                 /**
73028                  * Cache the table ID for quick access
73029                  *  @type string
73030                  *  @default <i>Empty string</i>
73031                  */
73032                 "sTableId": "",
73034                 /**
73035                  * The TABLE node for the main table
73036                  *  @type node
73037                  *  @default null
73038                  */
73039                 "nTable": null,
73041                 /**
73042                  * Permanent ref to the thead element
73043                  *  @type node
73044                  *  @default null
73045                  */
73046                 "nTHead": null,
73048                 /**
73049                  * Permanent ref to the tfoot element - if it exists
73050                  *  @type node
73051                  *  @default null
73052                  */
73053                 "nTFoot": null,
73055                 /**
73056                  * Permanent ref to the tbody element
73057                  *  @type node
73058                  *  @default null
73059                  */
73060                 "nTBody": null,
73062                 /**
73063                  * Cache the wrapper node (contains all DataTables controlled elements)
73064                  *  @type node
73065                  *  @default null
73066                  */
73067                 "nTableWrapper": null,
73069                 /**
73070                  * Indicate if when using server-side processing the loading of data
73071                  * should be deferred until the second draw.
73072                  * Note that this parameter will be set by the initialisation routine. To
73073                  * set a default use {@link DataTable.defaults}.
73074                  *  @type boolean
73075                  *  @default false
73076                  */
73077                 "bDeferLoading": false,
73079                 /**
73080                  * Indicate if all required information has been read in
73081                  *  @type boolean
73082                  *  @default false
73083                  */
73084                 "bInitialised": false,
73086                 /**
73087                  * Information about open rows. Each object in the array has the parameters
73088                  * 'nTr' and 'nParent'
73089                  *  @type array
73090                  *  @default []
73091                  */
73092                 "aoOpenRows": [],
73094                 /**
73095                  * Dictate the positioning of DataTables' control elements - see
73096                  * {@link DataTable.model.oInit.sDom}.
73097                  * Note that this parameter will be set by the initialisation routine. To
73098                  * set a default use {@link DataTable.defaults}.
73099                  *  @type string
73100                  *  @default null
73101                  */
73102                 "sDom": null,
73104                 /**
73105                  * Search delay (in mS)
73106                  *  @type integer
73107                  *  @default null
73108                  */
73109                 "searchDelay": null,
73111                 /**
73112                  * Which type of pagination should be used.
73113                  * Note that this parameter will be set by the initialisation routine. To
73114                  * set a default use {@link DataTable.defaults}.
73115                  *  @type string
73116                  *  @default two_button
73117                  */
73118                 "sPaginationType": "two_button",
73120                 /**
73121                  * The state duration (for `stateSave`) in seconds.
73122                  * Note that this parameter will be set by the initialisation routine. To
73123                  * set a default use {@link DataTable.defaults}.
73124                  *  @type int
73125                  *  @default 0
73126                  */
73127                 "iStateDuration": 0,
73129                 /**
73130                  * Array of callback functions for state saving. Each array element is an
73131                  * object with the following parameters:
73132                  *   <ul>
73133                  *     <li>function:fn - function to call. Takes two parameters, oSettings
73134                  *       and the JSON string to save that has been thus far created. Returns
73135                  *       a JSON string to be inserted into a json object
73136                  *       (i.e. '"param": [ 0, 1, 2]')</li>
73137                  *     <li>string:sName - name of callback</li>
73138                  *   </ul>
73139                  *  @type array
73140                  *  @default []
73141                  */
73142                 "aoStateSave": [],
73144                 /**
73145                  * Array of callback functions for state loading. Each array element is an
73146                  * object with the following parameters:
73147                  *   <ul>
73148                  *     <li>function:fn - function to call. Takes two parameters, oSettings
73149                  *       and the object stored. May return false to cancel state loading</li>
73150                  *     <li>string:sName - name of callback</li>
73151                  *   </ul>
73152                  *  @type array
73153                  *  @default []
73154                  */
73155                 "aoStateLoad": [],
73157                 /**
73158                  * State that was saved. Useful for back reference
73159                  *  @type object
73160                  *  @default null
73161                  */
73162                 "oSavedState": null,
73164                 /**
73165                  * State that was loaded. Useful for back reference
73166                  *  @type object
73167                  *  @default null
73168                  */
73169                 "oLoadedState": null,
73171                 /**
73172                  * Source url for AJAX data for the table.
73173                  * Note that this parameter will be set by the initialisation routine. To
73174                  * set a default use {@link DataTable.defaults}.
73175                  *  @type string
73176                  *  @default null
73177                  */
73178                 "sAjaxSource": null,
73180                 /**
73181                  * Property from a given object from which to read the table data from. This
73182                  * can be an empty string (when not server-side processing), in which case
73183                  * it is  assumed an an array is given directly.
73184                  * Note that this parameter will be set by the initialisation routine. To
73185                  * set a default use {@link DataTable.defaults}.
73186                  *  @type string
73187                  */
73188                 "sAjaxDataProp": null,
73190                 /**
73191                  * Note if draw should be blocked while getting data
73192                  *  @type boolean
73193                  *  @default true
73194                  */
73195                 "bAjaxDataGet": true,
73197                 /**
73198                  * The last jQuery XHR object that was used for server-side data gathering.
73199                  * This can be used for working with the XHR information in one of the
73200                  * callbacks
73201                  *  @type object
73202                  *  @default null
73203                  */
73204                 "jqXHR": null,
73206                 /**
73207                  * JSON returned from the server in the last Ajax request
73208                  *  @type object
73209                  *  @default undefined
73210                  */
73211                 "json": undefined,
73213                 /**
73214                  * Data submitted as part of the last Ajax request
73215                  *  @type object
73216                  *  @default undefined
73217                  */
73218                 "oAjaxData": undefined,
73220                 /**
73221                  * Function to get the server-side data.
73222                  * Note that this parameter will be set by the initialisation routine. To
73223                  * set a default use {@link DataTable.defaults}.
73224                  *  @type function
73225                  */
73226                 "fnServerData": null,
73228                 /**
73229                  * Functions which are called prior to sending an Ajax request so extra
73230                  * parameters can easily be sent to the server
73231                  *  @type array
73232                  *  @default []
73233                  */
73234                 "aoServerParams": [],
73236                 /**
73237                  * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if
73238                  * required).
73239                  * Note that this parameter will be set by the initialisation routine. To
73240                  * set a default use {@link DataTable.defaults}.
73241                  *  @type string
73242                  */
73243                 "sServerMethod": null,
73245                 /**
73246                  * Format numbers for display.
73247                  * Note that this parameter will be set by the initialisation routine. To
73248                  * set a default use {@link DataTable.defaults}.
73249                  *  @type function
73250                  */
73251                 "fnFormatNumber": null,
73253                 /**
73254                  * List of options that can be used for the user selectable length menu.
73255                  * Note that this parameter will be set by the initialisation routine. To
73256                  * set a default use {@link DataTable.defaults}.
73257                  *  @type array
73258                  *  @default []
73259                  */
73260                 "aLengthMenu": null,
73262                 /**
73263                  * Counter for the draws that the table does. Also used as a tracker for
73264                  * server-side processing
73265                  *  @type int
73266                  *  @default 0
73267                  */
73268                 "iDraw": 0,
73270                 /**
73271                  * Indicate if a redraw is being done - useful for Ajax
73272                  *  @type boolean
73273                  *  @default false
73274                  */
73275                 "bDrawing": false,
73277                 /**
73278                  * Draw index (iDraw) of the last error when parsing the returned data
73279                  *  @type int
73280                  *  @default -1
73281                  */
73282                 "iDrawError": -1,
73284                 /**
73285                  * Paging display length
73286                  *  @type int
73287                  *  @default 10
73288                  */
73289                 "_iDisplayLength": 10,
73291                 /**
73292                  * Paging start point - aiDisplay index
73293                  *  @type int
73294                  *  @default 0
73295                  */
73296                 "_iDisplayStart": 0,
73298                 /**
73299                  * Server-side processing - number of records in the result set
73300                  * (i.e. before filtering), Use fnRecordsTotal rather than
73301                  * this property to get the value of the number of records, regardless of
73302                  * the server-side processing setting.
73303                  *  @type int
73304                  *  @default 0
73305                  *  @private
73306                  */
73307                 "_iRecordsTotal": 0,
73309                 /**
73310                  * Server-side processing - number of records in the current display set
73311                  * (i.e. after filtering). Use fnRecordsDisplay rather than
73312                  * this property to get the value of the number of records, regardless of
73313                  * the server-side processing setting.
73314                  *  @type boolean
73315                  *  @default 0
73316                  *  @private
73317                  */
73318                 "_iRecordsDisplay": 0,
73320                 /**
73321                  * The classes to use for the table
73322                  *  @type object
73323                  *  @default {}
73324                  */
73325                 "oClasses": {},
73327                 /**
73328                  * Flag attached to the settings object so you can check in the draw
73329                  * callback if filtering has been done in the draw. Deprecated in favour of
73330                  * events.
73331                  *  @type boolean
73332                  *  @default false
73333                  *  @deprecated
73334                  */
73335                 "bFiltered": false,
73337                 /**
73338                  * Flag attached to the settings object so you can check in the draw
73339                  * callback if sorting has been done in the draw. Deprecated in favour of
73340                  * events.
73341                  *  @type boolean
73342                  *  @default false
73343                  *  @deprecated
73344                  */
73345                 "bSorted": false,
73347                 /**
73348                  * Indicate that if multiple rows are in the header and there is more than
73349                  * one unique cell per column, if the top one (true) or bottom one (false)
73350                  * should be used for sorting / title by DataTables.
73351                  * Note that this parameter will be set by the initialisation routine. To
73352                  * set a default use {@link DataTable.defaults}.
73353                  *  @type boolean
73354                  */
73355                 "bSortCellsTop": null,
73357                 /**
73358                  * Initialisation object that is used for the table
73359                  *  @type object
73360                  *  @default null
73361                  */
73362                 "oInit": null,
73364                 /**
73365                  * Destroy callback functions - for plug-ins to attach themselves to the
73366                  * destroy so they can clean up markup and events.
73367                  *  @type array
73368                  *  @default []
73369                  */
73370                 "aoDestroyCallback": [],
73373                 /**
73374                  * Get the number of records in the current record set, before filtering
73375                  *  @type function
73376                  */
73377                 "fnRecordsTotal": function ()
73378                 {
73379                         return _fnDataSource( this ) == 'ssp' ?
73380                                 this._iRecordsTotal * 1 :
73381                                 this.aiDisplayMaster.length;
73382                 },
73384                 /**
73385                  * Get the number of records in the current record set, after filtering
73386                  *  @type function
73387                  */
73388                 "fnRecordsDisplay": function ()
73389                 {
73390                         return _fnDataSource( this ) == 'ssp' ?
73391                                 this._iRecordsDisplay * 1 :
73392                                 this.aiDisplay.length;
73393                 },
73395                 /**
73396                  * Get the display end point - aiDisplay index
73397                  *  @type function
73398                  */
73399                 "fnDisplayEnd": function ()
73400                 {
73401                         var
73402                                 len      = this._iDisplayLength,
73403                                 start    = this._iDisplayStart,
73404                                 calc     = start + len,
73405                                 records  = this.aiDisplay.length,
73406                                 features = this.oFeatures,
73407                                 paginate = features.bPaginate;
73409                         if ( features.bServerSide ) {
73410                                 return paginate === false || len === -1 ?
73411                                         start + records :
73412                                         Math.min( start+len, this._iRecordsDisplay );
73413                         }
73414                         else {
73415                                 return ! paginate || calc>records || len===-1 ?
73416                                         records :
73417                                         calc;
73418                         }
73419                 },
73421                 /**
73422                  * The DataTables object for this table
73423                  *  @type object
73424                  *  @default null
73425                  */
73426                 "oInstance": null,
73428                 /**
73429                  * Unique identifier for each instance of the DataTables object. If there
73430                  * is an ID on the table node, then it takes that value, otherwise an
73431                  * incrementing internal counter is used.
73432                  *  @type string
73433                  *  @default null
73434                  */
73435                 "sInstance": null,
73437                 /**
73438                  * tabindex attribute value that is added to DataTables control elements, allowing
73439                  * keyboard navigation of the table and its controls.
73440                  */
73441                 "iTabIndex": 0,
73443                 /**
73444                  * DIV container for the footer scrolling table if scrolling
73445                  */
73446                 "nScrollHead": null,
73448                 /**
73449                  * DIV container for the footer scrolling table if scrolling
73450                  */
73451                 "nScrollFoot": null,
73453                 /**
73454                  * Last applied sort
73455                  *  @type array
73456                  *  @default []
73457                  */
73458                 "aLastSort": [],
73460                 /**
73461                  * Stored plug-in instances
73462                  *  @type object
73463                  *  @default {}
73464                  */
73465                 "oPlugins": {},
73467                 /**
73468                  * Function used to get a row's id from the row's data
73469                  *  @type function
73470                  *  @default null
73471                  */
73472                 "rowIdFn": null,
73474                 /**
73475                  * Data location where to store a row's id
73476                  *  @type string
73477                  *  @default null
73478                  */
73479                 "rowId": null
73480         };
73482         /**
73483          * Extension object for DataTables that is used to provide all extension
73484          * options.
73485          *
73486          * Note that the `DataTable.ext` object is available through
73487          * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is
73488          * also aliased to `jQuery.fn.dataTableExt` for historic reasons.
73489          *  @namespace
73490          *  @extends DataTable.models.ext
73491          */
73494         /**
73495          * DataTables extensions
73496          *
73497          * This namespace acts as a collection area for plug-ins that can be used to
73498          * extend DataTables capabilities. Indeed many of the build in methods
73499          * use this method to provide their own capabilities (sorting methods for
73500          * example).
73501          *
73502          * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy
73503          * reasons
73504          *
73505          *  @namespace
73506          */
73507         DataTable.ext = _ext = {
73508                 /**
73509                  * Buttons. For use with the Buttons extension for DataTables. This is
73510                  * defined here so other extensions can define buttons regardless of load
73511                  * order. It is _not_ used by DataTables core.
73512                  *
73513                  *  @type object
73514                  *  @default {}
73515                  */
73516                 buttons: {},
73519                 /**
73520                  * Element class names
73521                  *
73522                  *  @type object
73523                  *  @default {}
73524                  */
73525                 classes: {},
73528                 /**
73529                  * DataTables build type (expanded by the download builder)
73530                  *
73531                  *  @type string
73532                  */
73533                 build:"dt/jszip-2.5.0/pdfmake-0.1.36/dt-1.10.18/b-1.5.6/b-colvis-1.5.6/b-html5-1.5.6/b-print-1.5.6/fh-3.1.4",
73536                 /**
73537                  * Error reporting.
73538                  *
73539                  * How should DataTables report an error. Can take the value 'alert',
73540                  * 'throw', 'none' or a function.
73541                  *
73542                  *  @type string|function
73543                  *  @default alert
73544                  */
73545                 errMode: "alert",
73548                 /**
73549                  * Feature plug-ins.
73550                  *
73551                  * This is an array of objects which describe the feature plug-ins that are
73552                  * available to DataTables. These feature plug-ins are then available for
73553                  * use through the `dom` initialisation option.
73554                  *
73555                  * Each feature plug-in is described by an object which must have the
73556                  * following properties:
73557                  *
73558                  * * `fnInit` - function that is used to initialise the plug-in,
73559                  * * `cFeature` - a character so the feature can be enabled by the `dom`
73560                  *   instillation option. This is case sensitive.
73561                  *
73562                  * The `fnInit` function has the following input parameters:
73563                  *
73564                  * 1. `{object}` DataTables settings object: see
73565                  *    {@link DataTable.models.oSettings}
73566                  *
73567                  * And the following return is expected:
73568                  *
73569                  * * {node|null} The element which contains your feature. Note that the
73570                  *   return may also be void if your plug-in does not require to inject any
73571                  *   DOM elements into DataTables control (`dom`) - for example this might
73572                  *   be useful when developing a plug-in which allows table control via
73573                  *   keyboard entry
73574                  *
73575                  *  @type array
73576                  *
73577                  *  @example
73578                  *    $.fn.dataTable.ext.features.push( {
73579                  *      "fnInit": function( oSettings ) {
73580                  *        return new TableTools( { "oDTSettings": oSettings } );
73581                  *      },
73582                  *      "cFeature": "T"
73583                  *    } );
73584                  */
73585                 feature: [],
73588                 /**
73589                  * Row searching.
73590                  *
73591                  * This method of searching is complimentary to the default type based
73592                  * searching, and a lot more comprehensive as it allows you complete control
73593                  * over the searching logic. Each element in this array is a function
73594                  * (parameters described below) that is called for every row in the table,
73595                  * and your logic decides if it should be included in the searching data set
73596                  * or not.
73597                  *
73598                  * Searching functions have the following input parameters:
73599                  *
73600                  * 1. `{object}` DataTables settings object: see
73601                  *    {@link DataTable.models.oSettings}
73602                  * 2. `{array|object}` Data for the row to be processed (same as the
73603                  *    original format that was passed in as the data source, or an array
73604                  *    from a DOM data source
73605                  * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which
73606                  *    can be useful to retrieve the `TR` element if you need DOM interaction.
73607                  *
73608                  * And the following return is expected:
73609                  *
73610                  * * {boolean} Include the row in the searched result set (true) or not
73611                  *   (false)
73612                  *
73613                  * Note that as with the main search ability in DataTables, technically this
73614                  * is "filtering", since it is subtractive. However, for consistency in
73615                  * naming we call it searching here.
73616                  *
73617                  *  @type array
73618                  *  @default []
73619                  *
73620                  *  @example
73621                  *    // The following example shows custom search being applied to the
73622                  *    // fourth column (i.e. the data[3] index) based on two input values
73623                  *    // from the end-user, matching the data in a certain range.
73624                  *    $.fn.dataTable.ext.search.push(
73625                  *      function( settings, data, dataIndex ) {
73626                  *        var min = document.getElementById('min').value * 1;
73627                  *        var max = document.getElementById('max').value * 1;
73628                  *        var version = data[3] == "-" ? 0 : data[3]*1;
73629                  *
73630                  *        if ( min == "" && max == "" ) {
73631                  *          return true;
73632                  *        }
73633                  *        else if ( min == "" && version < max ) {
73634                  *          return true;
73635                  *        }
73636                  *        else if ( min < version && "" == max ) {
73637                  *          return true;
73638                  *        }
73639                  *        else if ( min < version && version < max ) {
73640                  *          return true;
73641                  *        }
73642                  *        return false;
73643                  *      }
73644                  *    );
73645                  */
73646                 search: [],
73649                 /**
73650                  * Selector extensions
73651                  *
73652                  * The `selector` option can be used to extend the options available for the
73653                  * selector modifier options (`selector-modifier` object data type) that
73654                  * each of the three built in selector types offer (row, column and cell +
73655                  * their plural counterparts). For example the Select extension uses this
73656                  * mechanism to provide an option to select only rows, columns and cells
73657                  * that have been marked as selected by the end user (`{selected: true}`),
73658                  * which can be used in conjunction with the existing built in selector
73659                  * options.
73660                  *
73661                  * Each property is an array to which functions can be pushed. The functions
73662                  * take three attributes:
73663                  *
73664                  * * Settings object for the host table
73665                  * * Options object (`selector-modifier` object type)
73666                  * * Array of selected item indexes
73667                  *
73668                  * The return is an array of the resulting item indexes after the custom
73669                  * selector has been applied.
73670                  *
73671                  *  @type object
73672                  */
73673                 selector: {
73674                         cell: [],
73675                         column: [],
73676                         row: []
73677                 },
73680                 /**
73681                  * Internal functions, exposed for used in plug-ins.
73682                  *
73683                  * Please note that you should not need to use the internal methods for
73684                  * anything other than a plug-in (and even then, try to avoid if possible).
73685                  * The internal function may change between releases.
73686                  *
73687                  *  @type object
73688                  *  @default {}
73689                  */
73690                 internal: {},
73693                 /**
73694                  * Legacy configuration options. Enable and disable legacy options that
73695                  * are available in DataTables.
73696                  *
73697                  *  @type object
73698                  */
73699                 legacy: {
73700                         /**
73701                          * Enable / disable DataTables 1.9 compatible server-side processing
73702                          * requests
73703                          *
73704                          *  @type boolean
73705                          *  @default null
73706                          */
73707                         ajax: null
73708                 },
73711                 /**
73712                  * Pagination plug-in methods.
73713                  *
73714                  * Each entry in this object is a function and defines which buttons should
73715                  * be shown by the pagination rendering method that is used for the table:
73716                  * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the
73717                  * buttons are displayed in the document, while the functions here tell it
73718                  * what buttons to display. This is done by returning an array of button
73719                  * descriptions (what each button will do).
73720                  *
73721                  * Pagination types (the four built in options and any additional plug-in
73722                  * options defined here) can be used through the `paginationType`
73723                  * initialisation parameter.
73724                  *
73725                  * The functions defined take two parameters:
73726                  *
73727                  * 1. `{int} page` The current page index
73728                  * 2. `{int} pages` The number of pages in the table
73729                  *
73730                  * Each function is expected to return an array where each element of the
73731                  * array can be one of:
73732                  *
73733                  * * `first` - Jump to first page when activated
73734                  * * `last` - Jump to last page when activated
73735                  * * `previous` - Show previous page when activated
73736                  * * `next` - Show next page when activated
73737                  * * `{int}` - Show page of the index given
73738                  * * `{array}` - A nested array containing the above elements to add a
73739                  *   containing 'DIV' element (might be useful for styling).
73740                  *
73741                  * Note that DataTables v1.9- used this object slightly differently whereby
73742                  * an object with two functions would be defined for each plug-in. That
73743                  * ability is still supported by DataTables 1.10+ to provide backwards
73744                  * compatibility, but this option of use is now decremented and no longer
73745                  * documented in DataTables 1.10+.
73746                  *
73747                  *  @type object
73748                  *  @default {}
73749                  *
73750                  *  @example
73751                  *    // Show previous, next and current page buttons only
73752                  *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {
73753                  *      return [ 'previous', page, 'next' ];
73754                  *    };
73755                  */
73756                 pager: {},
73759                 renderer: {
73760                         pageButton: {},
73761                         header: {}
73762                 },
73765                 /**
73766                  * Ordering plug-ins - custom data source
73767                  *
73768                  * The extension options for ordering of data available here is complimentary
73769                  * to the default type based ordering that DataTables typically uses. It
73770                  * allows much greater control over the the data that is being used to
73771                  * order a column, but is necessarily therefore more complex.
73772                  *
73773                  * This type of ordering is useful if you want to do ordering based on data
73774                  * live from the DOM (for example the contents of an 'input' element) rather
73775                  * than just the static string that DataTables knows of.
73776                  *
73777                  * The way these plug-ins work is that you create an array of the values you
73778                  * wish to be ordering for the column in question and then return that
73779                  * array. The data in the array much be in the index order of the rows in
73780                  * the table (not the currently ordering order!). Which order data gathering
73781                  * function is run here depends on the `dt-init columns.orderDataType`
73782                  * parameter that is used for the column (if any).
73783                  *
73784                  * The functions defined take two parameters:
73785                  *
73786                  * 1. `{object}` DataTables settings object: see
73787                  *    {@link DataTable.models.oSettings}
73788                  * 2. `{int}` Target column index
73789                  *
73790                  * Each function is expected to return an array:
73791                  *
73792                  * * `{array}` Data for the column to be ordering upon
73793                  *
73794                  *  @type array
73795                  *
73796                  *  @example
73797                  *    // Ordering using `input` node values
73798                  *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )
73799                  *    {
73800                  *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {
73801                  *        return $('input', td).val();
73802                  *      } );
73803                  *    }
73804                  */
73805                 order: {},
73808                 /**
73809                  * Type based plug-ins.
73810                  *
73811                  * Each column in DataTables has a type assigned to it, either by automatic
73812                  * detection or by direct assignment using the `type` option for the column.
73813                  * The type of a column will effect how it is ordering and search (plug-ins
73814                  * can also make use of the column type if required).
73815                  *
73816                  * @namespace
73817                  */
73818                 type: {
73819                         /**
73820                          * Type detection functions.
73821                          *
73822                          * The functions defined in this object are used to automatically detect
73823                          * a column's type, making initialisation of DataTables super easy, even
73824                          * when complex data is in the table.
73825                          *
73826                          * The functions defined take two parameters:
73827                          *
73828                      *  1. `{*}` Data from the column cell to be analysed
73829                      *  2. `{settings}` DataTables settings object. This can be used to
73830                      *     perform context specific type detection - for example detection
73831                      *     based on language settings such as using a comma for a decimal
73832                      *     place. Generally speaking the options from the settings will not
73833                      *     be required
73834                          *
73835                          * Each function is expected to return:
73836                          *
73837                          * * `{string|null}` Data type detected, or null if unknown (and thus
73838                          *   pass it on to the other type detection functions.
73839                          *
73840                          *  @type array
73841                          *
73842                          *  @example
73843                          *    // Currency type detection plug-in:
73844                          *    $.fn.dataTable.ext.type.detect.push(
73845                          *      function ( data, settings ) {
73846                          *        // Check the numeric part
73847                          *        if ( ! data.substring(1).match(/[0-9]/) ) {
73848                          *          return null;
73849                          *        }
73850                          *
73851                          *        // Check prefixed by currency
73852                          *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {
73853                          *          return 'currency';
73854                          *        }
73855                          *        return null;
73856                          *      }
73857                          *    );
73858                          */
73859                         detect: [],
73862                         /**
73863                          * Type based search formatting.
73864                          *
73865                          * The type based searching functions can be used to pre-format the
73866                          * data to be search on. For example, it can be used to strip HTML
73867                          * tags or to de-format telephone numbers for numeric only searching.
73868                          *
73869                          * Note that is a search is not defined for a column of a given type,
73870                          * no search formatting will be performed.
73871                          *
73872                          * Pre-processing of searching data plug-ins - When you assign the sType
73873                          * for a column (or have it automatically detected for you by DataTables
73874                          * or a type detection plug-in), you will typically be using this for
73875                          * custom sorting, but it can also be used to provide custom searching
73876                          * by allowing you to pre-processing the data and returning the data in
73877                          * the format that should be searched upon. This is done by adding
73878                          * functions this object with a parameter name which matches the sType
73879                          * for that target column. This is the corollary of <i>afnSortData</i>
73880                          * for searching data.
73881                          *
73882                          * The functions defined take a single parameter:
73883                          *
73884                      *  1. `{*}` Data from the column cell to be prepared for searching
73885                          *
73886                          * Each function is expected to return:
73887                          *
73888                          * * `{string|null}` Formatted string that will be used for the searching.
73889                          *
73890                          *  @type object
73891                          *  @default {}
73892                          *
73893                          *  @example
73894                          *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {
73895                          *      return d.replace(/\n/g," ").replace( /<.*?>/g, "" );
73896                          *    }
73897                          */
73898                         search: {},
73901                         /**
73902                          * Type based ordering.
73903                          *
73904                          * The column type tells DataTables what ordering to apply to the table
73905                          * when a column is sorted upon. The order for each type that is defined,
73906                          * is defined by the functions available in this object.
73907                          *
73908                          * Each ordering option can be described by three properties added to
73909                          * this object:
73910                          *
73911                          * * `{type}-pre` - Pre-formatting function
73912                          * * `{type}-asc` - Ascending order function
73913                          * * `{type}-desc` - Descending order function
73914                          *
73915                          * All three can be used together, only `{type}-pre` or only
73916                          * `{type}-asc` and `{type}-desc` together. It is generally recommended
73917                          * that only `{type}-pre` is used, as this provides the optimal
73918                          * implementation in terms of speed, although the others are provided
73919                          * for compatibility with existing Javascript sort functions.
73920                          *
73921                          * `{type}-pre`: Functions defined take a single parameter:
73922                          *
73923                      *  1. `{*}` Data from the column cell to be prepared for ordering
73924                          *
73925                          * And return:
73926                          *
73927                          * * `{*}` Data to be sorted upon
73928                          *
73929                          * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort
73930                          * functions, taking two parameters:
73931                          *
73932                      *  1. `{*}` Data to compare to the second parameter
73933                      *  2. `{*}` Data to compare to the first parameter
73934                          *
73935                          * And returning:
73936                          *
73937                          * * `{*}` Ordering match: <0 if first parameter should be sorted lower
73938                          *   than the second parameter, ===0 if the two parameters are equal and
73939                          *   >0 if the first parameter should be sorted height than the second
73940                          *   parameter.
73941                          *
73942                          *  @type object
73943                          *  @default {}
73944                          *
73945                          *  @example
73946                          *    // Numeric ordering of formatted numbers with a pre-formatter
73947                          *    $.extend( $.fn.dataTable.ext.type.order, {
73948                          *      "string-pre": function(x) {
73949                          *        a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" );
73950                          *        return parseFloat( a );
73951                          *      }
73952                          *    } );
73953                          *
73954                          *  @example
73955                          *    // Case-sensitive string ordering, with no pre-formatting method
73956                          *    $.extend( $.fn.dataTable.ext.order, {
73957                          *      "string-case-asc": function(x,y) {
73958                          *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
73959                          *      },
73960                          *      "string-case-desc": function(x,y) {
73961                          *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
73962                          *      }
73963                          *    } );
73964                          */
73965                         order: {}
73966                 },
73968                 /**
73969                  * Unique DataTables instance counter
73970                  *
73971                  * @type int
73972                  * @private
73973                  */
73974                 _unique: 0,
73977                 //
73978                 // Depreciated
73979                 // The following properties are retained for backwards compatiblity only.
73980                 // The should not be used in new projects and will be removed in a future
73981                 // version
73982                 //
73984                 /**
73985                  * Version check function.
73986                  *  @type function
73987                  *  @depreciated Since 1.10
73988                  */
73989                 fnVersionCheck: DataTable.fnVersionCheck,
73992                 /**
73993                  * Index for what 'this' index API functions should use
73994                  *  @type int
73995                  *  @deprecated Since v1.10
73996                  */
73997                 iApiIndex: 0,
74000                 /**
74001                  * jQuery UI class container
74002                  *  @type object
74003                  *  @deprecated Since v1.10
74004                  */
74005                 oJUIClasses: {},
74008                 /**
74009                  * Software version
74010                  *  @type string
74011                  *  @deprecated Since v1.10
74012                  */
74013                 sVersion: DataTable.version
74014         };
74017         //
74018         // Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts
74019         //
74020         $.extend( _ext, {
74021                 afnFiltering: _ext.search,
74022                 aTypes:       _ext.type.detect,
74023                 ofnSearch:    _ext.type.search,
74024                 oSort:        _ext.type.order,
74025                 afnSortData:  _ext.order,
74026                 aoFeatures:   _ext.feature,
74027                 oApi:         _ext.internal,
74028                 oStdClasses:  _ext.classes,
74029                 oPagination:  _ext.pager
74030         } );
74033         $.extend( DataTable.ext.classes, {
74034                 "sTable": "dataTable",
74035                 "sNoFooter": "no-footer",
74037                 /* Paging buttons */
74038                 "sPageButton": "paginate_button",
74039                 "sPageButtonActive": "current",
74040                 "sPageButtonDisabled": "disabled",
74042                 /* Striping classes */
74043                 "sStripeOdd": "odd",
74044                 "sStripeEven": "even",
74046                 /* Empty row */
74047                 "sRowEmpty": "dataTables_empty",
74049                 /* Features */
74050                 "sWrapper": "dataTables_wrapper",
74051                 "sFilter": "dataTables_filter",
74052                 "sInfo": "dataTables_info",
74053                 "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
74054                 "sLength": "dataTables_length",
74055                 "sProcessing": "dataTables_processing",
74057                 /* Sorting */
74058                 "sSortAsc": "sorting_asc",
74059                 "sSortDesc": "sorting_desc",
74060                 "sSortable": "sorting", /* Sortable in both directions */
74061                 "sSortableAsc": "sorting_asc_disabled",
74062                 "sSortableDesc": "sorting_desc_disabled",
74063                 "sSortableNone": "sorting_disabled",
74064                 "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
74066                 /* Filtering */
74067                 "sFilterInput": "",
74069                 /* Page length */
74070                 "sLengthSelect": "",
74072                 /* Scrolling */
74073                 "sScrollWrapper": "dataTables_scroll",
74074                 "sScrollHead": "dataTables_scrollHead",
74075                 "sScrollHeadInner": "dataTables_scrollHeadInner",
74076                 "sScrollBody": "dataTables_scrollBody",
74077                 "sScrollFoot": "dataTables_scrollFoot",
74078                 "sScrollFootInner": "dataTables_scrollFootInner",
74080                 /* Misc */
74081                 "sHeaderTH": "",
74082                 "sFooterTH": "",
74084                 // Deprecated
74085                 "sSortJUIAsc": "",
74086                 "sSortJUIDesc": "",
74087                 "sSortJUI": "",
74088                 "sSortJUIAscAllowed": "",
74089                 "sSortJUIDescAllowed": "",
74090                 "sSortJUIWrapper": "",
74091                 "sSortIcon": "",
74092                 "sJUIHeader": "",
74093                 "sJUIFooter": ""
74094         } );
74097         var extPagination = DataTable.ext.pager;
74099         function _numbers ( page, pages ) {
74100                 var
74101                         numbers = [],
74102                         buttons = extPagination.numbers_length,
74103                         half = Math.floor( buttons / 2 ),
74104                         i = 1;
74106                 if ( pages <= buttons ) {
74107                         numbers = _range( 0, pages );
74108                 }
74109                 else if ( page <= half ) {
74110                         numbers = _range( 0, buttons-2 );
74111                         numbers.push( 'ellipsis' );
74112                         numbers.push( pages-1 );
74113                 }
74114                 else if ( page >= pages - 1 - half ) {
74115                         numbers = _range( pages-(buttons-2), pages );
74116                         numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6
74117                         numbers.splice( 0, 0, 0 );
74118                 }
74119                 else {
74120                         numbers = _range( page-half+2, page+half-1 );
74121                         numbers.push( 'ellipsis' );
74122                         numbers.push( pages-1 );
74123                         numbers.splice( 0, 0, 'ellipsis' );
74124                         numbers.splice( 0, 0, 0 );
74125                 }
74127                 numbers.DT_el = 'span';
74128                 return numbers;
74129         }
74132         $.extend( extPagination, {
74133                 simple: function ( page, pages ) {
74134                         return [ 'previous', 'next' ];
74135                 },
74137                 full: function ( page, pages ) {
74138                         return [  'first', 'previous', 'next', 'last' ];
74139                 },
74141                 numbers: function ( page, pages ) {
74142                         return [ _numbers(page, pages) ];
74143                 },
74145                 simple_numbers: function ( page, pages ) {
74146                         return [ 'previous', _numbers(page, pages), 'next' ];
74147                 },
74149                 full_numbers: function ( page, pages ) {
74150                         return [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];
74151                 },
74153                 first_last_numbers: function (page, pages) {
74154                         return ['first', _numbers(page, pages), 'last'];
74155                 },
74157                 // For testing and plug-ins to use
74158                 _numbers: _numbers,
74160                 // Number of number buttons (including ellipsis) to show. _Must be odd!_
74161                 numbers_length: 7
74162         } );
74165         $.extend( true, DataTable.ext.renderer, {
74166                 pageButton: {
74167                         _: function ( settings, host, idx, buttons, page, pages ) {
74168                                 var classes = settings.oClasses;
74169                                 var lang = settings.oLanguage.oPaginate;
74170                                 var aria = settings.oLanguage.oAria.paginate || {};
74171                                 var btnDisplay, btnClass, counter=0;
74173                                 var attach = function( container, buttons ) {
74174                                         var i, ien, node, button;
74175                                         var clickHandler = function ( e ) {
74176                                                 _fnPageChange( settings, e.data.action, true );
74177                                         };
74179                                         for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
74180                                                 button = buttons[i];
74182                                                 if ( $.isArray( button ) ) {
74183                                                         var inner = $( '<'+(button.DT_el || 'div')+'/>' )
74184                                                                 .appendTo( container );
74185                                                         attach( inner, button );
74186                                                 }
74187                                                 else {
74188                                                         btnDisplay = null;
74189                                                         btnClass = '';
74191                                                         switch ( button ) {
74192                                                                 case 'ellipsis':
74193                                                                         container.append('<span class="ellipsis">&#x2026;</span>');
74194                                                                         break;
74196                                                                 case 'first':
74197                                                                         btnDisplay = lang.sFirst;
74198                                                                         btnClass = button + (page > 0 ?
74199                                                                                 '' : ' '+classes.sPageButtonDisabled);
74200                                                                         break;
74202                                                                 case 'previous':
74203                                                                         btnDisplay = lang.sPrevious;
74204                                                                         btnClass = button + (page > 0 ?
74205                                                                                 '' : ' '+classes.sPageButtonDisabled);
74206                                                                         break;
74208                                                                 case 'next':
74209                                                                         btnDisplay = lang.sNext;
74210                                                                         btnClass = button + (page < pages-1 ?
74211                                                                                 '' : ' '+classes.sPageButtonDisabled);
74212                                                                         break;
74214                                                                 case 'last':
74215                                                                         btnDisplay = lang.sLast;
74216                                                                         btnClass = button + (page < pages-1 ?
74217                                                                                 '' : ' '+classes.sPageButtonDisabled);
74218                                                                         break;
74220                                                                 default:
74221                                                                         btnDisplay = button + 1;
74222                                                                         btnClass = page === button ?
74223                                                                                 classes.sPageButtonActive : '';
74224                                                                         break;
74225                                                         }
74227                                                         if ( btnDisplay !== null ) {
74228                                                                 node = $('<a>', {
74229                                                                                 'class': classes.sPageButton+' '+btnClass,
74230                                                                                 'aria-controls': settings.sTableId,
74231                                                                                 'aria-label': aria[ button ],
74232                                                                                 'data-dt-idx': counter,
74233                                                                                 'tabindex': settings.iTabIndex,
74234                                                                                 'id': idx === 0 && typeof button === 'string' ?
74235                                                                                         settings.sTableId +'_'+ button :
74236                                                                                         null
74237                                                                         } )
74238                                                                         .html( btnDisplay )
74239                                                                         .appendTo( container );
74241                                                                 _fnBindAction(
74242                                                                         node, {action: button}, clickHandler
74243                                                                 );
74245                                                                 counter++;
74246                                                         }
74247                                                 }
74248                                         }
74249                                 };
74251                                 // IE9 throws an 'unknown error' if document.activeElement is used
74252                                 // inside an iframe or frame. Try / catch the error. Not good for
74253                                 // accessibility, but neither are frames.
74254                                 var activeEl;
74256                                 try {
74257                                         // Because this approach is destroying and recreating the paging
74258                                         // elements, focus is lost on the select button which is bad for
74259                                         // accessibility. So we want to restore focus once the draw has
74260                                         // completed
74261                                         activeEl = $(host).find(document.activeElement).data('dt-idx');
74262                                 }
74263                                 catch (e) {}
74265                                 attach( $(host).empty(), buttons );
74267                                 if ( activeEl !== undefined ) {
74268                                         $(host).find( '[data-dt-idx='+activeEl+']' ).focus();
74269                                 }
74270                         }
74271                 }
74272         } );
74276         // Built in type detection. See model.ext.aTypes for information about
74277         // what is required from this methods.
74278         $.extend( DataTable.ext.type.detect, [
74279                 // Plain numbers - first since V8 detects some plain numbers as dates
74280                 // e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).
74281                 function ( d, settings )
74282                 {
74283                         var decimal = settings.oLanguage.sDecimal;
74284                         return _isNumber( d, decimal ) ? 'num'+decimal : null;
74285                 },
74287                 // Dates (only those recognised by the browser's Date.parse)
74288                 function ( d, settings )
74289                 {
74290                         // V8 tries _very_ hard to make a string passed into `Date.parse()`
74291                         // valid, so we need to use a regex to restrict date formats. Use a
74292                         // plug-in for anything other than ISO8601 style strings
74293                         if ( d && !(d instanceof Date) && ! _re_date.test(d) ) {
74294                                 return null;
74295                         }
74296                         var parsed = Date.parse(d);
74297                         return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;
74298                 },
74300                 // Formatted numbers
74301                 function ( d, settings )
74302                 {
74303                         var decimal = settings.oLanguage.sDecimal;
74304                         return _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;
74305                 },
74307                 // HTML numeric
74308                 function ( d, settings )
74309                 {
74310                         var decimal = settings.oLanguage.sDecimal;
74311                         return _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;
74312                 },
74314                 // HTML numeric, formatted
74315                 function ( d, settings )
74316                 {
74317                         var decimal = settings.oLanguage.sDecimal;
74318                         return _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;
74319                 },
74321                 // HTML (this is strict checking - there must be html)
74322                 function ( d, settings )
74323                 {
74324                         return _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?
74325                                 'html' : null;
74326                 }
74327         ] );
74331         // Filter formatting functions. See model.ext.ofnSearch for information about
74332         // what is required from these methods.
74333         //
74334         // Note that additional search methods are added for the html numbers and
74335         // html formatted numbers by `_addNumericSort()` when we know what the decimal
74336         // place is
74339         $.extend( DataTable.ext.type.search, {
74340                 html: function ( data ) {
74341                         return _empty(data) ?
74342                                 data :
74343                                 typeof data === 'string' ?
74344                                         data
74345                                                 .replace( _re_new_lines, " " )
74346                                                 .replace( _re_html, "" ) :
74347                                         '';
74348                 },
74350                 string: function ( data ) {
74351                         return _empty(data) ?
74352                                 data :
74353                                 typeof data === 'string' ?
74354                                         data.replace( _re_new_lines, " " ) :
74355                                         data;
74356                 }
74357         } );
74361         var __numericReplace = function ( d, decimalPlace, re1, re2 ) {
74362                 if ( d !== 0 && (!d || d === '-') ) {
74363                         return -Infinity;
74364                 }
74366                 // If a decimal place other than `.` is used, it needs to be given to the
74367                 // function so we can detect it and replace with a `.` which is the only
74368                 // decimal place Javascript recognises - it is not locale aware.
74369                 if ( decimalPlace ) {
74370                         d = _numToDecimal( d, decimalPlace );
74371                 }
74373                 if ( d.replace ) {
74374                         if ( re1 ) {
74375                                 d = d.replace( re1, '' );
74376                         }
74378                         if ( re2 ) {
74379                                 d = d.replace( re2, '' );
74380                         }
74381                 }
74383                 return d * 1;
74384         };
74387         // Add the numeric 'deformatting' functions for sorting and search. This is done
74388         // in a function to provide an easy ability for the language options to add
74389         // additional methods if a non-period decimal place is used.
74390         function _addNumericSort ( decimalPlace ) {
74391                 $.each(
74392                         {
74393                                 // Plain numbers
74394                                 "num": function ( d ) {
74395                                         return __numericReplace( d, decimalPlace );
74396                                 },
74398                                 // Formatted numbers
74399                                 "num-fmt": function ( d ) {
74400                                         return __numericReplace( d, decimalPlace, _re_formatted_numeric );
74401                                 },
74403                                 // HTML numeric
74404                                 "html-num": function ( d ) {
74405                                         return __numericReplace( d, decimalPlace, _re_html );
74406                                 },
74408                                 // HTML numeric, formatted
74409                                 "html-num-fmt": function ( d ) {
74410                                         return __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );
74411                                 }
74412                         },
74413                         function ( key, fn ) {
74414                                 // Add the ordering method
74415                                 _ext.type.order[ key+decimalPlace+'-pre' ] = fn;
74417                                 // For HTML types add a search formatter that will strip the HTML
74418                                 if ( key.match(/^html\-/) ) {
74419                                         _ext.type.search[ key+decimalPlace ] = _ext.type.search.html;
74420                                 }
74421                         }
74422                 );
74423         }
74426         // Default sort methods
74427         $.extend( _ext.type.order, {
74428                 // Dates
74429                 "date-pre": function ( d ) {
74430                         var ts = Date.parse( d );
74431                         return isNaN(ts) ? -Infinity : ts;
74432                 },
74434                 // html
74435                 "html-pre": function ( a ) {
74436                         return _empty(a) ?
74437                                 '' :
74438                                 a.replace ?
74439                                         a.replace( /<.*?>/g, "" ).toLowerCase() :
74440                                         a+'';
74441                 },
74443                 // string
74444                 "string-pre": function ( a ) {
74445                         // This is a little complex, but faster than always calling toString,
74446                         // http://jsperf.com/tostring-v-check
74447                         return _empty(a) ?
74448                                 '' :
74449                                 typeof a === 'string' ?
74450                                         a.toLowerCase() :
74451                                         ! a.toString ?
74452                                                 '' :
74453                                                 a.toString();
74454                 },
74456                 // string-asc and -desc are retained only for compatibility with the old
74457                 // sort methods
74458                 "string-asc": function ( x, y ) {
74459                         return ((x < y) ? -1 : ((x > y) ? 1 : 0));
74460                 },
74462                 "string-desc": function ( x, y ) {
74463                         return ((x < y) ? 1 : ((x > y) ? -1 : 0));
74464                 }
74465         } );
74468         // Numeric sorting types - order doesn't matter here
74469         _addNumericSort( '' );
74472         $.extend( true, DataTable.ext.renderer, {
74473                 header: {
74474                         _: function ( settings, cell, column, classes ) {
74475                                 // No additional mark-up required
74476                                 // Attach a sort listener to update on sort - note that using the
74477                                 // `DT` namespace will allow the event to be removed automatically
74478                                 // on destroy, while the `dt` namespaced event is the one we are
74479                                 // listening for
74480                                 $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
74481                                         if ( settings !== ctx ) { // need to check this this is the host
74482                                                 return;               // table, not a nested one
74483                                         }
74485                                         var colIdx = column.idx;
74487                                         cell
74488                                                 .removeClass(
74489                                                         column.sSortingClass +' '+
74490                                                         classes.sSortAsc +' '+
74491                                                         classes.sSortDesc
74492                                                 )
74493                                                 .addClass( columns[ colIdx ] == 'asc' ?
74494                                                         classes.sSortAsc : columns[ colIdx ] == 'desc' ?
74495                                                                 classes.sSortDesc :
74496                                                                 column.sSortingClass
74497                                                 );
74498                                 } );
74499                         },
74501                         jqueryui: function ( settings, cell, column, classes ) {
74502                                 $('<div/>')
74503                                         .addClass( classes.sSortJUIWrapper )
74504                                         .append( cell.contents() )
74505                                         .append( $('<span/>')
74506                                                 .addClass( classes.sSortIcon+' '+column.sSortingClassJUI )
74507                                         )
74508                                         .appendTo( cell );
74510                                 // Attach a sort listener to update on sort
74511                                 $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
74512                                         if ( settings !== ctx ) {
74513                                                 return;
74514                                         }
74516                                         var colIdx = column.idx;
74518                                         cell
74519                                                 .removeClass( classes.sSortAsc +" "+classes.sSortDesc )
74520                                                 .addClass( columns[ colIdx ] == 'asc' ?
74521                                                         classes.sSortAsc : columns[ colIdx ] == 'desc' ?
74522                                                                 classes.sSortDesc :
74523                                                                 column.sSortingClass
74524                                                 );
74526                                         cell
74527                                                 .find( 'span.'+classes.sSortIcon )
74528                                                 .removeClass(
74529                                                         classes.sSortJUIAsc +" "+
74530                                                         classes.sSortJUIDesc +" "+
74531                                                         classes.sSortJUI +" "+
74532                                                         classes.sSortJUIAscAllowed +" "+
74533                                                         classes.sSortJUIDescAllowed
74534                                                 )
74535                                                 .addClass( columns[ colIdx ] == 'asc' ?
74536                                                         classes.sSortJUIAsc : columns[ colIdx ] == 'desc' ?
74537                                                                 classes.sSortJUIDesc :
74538                                                                 column.sSortingClassJUI
74539                                                 );
74540                                 } );
74541                         }
74542                 }
74543         } );
74545         /*
74546          * Public helper functions. These aren't used internally by DataTables, or
74547          * called by any of the options passed into DataTables, but they can be used
74548          * externally by developers working with DataTables. They are helper functions
74549          * to make working with DataTables a little bit easier.
74550          */
74552         var __htmlEscapeEntities = function ( d ) {
74553                 return typeof d === 'string' ?
74554                         d.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;') :
74555                         d;
74556         };
74558         /**
74559          * Helpers for `columns.render`.
74560          *
74561          * The options defined here can be used with the `columns.render` initialisation
74562          * option to provide a display renderer. The following functions are defined:
74563          *
74564          * * `number` - Will format numeric data (defined by `columns.data`) for
74565          *   display, retaining the original unformatted data for sorting and filtering.
74566          *   It takes 5 parameters:
74567          *   * `string` - Thousands grouping separator
74568          *   * `string` - Decimal point indicator
74569          *   * `integer` - Number of decimal points to show
74570          *   * `string` (optional) - Prefix.
74571          *   * `string` (optional) - Postfix (/suffix).
74572          * * `text` - Escape HTML to help prevent XSS attacks. It has no optional
74573          *   parameters.
74574          *
74575          * @example
74576          *   // Column definition using the number renderer
74577          *   {
74578          *     data: "salary",
74579          *     render: $.fn.dataTable.render.number( '\'', '.', 0, '$' )
74580          *   }
74581          *
74582          * @namespace
74583          */
74584         DataTable.render = {
74585                 number: function ( thousands, decimal, precision, prefix, postfix ) {
74586                         return {
74587                                 display: function ( d ) {
74588                                         if ( typeof d !== 'number' && typeof d !== 'string' ) {
74589                                                 return d;
74590                                         }
74592                                         var negative = d < 0 ? '-' : '';
74593                                         var flo = parseFloat( d );
74595                                         // If NaN then there isn't much formatting that we can do - just
74596                                         // return immediately, escaping any HTML (this was supposed to
74597                                         // be a number after all)
74598                                         if ( isNaN( flo ) ) {
74599                                                 return __htmlEscapeEntities( d );
74600                                         }
74602                                         flo = flo.toFixed( precision );
74603                                         d = Math.abs( flo );
74605                                         var intPart = parseInt( d, 10 );
74606                                         var floatPart = precision ?
74607                                                 decimal+(d - intPart).toFixed( precision ).substring( 2 ):
74608                                                 '';
74610                                         return negative + (prefix||'') +
74611                                                 intPart.toString().replace(
74612                                                         /\B(?=(\d{3})+(?!\d))/g, thousands
74613                                                 ) +
74614                                                 floatPart +
74615                                                 (postfix||'');
74616                                 }
74617                         };
74618                 },
74620                 text: function () {
74621                         return {
74622                                 display: __htmlEscapeEntities
74623                         };
74624                 }
74625         };
74628         /*
74629          * This is really a good bit rubbish this method of exposing the internal methods
74630          * publicly... - To be fixed in 2.0 using methods on the prototype
74631          */
74634         /**
74635          * Create a wrapper function for exporting an internal functions to an external API.
74636          *  @param {string} fn API function name
74637          *  @returns {function} wrapped function
74638          *  @memberof DataTable#internal
74639          */
74640         function _fnExternApiFunc (fn)
74641         {
74642                 return function() {
74643                         var args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(
74644                                 Array.prototype.slice.call(arguments)
74645                         );
74646                         return DataTable.ext.internal[fn].apply( this, args );
74647                 };
74648         }
74651         /**
74652          * Reference to internal functions for use by plug-in developers. Note that
74653          * these methods are references to internal functions and are considered to be
74654          * private. If you use these methods, be aware that they are liable to change
74655          * between versions.
74656          *  @namespace
74657          */
74658         $.extend( DataTable.ext.internal, {
74659                 _fnExternApiFunc: _fnExternApiFunc,
74660                 _fnBuildAjax: _fnBuildAjax,
74661                 _fnAjaxUpdate: _fnAjaxUpdate,
74662                 _fnAjaxParameters: _fnAjaxParameters,
74663                 _fnAjaxUpdateDraw: _fnAjaxUpdateDraw,
74664                 _fnAjaxDataSrc: _fnAjaxDataSrc,
74665                 _fnAddColumn: _fnAddColumn,
74666                 _fnColumnOptions: _fnColumnOptions,
74667                 _fnAdjustColumnSizing: _fnAdjustColumnSizing,
74668                 _fnVisibleToColumnIndex: _fnVisibleToColumnIndex,
74669                 _fnColumnIndexToVisible: _fnColumnIndexToVisible,
74670                 _fnVisbleColumns: _fnVisbleColumns,
74671                 _fnGetColumns: _fnGetColumns,
74672                 _fnColumnTypes: _fnColumnTypes,
74673                 _fnApplyColumnDefs: _fnApplyColumnDefs,
74674                 _fnHungarianMap: _fnHungarianMap,
74675                 _fnCamelToHungarian: _fnCamelToHungarian,
74676                 _fnLanguageCompat: _fnLanguageCompat,
74677                 _fnBrowserDetect: _fnBrowserDetect,
74678                 _fnAddData: _fnAddData,
74679                 _fnAddTr: _fnAddTr,
74680                 _fnNodeToDataIndex: _fnNodeToDataIndex,
74681                 _fnNodeToColumnIndex: _fnNodeToColumnIndex,
74682                 _fnGetCellData: _fnGetCellData,
74683                 _fnSetCellData: _fnSetCellData,
74684                 _fnSplitObjNotation: _fnSplitObjNotation,
74685                 _fnGetObjectDataFn: _fnGetObjectDataFn,
74686                 _fnSetObjectDataFn: _fnSetObjectDataFn,
74687                 _fnGetDataMaster: _fnGetDataMaster,
74688                 _fnClearTable: _fnClearTable,
74689                 _fnDeleteIndex: _fnDeleteIndex,
74690                 _fnInvalidate: _fnInvalidate,
74691                 _fnGetRowElements: _fnGetRowElements,
74692                 _fnCreateTr: _fnCreateTr,
74693                 _fnBuildHead: _fnBuildHead,
74694                 _fnDrawHead: _fnDrawHead,
74695                 _fnDraw: _fnDraw,
74696                 _fnReDraw: _fnReDraw,
74697                 _fnAddOptionsHtml: _fnAddOptionsHtml,
74698                 _fnDetectHeader: _fnDetectHeader,
74699                 _fnGetUniqueThs: _fnGetUniqueThs,
74700                 _fnFeatureHtmlFilter: _fnFeatureHtmlFilter,
74701                 _fnFilterComplete: _fnFilterComplete,
74702                 _fnFilterCustom: _fnFilterCustom,
74703                 _fnFilterColumn: _fnFilterColumn,
74704                 _fnFilter: _fnFilter,
74705                 _fnFilterCreateSearch: _fnFilterCreateSearch,
74706                 _fnEscapeRegex: _fnEscapeRegex,
74707                 _fnFilterData: _fnFilterData,
74708                 _fnFeatureHtmlInfo: _fnFeatureHtmlInfo,
74709                 _fnUpdateInfo: _fnUpdateInfo,
74710                 _fnInfoMacros: _fnInfoMacros,
74711                 _fnInitialise: _fnInitialise,
74712                 _fnInitComplete: _fnInitComplete,
74713                 _fnLengthChange: _fnLengthChange,
74714                 _fnFeatureHtmlLength: _fnFeatureHtmlLength,
74715                 _fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,
74716                 _fnPageChange: _fnPageChange,
74717                 _fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,
74718                 _fnProcessingDisplay: _fnProcessingDisplay,
74719                 _fnFeatureHtmlTable: _fnFeatureHtmlTable,
74720                 _fnScrollDraw: _fnScrollDraw,
74721                 _fnApplyToChildren: _fnApplyToChildren,
74722                 _fnCalculateColumnWidths: _fnCalculateColumnWidths,
74723                 _fnThrottle: _fnThrottle,
74724                 _fnConvertToWidth: _fnConvertToWidth,
74725                 _fnGetWidestNode: _fnGetWidestNode,
74726                 _fnGetMaxLenString: _fnGetMaxLenString,
74727                 _fnStringToCss: _fnStringToCss,
74728                 _fnSortFlatten: _fnSortFlatten,
74729                 _fnSort: _fnSort,
74730                 _fnSortAria: _fnSortAria,
74731                 _fnSortListener: _fnSortListener,
74732                 _fnSortAttachListener: _fnSortAttachListener,
74733                 _fnSortingClasses: _fnSortingClasses,
74734                 _fnSortData: _fnSortData,
74735                 _fnSaveState: _fnSaveState,
74736                 _fnLoadState: _fnLoadState,
74737                 _fnSettingsFromNode: _fnSettingsFromNode,
74738                 _fnLog: _fnLog,
74739                 _fnMap: _fnMap,
74740                 _fnBindAction: _fnBindAction,
74741                 _fnCallbackReg: _fnCallbackReg,
74742                 _fnCallbackFire: _fnCallbackFire,
74743                 _fnLengthOverflow: _fnLengthOverflow,
74744                 _fnRenderer: _fnRenderer,
74745                 _fnDataSource: _fnDataSource,
74746                 _fnRowAttributes: _fnRowAttributes,
74747                 _fnExtend: _fnExtend,
74748                 _fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant
74749                                                 // in 1.10, so this dead-end function is
74750                                                 // added to prevent errors
74751         } );
74754         // jQuery access
74755         $.fn.dataTable = DataTable;
74757         // Provide access to the host jQuery object (circular reference)
74758         DataTable.$ = $;
74760         // Legacy aliases
74761         $.fn.dataTableSettings = DataTable.settings;
74762         $.fn.dataTableExt = DataTable.ext;
74764         // With a capital `D` we return a DataTables API instance rather than a
74765         // jQuery object
74766         $.fn.DataTable = function ( opts ) {
74767                 return $(this).dataTable( opts ).api();
74768         };
74770         // All properties that are available to $.fn.dataTable should also be
74771         // available on $.fn.DataTable
74772         $.each( DataTable, function ( prop, val ) {
74773                 $.fn.DataTable[ prop ] = val;
74774         } );
74777         // Information about events fired by DataTables - for documentation.
74778         /**
74779          * Draw event, fired whenever the table is redrawn on the page, at the same
74780          * point as fnDrawCallback. This may be useful for binding events or
74781          * performing calculations when the table is altered at all.
74782          *  @name DataTable#draw.dt
74783          *  @event
74784          *  @param {event} e jQuery event object
74785          *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
74786          */
74788         /**
74789          * Search event, fired when the searching applied to the table (using the
74790          * built-in global search, or column filters) is altered.
74791          *  @name DataTable#search.dt
74792          *  @event
74793          *  @param {event} e jQuery event object
74794          *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
74795          */
74797         /**
74798          * Page change event, fired when the paging of the table is altered.
74799          *  @name DataTable#page.dt
74800          *  @event
74801          *  @param {event} e jQuery event object
74802          *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
74803          */
74805         /**
74806          * Order event, fired when the ordering applied to the table is altered.
74807          *  @name DataTable#order.dt
74808          *  @event
74809          *  @param {event} e jQuery event object
74810          *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
74811          */
74813         /**
74814          * DataTables initialisation complete event, fired when the table is fully
74815          * drawn, including Ajax data loaded, if Ajax data is required.
74816          *  @name DataTable#init.dt
74817          *  @event
74818          *  @param {event} e jQuery event object
74819          *  @param {object} oSettings DataTables settings object
74820          *  @param {object} json The JSON object request from the server - only
74821          *    present if client-side Ajax sourced data is used</li></ol>
74822          */
74824         /**
74825          * State save event, fired when the table has changed state a new state save
74826          * is required. This event allows modification of the state saving object
74827          * prior to actually doing the save, including addition or other state
74828          * properties (for plug-ins) or modification of a DataTables core property.
74829          *  @name DataTable#stateSaveParams.dt
74830          *  @event
74831          *  @param {event} e jQuery event object
74832          *  @param {object} oSettings DataTables settings object
74833          *  @param {object} json The state information to be saved
74834          */
74836         /**
74837          * State load event, fired when the table is loading state from the stored
74838          * data, but prior to the settings object being modified by the saved state
74839          * - allowing modification of the saved state is required or loading of
74840          * state for a plug-in.
74841          *  @name DataTable#stateLoadParams.dt
74842          *  @event
74843          *  @param {event} e jQuery event object
74844          *  @param {object} oSettings DataTables settings object
74845          *  @param {object} json The saved state information
74846          */
74848         /**
74849          * State loaded event, fired when state has been loaded from stored data and
74850          * the settings object has been modified by the loaded data.
74851          *  @name DataTable#stateLoaded.dt
74852          *  @event
74853          *  @param {event} e jQuery event object
74854          *  @param {object} oSettings DataTables settings object
74855          *  @param {object} json The saved state information
74856          */
74858         /**
74859          * Processing event, fired when DataTables is doing some kind of processing
74860          * (be it, order, searcg or anything else). It can be used to indicate to
74861          * the end user that there is something happening, or that something has
74862          * finished.
74863          *  @name DataTable#processing.dt
74864          *  @event
74865          *  @param {event} e jQuery event object
74866          *  @param {object} oSettings DataTables settings object
74867          *  @param {boolean} bShow Flag for if DataTables is doing processing or not
74868          */
74870         /**
74871          * Ajax (XHR) event, fired whenever an Ajax request is completed from a
74872          * request to made to the server for new data. This event is called before
74873          * DataTables processed the returned data, so it can also be used to pre-
74874          * process the data returned from the server, if needed.
74875          *
74876          * Note that this trigger is called in `fnServerData`, if you override
74877          * `fnServerData` and which to use this event, you need to trigger it in you
74878          * success function.
74879          *  @name DataTable#xhr.dt
74880          *  @event
74881          *  @param {event} e jQuery event object
74882          *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
74883          *  @param {object} json JSON returned from the server
74884          *
74885          *  @example
74886          *     // Use a custom property returned from the server in another DOM element
74887          *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
74888          *       $('#status').html( json.status );
74889          *     } );
74890          *
74891          *  @example
74892          *     // Pre-process the data returned from the server
74893          *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
74894          *       for ( var i=0, ien=json.aaData.length ; i<ien ; i++ ) {
74895          *         json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two;
74896          *       }
74897          *       // Note no return - manipulate the data directly in the JSON object.
74898          *     } );
74899          */
74901         /**
74902          * Destroy event, fired when the DataTable is destroyed by calling fnDestroy
74903          * or passing the bDestroy:true parameter in the initialisation object. This
74904          * can be used to remove bound events, added DOM nodes, etc.
74905          *  @name DataTable#destroy.dt
74906          *  @event
74907          *  @param {event} e jQuery event object
74908          *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
74909          */
74911         /**
74912          * Page length change event, fired when number of records to show on each
74913          * page (the length) is changed.
74914          *  @name DataTable#length.dt
74915          *  @event
74916          *  @param {event} e jQuery event object
74917          *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
74918          *  @param {integer} len New length
74919          */
74921         /**
74922          * Column sizing has changed.
74923          *  @name DataTable#column-sizing.dt
74924          *  @event
74925          *  @param {event} e jQuery event object
74926          *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
74927          */
74929         /**
74930          * Column visibility has changed.
74931          *  @name DataTable#column-visibility.dt
74932          *  @event
74933          *  @param {event} e jQuery event object
74934          *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
74935          *  @param {int} column Column index
74936          *  @param {bool} vis `false` if column now hidden, or `true` if visible
74937          */
74939         return $.fn.dataTable;
74940 }));
74943 /*! Buttons for DataTables 1.5.6
74944  * ©2016-2019 SpryMedia Ltd - datatables.net/license
74945  */
74947 (function( factory ){
74948         if ( typeof define === 'function' && define.amd ) {
74949                 // AMD
74950                 define( ['jquery', 'datatables.net'], function ( $ ) {
74951                         return factory( $, window, document );
74952                 } );
74953         }
74954         else if ( typeof exports === 'object' ) {
74955                 // CommonJS
74956                 module.exports = function (root, $) {
74957                         if ( ! root ) {
74958                                 root = window;
74959                         }
74961                         if ( ! $ || ! $.fn.dataTable ) {
74962                                 $ = require('datatables.net')(root, $).$;
74963                         }
74965                         return factory( $, root, root.document );
74966                 };
74967         }
74968         else {
74969                 // Browser
74970                 factory( jQuery, window, document );
74971         }
74972 }(function( $, window, document, undefined ) {
74973 'use strict';
74974 var DataTable = $.fn.dataTable;
74977 // Used for namespacing events added to the document by each instance, so they
74978 // can be removed on destroy
74979 var _instCounter = 0;
74981 // Button namespacing counter for namespacing events on individual buttons
74982 var _buttonCounter = 0;
74984 var _dtButtons = DataTable.ext.buttons;
74987  * [Buttons description]
74988  * @param {[type]}
74989  * @param {[type]}
74990  */
74991 var Buttons = function( dt, config )
74993         // If not created with a `new` keyword then we return a wrapper function that
74994         // will take the settings object for a DT. This allows easy use of new instances
74995         // with the `layout` option - e.g. `topLeft: $.fn.dataTable.Buttons( ... )`.
74996         if ( !(this instanceof Buttons) ) {
74997                 return function (settings) {
74998                         return new Buttons( settings, dt ).container();
74999                 };
75000         }
75002         // If there is no config set it to an empty object
75003         if ( typeof( config ) === 'undefined' ) {
75004                 config = {};
75005         }
75007         // Allow a boolean true for defaults
75008         if ( config === true ) {
75009                 config = {};
75010         }
75012         // For easy configuration of buttons an array can be given
75013         if ( $.isArray( config ) ) {
75014                 config = { buttons: config };
75015         }
75017         this.c = $.extend( true, {}, Buttons.defaults, config );
75019         // Don't want a deep copy for the buttons
75020         if ( config.buttons ) {
75021                 this.c.buttons = config.buttons;
75022         }
75024         this.s = {
75025                 dt: new DataTable.Api( dt ),
75026                 buttons: [],
75027                 listenKeys: '',
75028                 namespace: 'dtb'+(_instCounter++)
75029         };
75031         this.dom = {
75032                 container: $('<'+this.c.dom.container.tag+'/>')
75033                         .addClass( this.c.dom.container.className )
75034         };
75036         this._constructor();
75040 $.extend( Buttons.prototype, {
75041         /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
75042          * Public methods
75043          */
75045         /**
75046          * Get the action of a button
75047          * @param  {int|string} Button index
75048          * @return {function}
75049          *//**
75050          * Set the action of a button
75051          * @param  {node} node Button element
75052          * @param  {function} action Function to set
75053          * @return {Buttons} Self for chaining
75054          */
75055         action: function ( node, action )
75056         {
75057                 var button = this._nodeToButton( node );
75059                 if ( action === undefined ) {
75060                         return button.conf.action;
75061                 }
75063                 button.conf.action = action;
75065                 return this;
75066         },
75068         /**
75069          * Add an active class to the button to make to look active or get current
75070          * active state.
75071          * @param  {node} node Button element
75072          * @param  {boolean} [flag] Enable / disable flag
75073          * @return {Buttons} Self for chaining or boolean for getter
75074          */
75075         active: function ( node, flag ) {
75076                 var button = this._nodeToButton( node );
75077                 var klass = this.c.dom.button.active;
75078                 var jqNode = $(button.node);
75080                 if ( flag === undefined ) {
75081                         return jqNode.hasClass( klass );
75082                 }
75084                 jqNode.toggleClass( klass, flag === undefined ? true : flag );
75086                 return this;
75087         },
75089         /**
75090          * Add a new button
75091          * @param {object} config Button configuration object, base string name or function
75092          * @param {int|string} [idx] Button index for where to insert the button
75093          * @return {Buttons} Self for chaining
75094          */
75095         add: function ( config, idx )
75096         {
75097                 var buttons = this.s.buttons;
75099                 if ( typeof idx === 'string' ) {
75100                         var split = idx.split('-');
75101                         var base = this.s;
75103                         for ( var i=0, ien=split.length-1 ; i<ien ; i++ ) {
75104                                 base = base.buttons[ split[i]*1 ];
75105                         }
75107                         buttons = base.buttons;
75108                         idx = split[ split.length-1 ]*1;
75109                 }
75111                 this._expandButton( buttons, config, false, idx );
75112                 this._draw();
75114                 return this;
75115         },
75117         /**
75118          * Get the container node for the buttons
75119          * @return {jQuery} Buttons node
75120          */
75121         container: function ()
75122         {
75123                 return this.dom.container;
75124         },
75126         /**
75127          * Disable a button
75128          * @param  {node} node Button node
75129          * @return {Buttons} Self for chaining
75130          */
75131         disable: function ( node ) {
75132                 var button = this._nodeToButton( node );
75134                 $(button.node).addClass( this.c.dom.button.disabled );
75136                 return this;
75137         },
75139         /**
75140          * Destroy the instance, cleaning up event handlers and removing DOM
75141          * elements
75142          * @return {Buttons} Self for chaining
75143          */
75144         destroy: function ()
75145         {
75146                 // Key event listener
75147                 $('body').off( 'keyup.'+this.s.namespace );
75149                 // Individual button destroy (so they can remove their own events if
75150                 // needed). Take a copy as the array is modified by `remove`
75151                 var buttons = this.s.buttons.slice();
75152                 var i, ien;
75154                 for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
75155                         this.remove( buttons[i].node );
75156                 }
75158                 // Container
75159                 this.dom.container.remove();
75161                 // Remove from the settings object collection
75162                 var buttonInsts = this.s.dt.settings()[0];
75164                 for ( i=0, ien=buttonInsts.length ; i<ien ; i++ ) {
75165                         if ( buttonInsts.inst === this ) {
75166                                 buttonInsts.splice( i, 1 );
75167                                 break;
75168                         }
75169                 }
75171                 return this;
75172         },
75174         /**
75175          * Enable / disable a button
75176          * @param  {node} node Button node
75177          * @param  {boolean} [flag=true] Enable / disable flag
75178          * @return {Buttons} Self for chaining
75179          */
75180         enable: function ( node, flag )
75181         {
75182                 if ( flag === false ) {
75183                         return this.disable( node );
75184                 }
75186                 var button = this._nodeToButton( node );
75187                 $(button.node).removeClass( this.c.dom.button.disabled );
75189                 return this;
75190         },
75192         /**
75193          * Get the instance name for the button set selector
75194          * @return {string} Instance name
75195          */
75196         name: function ()
75197         {
75198                 return this.c.name;
75199         },
75201         /**
75202          * Get a button's node of the buttons container if no button is given
75203          * @param  {node} [node] Button node
75204          * @return {jQuery} Button element, or container
75205          */
75206         node: function ( node )
75207         {
75208                 if ( ! node ) {
75209                         return this.dom.container;
75210                 }
75212                 var button = this._nodeToButton( node );
75213                 return $(button.node);
75214         },
75216         /**
75217          * Set / get a processing class on the selected button
75218          * @param  {boolean} flag true to add, false to remove, undefined to get
75219          * @return {boolean|Buttons} Getter value or this if a setter.
75220          */
75221         processing: function ( node, flag )
75222         {
75223                 var button = this._nodeToButton( node );
75225                 if ( flag === undefined ) {
75226                         return $(button.node).hasClass( 'processing' );
75227                 }
75229                 $(button.node).toggleClass( 'processing', flag );
75231                 return this;
75232         },
75234         /**
75235          * Remove a button.
75236          * @param  {node} node Button node
75237          * @return {Buttons} Self for chaining
75238          */
75239         remove: function ( node )
75240         {
75241                 var button = this._nodeToButton( node );
75242                 var host = this._nodeToHost( node );
75243                 var dt = this.s.dt;
75245                 // Remove any child buttons first
75246                 if ( button.buttons.length ) {
75247                         for ( var i=button.buttons.length-1 ; i>=0 ; i-- ) {
75248                                 this.remove( button.buttons[i].node );
75249                         }
75250                 }
75252                 // Allow the button to remove event handlers, etc
75253                 if ( button.conf.destroy ) {
75254                         button.conf.destroy.call( dt.button(node), dt, $(node), button.conf );
75255                 }
75257                 this._removeKey( button.conf );
75259                 $(button.node).remove();
75261                 var idx = $.inArray( button, host );
75262                 host.splice( idx, 1 );
75264                 return this;
75265         },
75267         /**
75268          * Get the text for a button
75269          * @param  {int|string} node Button index
75270          * @return {string} Button text
75271          *//**
75272          * Set the text for a button
75273          * @param  {int|string|function} node Button index
75274          * @param  {string} label Text
75275          * @return {Buttons} Self for chaining
75276          */
75277         text: function ( node, label )
75278         {
75279                 var button = this._nodeToButton( node );
75280                 var buttonLiner = this.c.dom.collection.buttonLiner;
75281                 var linerTag = button.inCollection && buttonLiner && buttonLiner.tag ?
75282                         buttonLiner.tag :
75283                         this.c.dom.buttonLiner.tag;
75284                 var dt = this.s.dt;
75285                 var jqNode = $(button.node);
75286                 var text = function ( opt ) {
75287                         return typeof opt === 'function' ?
75288                                 opt( dt, jqNode, button.conf ) :
75289                                 opt;
75290                 };
75292                 if ( label === undefined ) {
75293                         return text( button.conf.text );
75294                 }
75296                 button.conf.text = label;
75298                 if ( linerTag ) {
75299                         jqNode.children( linerTag ).html( text(label) );
75300                 }
75301                 else {
75302                         jqNode.html( text(label) );
75303                 }
75305                 return this;
75306         },
75309         /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
75310          * Constructor
75311          */
75313         /**
75314          * Buttons constructor
75315          * @private
75316          */
75317         _constructor: function ()
75318         {
75319                 var that = this;
75320                 var dt = this.s.dt;
75321                 var dtSettings = dt.settings()[0];
75322                 var buttons =  this.c.buttons;
75324                 if ( ! dtSettings._buttons ) {
75325                         dtSettings._buttons = [];
75326                 }
75328                 dtSettings._buttons.push( {
75329                         inst: this,
75330                         name: this.c.name
75331                 } );
75333                 for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
75334                         this.add( buttons[i] );
75335                 }
75337                 dt.on( 'destroy', function ( e, settings ) {
75338                         if ( settings === dtSettings ) {
75339                                 that.destroy();
75340                         }
75341                 } );
75343                 // Global key event binding to listen for button keys
75344                 $('body').on( 'keyup.'+this.s.namespace, function ( e ) {
75345                         if ( ! document.activeElement || document.activeElement === document.body ) {
75346                                 // SUse a string of characters for fast lookup of if we need to
75347                                 // handle this
75348                                 var character = String.fromCharCode(e.keyCode).toLowerCase();
75350                                 if ( that.s.listenKeys.toLowerCase().indexOf( character ) !== -1 ) {
75351                                         that._keypress( character, e );
75352                                 }
75353                         }
75354                 } );
75355         },
75358         /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
75359          * Private methods
75360          */
75362         /**
75363          * Add a new button to the key press listener
75364          * @param {object} conf Resolved button configuration object
75365          * @private
75366          */
75367         _addKey: function ( conf )
75368         {
75369                 if ( conf.key ) {
75370                         this.s.listenKeys += $.isPlainObject( conf.key ) ?
75371                                 conf.key.key :
75372                                 conf.key;
75373                 }
75374         },
75376         /**
75377          * Insert the buttons into the container. Call without parameters!
75378          * @param  {node} [container] Recursive only - Insert point
75379          * @param  {array} [buttons] Recursive only - Buttons array
75380          * @private
75381          */
75382         _draw: function ( container, buttons )
75383         {
75384                 if ( ! container ) {
75385                         container = this.dom.container;
75386                         buttons = this.s.buttons;
75387                 }
75389                 container.children().detach();
75391                 for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
75392                         container.append( buttons[i].inserter );
75393                         container.append( ' ' );
75395                         if ( buttons[i].buttons && buttons[i].buttons.length ) {
75396                                 this._draw( buttons[i].collection, buttons[i].buttons );
75397                         }
75398                 }
75399         },
75401         /**
75402          * Create buttons from an array of buttons
75403          * @param  {array} attachTo Buttons array to attach to
75404          * @param  {object} button Button definition
75405          * @param  {boolean} inCollection true if the button is in a collection
75406          * @private
75407          */
75408         _expandButton: function ( attachTo, button, inCollection, attachPoint )
75409         {
75410                 var dt = this.s.dt;
75411                 var buttonCounter = 0;
75412                 var buttons = ! $.isArray( button ) ?
75413                         [ button ] :
75414                         button;
75416                 for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
75417                         var conf = this._resolveExtends( buttons[i] );
75419                         if ( ! conf ) {
75420                                 continue;
75421                         }
75423                         // If the configuration is an array, then expand the buttons at this
75424                         // point
75425                         if ( $.isArray( conf ) ) {
75426                                 this._expandButton( attachTo, conf, inCollection, attachPoint );
75427                                 continue;
75428                         }
75430                         var built = this._buildButton( conf, inCollection );
75431                         if ( ! built ) {
75432                                 continue;
75433                         }
75435                         if ( attachPoint !== undefined ) {
75436                                 attachTo.splice( attachPoint, 0, built );
75437                                 attachPoint++;
75438                         }
75439                         else {
75440                                 attachTo.push( built );
75441                         }
75443                         if ( built.conf.buttons ) {
75444                                 var collectionDom = this.c.dom.collection;
75445                                 built.collection = $('<'+collectionDom.tag+'/>')
75446                                         .addClass( collectionDom.className )
75447                                         .attr( 'role', 'menu' ) ;
75448                                 built.conf._collection = built.collection;
75450                                 this._expandButton( built.buttons, built.conf.buttons, true, attachPoint );
75451                         }
75453                         // init call is made here, rather than buildButton as it needs to
75454                         // be selectable, and for that it needs to be in the buttons array
75455                         if ( conf.init ) {
75456                                 conf.init.call( dt.button( built.node ), dt, $(built.node), conf );
75457                         }
75459                         buttonCounter++;
75460                 }
75461         },
75463         /**
75464          * Create an individual button
75465          * @param  {object} config            Resolved button configuration
75466          * @param  {boolean} inCollection `true` if a collection button
75467          * @return {jQuery} Created button node (jQuery)
75468          * @private
75469          */
75470         _buildButton: function ( config, inCollection )
75471         {
75472                 var buttonDom = this.c.dom.button;
75473                 var linerDom = this.c.dom.buttonLiner;
75474                 var collectionDom = this.c.dom.collection;
75475                 var dt = this.s.dt;
75476                 var text = function ( opt ) {
75477                         return typeof opt === 'function' ?
75478                                 opt( dt, button, config ) :
75479                                 opt;
75480                 };
75482                 if ( inCollection && collectionDom.button ) {
75483                         buttonDom = collectionDom.button;
75484                 }
75486                 if ( inCollection && collectionDom.buttonLiner ) {
75487                         linerDom = collectionDom.buttonLiner;
75488                 }
75490                 // Make sure that the button is available based on whatever requirements
75491                 // it has. For example, Flash buttons require Flash
75492                 if ( config.available && ! config.available( dt, config ) ) {
75493                         return false;
75494                 }
75496                 var action = function ( e, dt, button, config ) {
75497                         config.action.call( dt.button( button ), e, dt, button, config );
75499                         $(dt.table().node()).triggerHandler( 'buttons-action.dt', [
75500                                 dt.button( button ), dt, button, config
75501                         ] );
75502                 };
75504                 var tag = config.tag || buttonDom.tag;
75505                 var clickBlurs = config.clickBlurs === undefined ? true : config.clickBlurs
75506                 var button = $('<'+tag+'/>')
75507                         .addClass( buttonDom.className )
75508                         .attr( 'tabindex', this.s.dt.settings()[0].iTabIndex )
75509                         .attr( 'aria-controls', this.s.dt.table().node().id )
75510                         .on( 'click.dtb', function (e) {
75511                                 e.preventDefault();
75513                                 if ( ! button.hasClass( buttonDom.disabled ) && config.action ) {
75514                                         action( e, dt, button, config );
75515                                 }
75516                                 if( clickBlurs ) {
75517                                         button.blur();
75518                                 }
75519                         } )
75520                         .on( 'keyup.dtb', function (e) {
75521                                 if ( e.keyCode === 13 ) {
75522                                         if ( ! button.hasClass( buttonDom.disabled ) && config.action ) {
75523                                                 action( e, dt, button, config );
75524                                         }
75525                                 }
75526                         } );
75528                 // Make `a` tags act like a link
75529                 if ( tag.toLowerCase() === 'a' ) {
75530                         button.attr( 'href', '#' );
75531                 }
75533                 // Button tags should have `type=button` so they don't have any default behaviour
75534                 if ( tag.toLowerCase() === 'button' ) {
75535                         button.attr( 'type', 'button' );
75536                 }
75538                 if ( linerDom.tag ) {
75539                         var liner = $('<'+linerDom.tag+'/>')
75540                                 .html( text( config.text ) )
75541                                 .addClass( linerDom.className );
75543                         if ( linerDom.tag.toLowerCase() === 'a' ) {
75544                                 liner.attr( 'href', '#' );
75545                         }
75547                         button.append( liner );
75548                 }
75549                 else {
75550                         button.html( text( config.text ) );
75551                 }
75553                 if ( config.enabled === false ) {
75554                         button.addClass( buttonDom.disabled );
75555                 }
75557                 if ( config.className ) {
75558                         button.addClass( config.className );
75559                 }
75561                 if ( config.titleAttr ) {
75562                         button.attr( 'title', text( config.titleAttr ) );
75563                 }
75565                 if ( config.attr ) {
75566                         button.attr( config.attr );
75567                 }
75569                 if ( ! config.namespace ) {
75570                         config.namespace = '.dt-button-'+(_buttonCounter++);
75571                 }
75573                 var buttonContainer = this.c.dom.buttonContainer;
75574                 var inserter;
75575                 if ( buttonContainer && buttonContainer.tag ) {
75576                         inserter = $('<'+buttonContainer.tag+'/>')
75577                                 .addClass( buttonContainer.className )
75578                                 .append( button );
75579                 }
75580                 else {
75581                         inserter = button;
75582                 }
75584                 this._addKey( config );
75586                 // Style integration callback for DOM manipulation
75587                 // Note that this is _not_ documented. It is currently
75588                 // for style integration only
75589                 if( this.c.buttonCreated ) {
75590                         inserter = this.c.buttonCreated( config, inserter );
75591                 }
75593                 return {
75594                         conf:         config,
75595                         node:         button.get(0),
75596                         inserter:     inserter,
75597                         buttons:      [],
75598                         inCollection: inCollection,
75599                         collection:   null
75600                 };
75601         },
75603         /**
75604          * Get the button object from a node (recursive)
75605          * @param  {node} node Button node
75606          * @param  {array} [buttons] Button array, uses base if not defined
75607          * @return {object} Button object
75608          * @private
75609          */
75610         _nodeToButton: function ( node, buttons )
75611         {
75612                 if ( ! buttons ) {
75613                         buttons = this.s.buttons;
75614                 }
75616                 for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
75617                         if ( buttons[i].node === node ) {
75618                                 return buttons[i];
75619                         }
75621                         if ( buttons[i].buttons.length ) {
75622                                 var ret = this._nodeToButton( node, buttons[i].buttons );
75624                                 if ( ret ) {
75625                                         return ret;
75626                                 }
75627                         }
75628                 }
75629         },
75631         /**
75632          * Get container array for a button from a button node (recursive)
75633          * @param  {node} node Button node
75634          * @param  {array} [buttons] Button array, uses base if not defined
75635          * @return {array} Button's host array
75636          * @private
75637          */
75638         _nodeToHost: function ( node, buttons )
75639         {
75640                 if ( ! buttons ) {
75641                         buttons = this.s.buttons;
75642                 }
75644                 for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
75645                         if ( buttons[i].node === node ) {
75646                                 return buttons;
75647                         }
75649                         if ( buttons[i].buttons.length ) {
75650                                 var ret = this._nodeToHost( node, buttons[i].buttons );
75652                                 if ( ret ) {
75653                                         return ret;
75654                                 }
75655                         }
75656                 }
75657         },
75659         /**
75660          * Handle a key press - determine if any button's key configured matches
75661          * what was typed and trigger the action if so.
75662          * @param  {string} character The character pressed
75663          * @param  {object} e Key event that triggered this call
75664          * @private
75665          */
75666         _keypress: function ( character, e )
75667         {
75668                 // Check if this button press already activated on another instance of Buttons
75669                 if ( e._buttonsHandled ) {
75670                         return;
75671                 }
75673                 var run = function ( conf, node ) {
75674                         if ( ! conf.key ) {
75675                                 return;
75676                         }
75678                         if ( conf.key === character ) {
75679                                 e._buttonsHandled = true;
75680                                 $(node).click();
75681                         }
75682                         else if ( $.isPlainObject( conf.key ) ) {
75683                                 if ( conf.key.key !== character ) {
75684                                         return;
75685                                 }
75687                                 if ( conf.key.shiftKey && ! e.shiftKey ) {
75688                                         return;
75689                                 }
75691                                 if ( conf.key.altKey && ! e.altKey ) {
75692                                         return;
75693                                 }
75695                                 if ( conf.key.ctrlKey && ! e.ctrlKey ) {
75696                                         return;
75697                                 }
75699                                 if ( conf.key.metaKey && ! e.metaKey ) {
75700                                         return;
75701                                 }
75703                                 // Made it this far - it is good
75704                                 e._buttonsHandled = true;
75705                                 $(node).click();
75706                         }
75707                 };
75709                 var recurse = function ( a ) {
75710                         for ( var i=0, ien=a.length ; i<ien ; i++ ) {
75711                                 run( a[i].conf, a[i].node );
75713                                 if ( a[i].buttons.length ) {
75714                                         recurse( a[i].buttons );
75715                                 }
75716                         }
75717                 };
75719                 recurse( this.s.buttons );
75720         },
75722         /**
75723          * Remove a key from the key listener for this instance (to be used when a
75724          * button is removed)
75725          * @param  {object} conf Button configuration
75726          * @private
75727          */
75728         _removeKey: function ( conf )
75729         {
75730                 if ( conf.key ) {
75731                         var character = $.isPlainObject( conf.key ) ?
75732                                 conf.key.key :
75733                                 conf.key;
75735                         // Remove only one character, as multiple buttons could have the
75736                         // same listening key
75737                         var a = this.s.listenKeys.split('');
75738                         var idx = $.inArray( character, a );
75739                         a.splice( idx, 1 );
75740                         this.s.listenKeys = a.join('');
75741                 }
75742         },
75744         /**
75745          * Resolve a button configuration
75746          * @param  {string|function|object} conf Button config to resolve
75747          * @return {object} Button configuration
75748          * @private
75749          */
75750         _resolveExtends: function ( conf )
75751         {
75752                 var dt = this.s.dt;
75753                 var i, ien;
75754                 var toConfObject = function ( base ) {
75755                         var loop = 0;
75757                         // Loop until we have resolved to a button configuration, or an
75758                         // array of button configurations (which will be iterated
75759                         // separately)
75760                         while ( ! $.isPlainObject(base) && ! $.isArray(base) ) {
75761                                 if ( base === undefined ) {
75762                                         return;
75763                                 }
75765                                 if ( typeof base === 'function' ) {
75766                                         base = base( dt, conf );
75768                                         if ( ! base ) {
75769                                                 return false;
75770                                         }
75771                                 }
75772                                 else if ( typeof base === 'string' ) {
75773                                         if ( ! _dtButtons[ base ] ) {
75774                                                 throw 'Unknown button type: '+base;
75775                                         }
75777                                         base = _dtButtons[ base ];
75778                                 }
75780                                 loop++;
75781                                 if ( loop > 30 ) {
75782                                         // Protect against misconfiguration killing the browser
75783                                         throw 'Buttons: Too many iterations';
75784                                 }
75785                         }
75787                         return $.isArray( base ) ?
75788                                 base :
75789                                 $.extend( {}, base );
75790                 };
75792                 conf = toConfObject( conf );
75794                 while ( conf && conf.extend ) {
75795                         // Use `toConfObject` in case the button definition being extended
75796                         // is itself a string or a function
75797                         if ( ! _dtButtons[ conf.extend ] ) {
75798                                 throw 'Cannot extend unknown button type: '+conf.extend;
75799                         }
75801                         var objArray = toConfObject( _dtButtons[ conf.extend ] );
75802                         if ( $.isArray( objArray ) ) {
75803                                 return objArray;
75804                         }
75805                         else if ( ! objArray ) {
75806                                 // This is a little brutal as it might be possible to have a
75807                                 // valid button without the extend, but if there is no extend
75808                                 // then the host button would be acting in an undefined state
75809                                 return false;
75810                         }
75812                         // Stash the current class name
75813                         var originalClassName = objArray.className;
75815                         conf = $.extend( {}, objArray, conf );
75817                         // The extend will have overwritten the original class name if the
75818                         // `conf` object also assigned a class, but we want to concatenate
75819                         // them so they are list that is combined from all extended buttons
75820                         if ( originalClassName && conf.className !== originalClassName ) {
75821                                 conf.className = originalClassName+' '+conf.className;
75822                         }
75824                         // Buttons to be added to a collection  -gives the ability to define
75825                         // if buttons should be added to the start or end of a collection
75826                         var postfixButtons = conf.postfixButtons;
75827                         if ( postfixButtons ) {
75828                                 if ( ! conf.buttons ) {
75829                                         conf.buttons = [];
75830                                 }
75832                                 for ( i=0, ien=postfixButtons.length ; i<ien ; i++ ) {
75833                                         conf.buttons.push( postfixButtons[i] );
75834                                 }
75836                                 conf.postfixButtons = null;
75837                         }
75839                         var prefixButtons = conf.prefixButtons;
75840                         if ( prefixButtons ) {
75841                                 if ( ! conf.buttons ) {
75842                                         conf.buttons = [];
75843                                 }
75845                                 for ( i=0, ien=prefixButtons.length ; i<ien ; i++ ) {
75846                                         conf.buttons.splice( i, 0, prefixButtons[i] );
75847                                 }
75849                                 conf.prefixButtons = null;
75850                         }
75852                         // Although we want the `conf` object to overwrite almost all of
75853                         // the properties of the object being extended, the `extend`
75854                         // property should come from the object being extended
75855                         conf.extend = objArray.extend;
75856                 }
75858                 return conf;
75859         }
75860 } );
75864 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
75865  * Statics
75866  */
75869  * Show / hide a background layer behind a collection
75870  * @param  {boolean} Flag to indicate if the background should be shown or
75871  *   hidden
75872  * @param  {string} Class to assign to the background
75873  * @static
75874  */
75875 Buttons.background = function ( show, className, fade, insertPoint ) {
75876         if ( fade === undefined ) {
75877                 fade = 400;
75878         }
75879         if ( ! insertPoint ) {
75880                 insertPoint = document.body;
75881         }
75883         if ( show ) {
75884                 $('<div/>')
75885                         .addClass( className )
75886                         .css( 'display', 'none' )
75887                         .insertAfter( insertPoint )
75888                         .stop()
75889                         .fadeIn( fade );
75890         }
75891         else {
75892                 $('div.'+className)
75893                         .stop()
75894                         .fadeOut( fade, function () {
75895                                 $(this)
75896                                         .removeClass( className )
75897                                         .remove();
75898                         } );
75899         }
75903  * Instance selector - select Buttons instances based on an instance selector
75904  * value from the buttons assigned to a DataTable. This is only useful if
75905  * multiple instances are attached to a DataTable.
75906  * @param  {string|int|array} Instance selector - see `instance-selector`
75907  *   documentation on the DataTables site
75908  * @param  {array} Button instance array that was attached to the DataTables
75909  *   settings object
75910  * @return {array} Buttons instances
75911  * @static
75912  */
75913 Buttons.instanceSelector = function ( group, buttons )
75915         if ( ! group ) {
75916                 return $.map( buttons, function ( v ) {
75917                         return v.inst;
75918                 } );
75919         }
75921         var ret = [];
75922         var names = $.map( buttons, function ( v ) {
75923                 return v.name;
75924         } );
75926         // Flatten the group selector into an array of single options
75927         var process = function ( input ) {
75928                 if ( $.isArray( input ) ) {
75929                         for ( var i=0, ien=input.length ; i<ien ; i++ ) {
75930                                 process( input[i] );
75931                         }
75932                         return;
75933                 }
75935                 if ( typeof input === 'string' ) {
75936                         if ( input.indexOf( ',' ) !== -1 ) {
75937                                 // String selector, list of names
75938                                 process( input.split(',') );
75939                         }
75940                         else {
75941                                 // String selector individual name
75942                                 var idx = $.inArray( $.trim(input), names );
75944                                 if ( idx !== -1 ) {
75945                                         ret.push( buttons[ idx ].inst );
75946                                 }
75947                         }
75948                 }
75949                 else if ( typeof input === 'number' ) {
75950                         // Index selector
75951                         ret.push( buttons[ input ].inst );
75952                 }
75953         };
75955         process( group );
75957         return ret;
75961  * Button selector - select one or more buttons from a selector input so some
75962  * operation can be performed on them.
75963  * @param  {array} Button instances array that the selector should operate on
75964  * @param  {string|int|node|jQuery|array} Button selector - see
75965  *   `button-selector` documentation on the DataTables site
75966  * @return {array} Array of objects containing `inst` and `idx` properties of
75967  *   the selected buttons so you know which instance each button belongs to.
75968  * @static
75969  */
75970 Buttons.buttonSelector = function ( insts, selector )
75972         var ret = [];
75973         var nodeBuilder = function ( a, buttons, baseIdx ) {
75974                 var button;
75975                 var idx;
75977                 for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
75978                         button = buttons[i];
75980                         if ( button ) {
75981                                 idx = baseIdx !== undefined ?
75982                                         baseIdx+i :
75983                                         i+'';
75985                                 a.push( {
75986                                         node: button.node,
75987                                         name: button.conf.name,
75988                                         idx:  idx
75989                                 } );
75991                                 if ( button.buttons ) {
75992                                         nodeBuilder( a, button.buttons, idx+'-' );
75993                                 }
75994                         }
75995                 }
75996         };
75998         var run = function ( selector, inst ) {
75999                 var i, ien;
76000                 var buttons = [];
76001                 nodeBuilder( buttons, inst.s.buttons );
76003                 var nodes = $.map( buttons, function (v) {
76004                         return v.node;
76005                 } );
76007                 if ( $.isArray( selector ) || selector instanceof $ ) {
76008                         for ( i=0, ien=selector.length ; i<ien ; i++ ) {
76009                                 run( selector[i], inst );
76010                         }
76011                         return;
76012                 }
76014                 if ( selector === null || selector === undefined || selector === '*' ) {
76015                         // Select all
76016                         for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
76017                                 ret.push( {
76018                                         inst: inst,
76019                                         node: buttons[i].node
76020                                 } );
76021                         }
76022                 }
76023                 else if ( typeof selector === 'number' ) {
76024                         // Main button index selector
76025                         ret.push( {
76026                                 inst: inst,
76027                                 node: inst.s.buttons[ selector ].node
76028                         } );
76029                 }
76030                 else if ( typeof selector === 'string' ) {
76031                         if ( selector.indexOf( ',' ) !== -1 ) {
76032                                 // Split
76033                                 var a = selector.split(',');
76035                                 for ( i=0, ien=a.length ; i<ien ; i++ ) {
76036                                         run( $.trim(a[i]), inst );
76037                                 }
76038                         }
76039                         else if ( selector.match( /^\d+(\-\d+)*$/ ) ) {
76040                                 // Sub-button index selector
76041                                 var indexes = $.map( buttons, function (v) {
76042                                         return v.idx;
76043                                 } );
76045                                 ret.push( {
76046                                         inst: inst,
76047                                         node: buttons[ $.inArray( selector, indexes ) ].node
76048                                 } );
76049                         }
76050                         else if ( selector.indexOf( ':name' ) !== -1 ) {
76051                                 // Button name selector
76052                                 var name = selector.replace( ':name', '' );
76054                                 for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
76055                                         if ( buttons[i].name === name ) {
76056                                                 ret.push( {
76057                                                         inst: inst,
76058                                                         node: buttons[i].node
76059                                                 } );
76060                                         }
76061                                 }
76062                         }
76063                         else {
76064                                 // jQuery selector on the nodes
76065                                 $( nodes ).filter( selector ).each( function () {
76066                                         ret.push( {
76067                                                 inst: inst,
76068                                                 node: this
76069                                         } );
76070                                 } );
76071                         }
76072                 }
76073                 else if ( typeof selector === 'object' && selector.nodeName ) {
76074                         // Node selector
76075                         var idx = $.inArray( selector, nodes );
76077                         if ( idx !== -1 ) {
76078                                 ret.push( {
76079                                         inst: inst,
76080                                         node: nodes[ idx ]
76081                                 } );
76082                         }
76083                 }
76084         };
76087         for ( var i=0, ien=insts.length ; i<ien ; i++ ) {
76088                 var inst = insts[i];
76090                 run( selector, inst );
76091         }
76093         return ret;
76098  * Buttons defaults. For full documentation, please refer to the docs/option
76099  * directory or the DataTables site.
76100  * @type {Object}
76101  * @static
76102  */
76103 Buttons.defaults = {
76104         buttons: [ 'copy', 'excel', 'csv', 'pdf', 'print' ],
76105         name: 'main',
76106         tabIndex: 0,
76107         dom: {
76108                 container: {
76109                         tag: 'div',
76110                         className: 'dt-buttons'
76111                 },
76112                 collection: {
76113                         tag: 'div',
76114                         className: 'dt-button-collection'
76115                 },
76116                 button: {
76117                         // Flash buttons will not work with `<button>` in IE - it has to be `<a>`
76118                         tag: 'ActiveXObject' in window ?
76119                                 'a' :
76120                                 'button',
76121                         className: 'dt-button',
76122                         active: 'active',
76123                         disabled: 'disabled'
76124                 },
76125                 buttonLiner: {
76126                         tag: 'span',
76127                         className: ''
76128                 }
76129         }
76133  * Version information
76134  * @type {string}
76135  * @static
76136  */
76137 Buttons.version = '1.5.6';
76140 $.extend( _dtButtons, {
76141         collection: {
76142                 text: function ( dt ) {
76143                         return dt.i18n( 'buttons.collection', 'Collection' );
76144                 },
76145                 className: 'buttons-collection',
76146                 init: function ( dt, button, config ) {
76147                         button.attr( 'aria-expanded', false );
76148                 },
76149                 action: function ( e, dt, button, config ) {
76150                         var close = function () {
76151                                 dt.buttons( '[aria-haspopup="true"][aria-expanded="true"]' ).nodes().each( function() {
76152                                         var collection = $(this).siblings('.dt-button-collection');
76154                                         if ( collection.length ) {
76155                                                 collection.stop().fadeOut( config.fade, function () {
76156                                                         collection.detach();
76157                                                 } );
76158                                         }
76160                                         $(this).attr( 'aria-expanded', 'false' );
76161                                 });
76163                                 $('div.dt-button-background').off( 'click.dtb-collection' );
76164                                 Buttons.background( false, config.backgroundClassName, config.fade, insertPoint );
76166                                 $('body').off( '.dtb-collection' );
76167                                 dt.off( 'buttons-action.b-internal' );
76168                         };
76170                         var wasExpanded = button.attr( 'aria-expanded' ) === 'true';
76172                         close();
76174                         if (!wasExpanded) {
76175                                 var host = button;
76176                                 var collectionParent = $(button).parents('div.dt-button-collection');
76177                                 var hostPosition = host.position();
76178                                 var tableContainer = $( dt.table().container() );
76179                                 var multiLevel = false;
76180                                 var insertPoint = host;
76182                                 button.attr( 'aria-expanded', 'true' );
76184                                 // Remove any old collection
76185                                 if ( collectionParent.length ) {
76186                                         multiLevel = $('.dt-button-collection').position();
76187                                         insertPoint = collectionParent;
76188                                         $('body').trigger( 'click.dtb-collection' );
76189                                 }
76191                                 if ( insertPoint.parents('body')[0] !== document.body ) {
76192                                         insertPoint = document.body.lastChild;
76193                                 }
76195                                 config._collection.find('.dt-button-collection-title').remove();
76196                                 config._collection.prepend('<div class="dt-button-collection-title">'+config.collectionTitle+'</div>');
76198                                 config._collection
76199                                         .addClass( config.collectionLayout )
76200                                         .css( 'display', 'none' )
76201                                         .insertAfter( insertPoint )
76202                                         .stop()
76203                                         .fadeIn( config.fade );
76205                                 var position = config._collection.css( 'position' );
76207                                 if ( multiLevel && position === 'absolute' ) {
76208                                         config._collection.css( {
76209                                                 top: multiLevel.top,
76210                                                 left: multiLevel.left
76211                                         } );
76212                                 }
76213                                 else if ( position === 'absolute' ) {
76214                                         config._collection.css( {
76215                                                 top: hostPosition.top + host.outerHeight(),
76216                                                 left: hostPosition.left
76217                                         } );
76219                                         // calculate overflow when positioned beneath
76220                                         var tableBottom = tableContainer.offset().top + tableContainer.height();
76221                                         var listBottom = hostPosition.top + host.outerHeight() + config._collection.outerHeight();
76222                                         var bottomOverflow = listBottom - tableBottom;
76224                                         // calculate overflow when positioned above
76225                                         var listTop = hostPosition.top - config._collection.outerHeight();
76226                                         var tableTop = tableContainer.offset().top;
76227                                         var topOverflow = tableTop - listTop;
76229                                         // if bottom overflow is larger, move to the top because it fits better, or if dropup is requested
76230                                         if (bottomOverflow > topOverflow || config.dropup) {
76231                                                 config._collection.css( 'top', hostPosition.top - config._collection.outerHeight() - 5);
76232                                         }
76234                                         // Right alignment is enabled on a class, e.g. bootstrap:
76235                                         // $.fn.dataTable.Buttons.defaults.dom.collection.className += " dropdown-menu-right";
76236                                         if ( config._collection.hasClass( config.rightAlignClassName ) ) {
76237                                                 config._collection.css( 'left', hostPosition.left + host.outerWidth() - config._collection.outerWidth() );
76238                                         }
76240                                         // Right alignment in table container
76241                                         var listRight = hostPosition.left + config._collection.outerWidth();
76242                                         var tableRight = tableContainer.offset().left + tableContainer.width();
76243                                         if ( listRight > tableRight ) {
76244                                                 config._collection.css( 'left', hostPosition.left - ( listRight - tableRight ) );
76245                                         }
76247                                         // Right alignment to window
76248                                         var listOffsetRight = host.offset().left + config._collection.outerWidth();
76249                                         if ( listOffsetRight > $(window).width() ) {
76250                                                 config._collection.css( 'left', hostPosition.left - (listOffsetRight-$(window).width()) );
76251                                         }
76252                                 }
76253                                 else {
76254                                         // Fix position - centre on screen
76255                                         var top = config._collection.height() / 2;
76256                                         if ( top > $(window).height() / 2 ) {
76257                                                 top = $(window).height() / 2;
76258                                         }
76260                                         config._collection.css( 'marginTop', top*-1 );
76261                                 }
76263                                 if ( config.background ) {
76264                                         Buttons.background( true, config.backgroundClassName, config.fade, insertPoint );
76265                                 }
76267                                 // Need to break the 'thread' for the collection button being
76268                                 // activated by a click - it would also trigger this event
76269                                 setTimeout( function () {
76270                                         // This is bonkers, but if we don't have a click listener on the
76271                                         // background element, iOS Safari will ignore the body click
76272                                         // listener below. An empty function here is all that is
76273                                         // required to make it work...
76274                                         $('div.dt-button-background').on( 'click.dtb-collection', function () {} );
76276                                         $('body')
76277                                                 .on( 'click.dtb-collection', function (e) {
76278                                                         // andSelf is deprecated in jQ1.8, but we want 1.7 compat
76279                                                         var back = $.fn.addBack ? 'addBack' : 'andSelf';
76281                                                         if ( ! $(e.target).parents()[back]().filter( config._collection ).length ) {
76282                                                                 close();
76283                                                         }
76284                                                 } )
76285                                                 .on( 'keyup.dtb-collection', function (e) {
76286                                                         if ( e.keyCode === 27 ) {
76287                                                                 close();
76288                                                         }
76289                                                 } );
76291                                         if ( config.autoClose ) {
76292                                                 dt.on( 'buttons-action.b-internal', function () {
76293                                                         close();
76294                                                 } );
76295                                         }
76296                                 }, 10 );
76297                         }
76298                 },
76299                 background: true,
76300                 collectionLayout: '',
76301                 collectionTitle: '',
76302                 backgroundClassName: 'dt-button-background',
76303                 rightAlignClassName: 'dt-button-right',
76304                 autoClose: false,
76305                 fade: 400,
76306                 attr: {
76307                         'aria-haspopup': true
76308                 }
76309         },
76310         copy: function ( dt, conf ) {
76311                 if ( _dtButtons.copyHtml5 ) {
76312                         return 'copyHtml5';
76313                 }
76314                 if ( _dtButtons.copyFlash && _dtButtons.copyFlash.available( dt, conf ) ) {
76315                         return 'copyFlash';
76316                 }
76317         },
76318         csv: function ( dt, conf ) {
76319                 // Common option that will use the HTML5 or Flash export buttons
76320                 if ( _dtButtons.csvHtml5 && _dtButtons.csvHtml5.available( dt, conf ) ) {
76321                         return 'csvHtml5';
76322                 }
76323                 if ( _dtButtons.csvFlash && _dtButtons.csvFlash.available( dt, conf ) ) {
76324                         return 'csvFlash';
76325                 }
76326         },
76327         excel: function ( dt, conf ) {
76328                 // Common option that will use the HTML5 or Flash export buttons
76329                 if ( _dtButtons.excelHtml5 && _dtButtons.excelHtml5.available( dt, conf ) ) {
76330                         return 'excelHtml5';
76331                 }
76332                 if ( _dtButtons.excelFlash && _dtButtons.excelFlash.available( dt, conf ) ) {
76333                         return 'excelFlash';
76334                 }
76335         },
76336         pdf: function ( dt, conf ) {
76337                 // Common option that will use the HTML5 or Flash export buttons
76338                 if ( _dtButtons.pdfHtml5 && _dtButtons.pdfHtml5.available( dt, conf ) ) {
76339                         return 'pdfHtml5';
76340                 }
76341                 if ( _dtButtons.pdfFlash && _dtButtons.pdfFlash.available( dt, conf ) ) {
76342                         return 'pdfFlash';
76343                 }
76344         },
76345         pageLength: function ( dt ) {
76346                 var lengthMenu = dt.settings()[0].aLengthMenu;
76347                 var vals = $.isArray( lengthMenu[0] ) ? lengthMenu[0] : lengthMenu;
76348                 var lang = $.isArray( lengthMenu[0] ) ? lengthMenu[1] : lengthMenu;
76349                 var text = function ( dt ) {
76350                         return dt.i18n( 'buttons.pageLength', {
76351                                 "-1": 'Show all rows',
76352                                 _:    'Show %d rows'
76353                         }, dt.page.len() );
76354                 };
76356                 return {
76357                         extend: 'collection',
76358                         text: text,
76359                         className: 'buttons-page-length',
76360                         autoClose: true,
76361                         buttons: $.map( vals, function ( val, i ) {
76362                                 return {
76363                                         text: lang[i],
76364                                         className: 'button-page-length',
76365                                         action: function ( e, dt ) {
76366                                                 dt.page.len( val ).draw();
76367                                         },
76368                                         init: function ( dt, node, conf ) {
76369                                                 var that = this;
76370                                                 var fn = function () {
76371                                                         that.active( dt.page.len() === val );
76372                                                 };
76374                                                 dt.on( 'length.dt'+conf.namespace, fn );
76375                                                 fn();
76376                                         },
76377                                         destroy: function ( dt, node, conf ) {
76378                                                 dt.off( 'length.dt'+conf.namespace );
76379                                         }
76380                                 };
76381                         } ),
76382                         init: function ( dt, node, conf ) {
76383                                 var that = this;
76384                                 dt.on( 'length.dt'+conf.namespace, function () {
76385                                         that.text( conf.text );
76386                                 } );
76387                         },
76388                         destroy: function ( dt, node, conf ) {
76389                                 dt.off( 'length.dt'+conf.namespace );
76390                         }
76391                 };
76392         }
76393 } );
76396 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
76397  * DataTables API
76399  * For complete documentation, please refer to the docs/api directory or the
76400  * DataTables site
76401  */
76403 // Buttons group and individual button selector
76404 DataTable.Api.register( 'buttons()', function ( group, selector ) {
76405         // Argument shifting
76406         if ( selector === undefined ) {
76407                 selector = group;
76408                 group = undefined;
76409         }
76411         this.selector.buttonGroup = group;
76413         var res = this.iterator( true, 'table', function ( ctx ) {
76414                 if ( ctx._buttons ) {
76415                         return Buttons.buttonSelector(
76416                                 Buttons.instanceSelector( group, ctx._buttons ),
76417                                 selector
76418                         );
76419                 }
76420         }, true );
76422         res._groupSelector = group;
76423         return res;
76424 } );
76426 // Individual button selector
76427 DataTable.Api.register( 'button()', function ( group, selector ) {
76428         // just run buttons() and truncate
76429         var buttons = this.buttons( group, selector );
76431         if ( buttons.length > 1 ) {
76432                 buttons.splice( 1, buttons.length );
76433         }
76435         return buttons;
76436 } );
76438 // Active buttons
76439 DataTable.Api.registerPlural( 'buttons().active()', 'button().active()', function ( flag ) {
76440         if ( flag === undefined ) {
76441                 return this.map( function ( set ) {
76442                         return set.inst.active( set.node );
76443                 } );
76444         }
76446         return this.each( function ( set ) {
76447                 set.inst.active( set.node, flag );
76448         } );
76449 } );
76451 // Get / set button action
76452 DataTable.Api.registerPlural( 'buttons().action()', 'button().action()', function ( action ) {
76453         if ( action === undefined ) {
76454                 return this.map( function ( set ) {
76455                         return set.inst.action( set.node );
76456                 } );
76457         }
76459         return this.each( function ( set ) {
76460                 set.inst.action( set.node, action );
76461         } );
76462 } );
76464 // Enable / disable buttons
76465 DataTable.Api.register( ['buttons().enable()', 'button().enable()'], function ( flag ) {
76466         return this.each( function ( set ) {
76467                 set.inst.enable( set.node, flag );
76468         } );
76469 } );
76471 // Disable buttons
76472 DataTable.Api.register( ['buttons().disable()', 'button().disable()'], function () {
76473         return this.each( function ( set ) {
76474                 set.inst.disable( set.node );
76475         } );
76476 } );
76478 // Get button nodes
76479 DataTable.Api.registerPlural( 'buttons().nodes()', 'button().node()', function () {
76480         var jq = $();
76482         // jQuery will automatically reduce duplicates to a single entry
76483         $( this.each( function ( set ) {
76484                 jq = jq.add( set.inst.node( set.node ) );
76485         } ) );
76487         return jq;
76488 } );
76490 // Get / set button processing state
76491 DataTable.Api.registerPlural( 'buttons().processing()', 'button().processing()', function ( flag ) {
76492         if ( flag === undefined ) {
76493                 return this.map( function ( set ) {
76494                         return set.inst.processing( set.node );
76495                 } );
76496         }
76498         return this.each( function ( set ) {
76499                 set.inst.processing( set.node, flag );
76500         } );
76501 } );
76503 // Get / set button text (i.e. the button labels)
76504 DataTable.Api.registerPlural( 'buttons().text()', 'button().text()', function ( label ) {
76505         if ( label === undefined ) {
76506                 return this.map( function ( set ) {
76507                         return set.inst.text( set.node );
76508                 } );
76509         }
76511         return this.each( function ( set ) {
76512                 set.inst.text( set.node, label );
76513         } );
76514 } );
76516 // Trigger a button's action
76517 DataTable.Api.registerPlural( 'buttons().trigger()', 'button().trigger()', function () {
76518         return this.each( function ( set ) {
76519                 set.inst.node( set.node ).trigger( 'click' );
76520         } );
76521 } );
76523 // Get the container elements
76524 DataTable.Api.registerPlural( 'buttons().containers()', 'buttons().container()', function () {
76525         var jq = $();
76526         var groupSelector = this._groupSelector;
76528         // We need to use the group selector directly, since if there are no buttons
76529         // the result set will be empty
76530         this.iterator( true, 'table', function ( ctx ) {
76531                 if ( ctx._buttons ) {
76532                         var insts = Buttons.instanceSelector( groupSelector, ctx._buttons );
76534                         for ( var i=0, ien=insts.length ; i<ien ; i++ ) {
76535                                 jq = jq.add( insts[i].container() );
76536                         }
76537                 }
76538         } );
76540         return jq;
76541 } );
76543 // Add a new button
76544 DataTable.Api.register( 'button().add()', function ( idx, conf ) {
76545         var ctx = this.context;
76547         // Don't use `this` as it could be empty - select the instances directly
76548         if ( ctx.length ) {
76549                 var inst = Buttons.instanceSelector( this._groupSelector, ctx[0]._buttons );
76551                 if ( inst.length ) {
76552                         inst[0].add( conf, idx );
76553                 }
76554         }
76556         return this.button( this._groupSelector, idx );
76557 } );
76559 // Destroy the button sets selected
76560 DataTable.Api.register( 'buttons().destroy()', function () {
76561         this.pluck( 'inst' ).unique().each( function ( inst ) {
76562                 inst.destroy();
76563         } );
76565         return this;
76566 } );
76568 // Remove a button
76569 DataTable.Api.registerPlural( 'buttons().remove()', 'buttons().remove()', function () {
76570         this.each( function ( set ) {
76571                 set.inst.remove( set.node );
76572         } );
76574         return this;
76575 } );
76577 // Information box that can be used by buttons
76578 var _infoTimer;
76579 DataTable.Api.register( 'buttons.info()', function ( title, message, time ) {
76580         var that = this;
76582         if ( title === false ) {
76583                 $('#datatables_buttons_info').fadeOut( function () {
76584                         $(this).remove();
76585                 } );
76586                 clearTimeout( _infoTimer );
76587                 _infoTimer = null;
76589                 return this;
76590         }
76592         if ( _infoTimer ) {
76593                 clearTimeout( _infoTimer );
76594         }
76596         if ( $('#datatables_buttons_info').length ) {
76597                 $('#datatables_buttons_info').remove();
76598         }
76600         title = title ? '<h2>'+title+'</h2>' : '';
76602         $('<div id="datatables_buttons_info" class="dt-button-info"/>')
76603                 .html( title )
76604                 .append( $('<div/>')[ typeof message === 'string' ? 'html' : 'append' ]( message ) )
76605                 .css( 'display', 'none' )
76606                 .appendTo( 'body' )
76607                 .fadeIn();
76609         if ( time !== undefined && time !== 0 ) {
76610                 _infoTimer = setTimeout( function () {
76611                         that.buttons.info( false );
76612                 }, time );
76613         }
76615         return this;
76616 } );
76618 // Get data from the table for export - this is common to a number of plug-in
76619 // buttons so it is included in the Buttons core library
76620 DataTable.Api.register( 'buttons.exportData()', function ( options ) {
76621         if ( this.context.length ) {
76622                 return _exportData( new DataTable.Api( this.context[0] ), options );
76623         }
76624 } );
76626 // Get information about the export that is common to many of the export data
76627 // types (DRY)
76628 DataTable.Api.register( 'buttons.exportInfo()', function ( conf ) {
76629         if ( ! conf ) {
76630                 conf = {};
76631         }
76633         return {
76634                 filename: _filename( conf ),
76635                 title: _title( conf ),
76636                 messageTop: _message(this, conf.message || conf.messageTop, 'top'),
76637                 messageBottom: _message(this, conf.messageBottom, 'bottom')
76638         };
76639 } );
76644  * Get the file name for an exported file.
76646  * @param {object}      config Button configuration
76647  * @param {boolean} incExtension Include the file name extension
76648  */
76649 var _filename = function ( config )
76651         // Backwards compatibility
76652         var filename = config.filename === '*' && config.title !== '*' && config.title !== undefined && config.title !== null && config.title !== '' ?
76653                 config.title :
76654                 config.filename;
76656         if ( typeof filename === 'function' ) {
76657                 filename = filename();
76658         }
76660         if ( filename === undefined || filename === null ) {
76661                 return null;
76662         }
76664         if ( filename.indexOf( '*' ) !== -1 ) {
76665                 filename = $.trim( filename.replace( '*', $('head > title').text() ) );
76666         }
76668         // Strip characters which the OS will object to
76669         filename = filename.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g, "");
76671         var extension = _stringOrFunction( config.extension );
76672         if ( ! extension ) {
76673                 extension = '';
76674         }
76676         return filename + extension;
76680  * Simply utility method to allow parameters to be given as a function
76682  * @param {undefined|string|function} option Option
76683  * @return {null|string} Resolved value
76684  */
76685 var _stringOrFunction = function ( option )
76687         if ( option === null || option === undefined ) {
76688                 return null;
76689         }
76690         else if ( typeof option === 'function' ) {
76691                 return option();
76692         }
76693         return option;
76697  * Get the title for an exported file.
76699  * @param {object} config       Button configuration
76700  */
76701 var _title = function ( config )
76703         var title = _stringOrFunction( config.title );
76705         return title === null ?
76706                 null : title.indexOf( '*' ) !== -1 ?
76707                         title.replace( '*', $('head > title').text() || 'Exported data' ) :
76708                         title;
76711 var _message = function ( dt, option, position )
76713         var message = _stringOrFunction( option );
76714         if ( message === null ) {
76715                 return null;
76716         }
76718         var caption = $('caption', dt.table().container()).eq(0);
76719         if ( message === '*' ) {
76720                 var side = caption.css( 'caption-side' );
76721                 if ( side !== position ) {
76722                         return null;
76723                 }
76725                 return caption.length ?
76726                         caption.text() :
76727                         '';
76728         }
76730         return message;
76739 var _exportTextarea = $('<textarea/>')[0];
76740 var _exportData = function ( dt, inOpts )
76742         var config = $.extend( true, {}, {
76743                 rows:           null,
76744                 columns:        '',
76745                 modifier:       {
76746                         search: 'applied',
76747                         order:  'applied'
76748                 },
76749                 orthogonal:     'display',
76750                 stripHtml:      true,
76751                 stripNewlines:  true,
76752                 decodeEntities: true,
76753                 trim:           true,
76754                 format:         {
76755                         header: function ( d ) {
76756                                 return strip( d );
76757                         },
76758                         footer: function ( d ) {
76759                                 return strip( d );
76760                         },
76761                         body: function ( d ) {
76762                                 return strip( d );
76763                         }
76764                 },
76765                 customizeData: null
76766         }, inOpts );
76768         var strip = function ( str ) {
76769                 if ( typeof str !== 'string' ) {
76770                         return str;
76771                 }
76773                 // Always remove script tags
76774                 str = str.replace( /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '' );
76776                 // Always remove comments
76777                 str = str.replace( /<!\-\-.*?\-\->/g, '' );
76779                 if ( config.stripHtml ) {
76780                         str = str.replace( /<[^>]*>/g, '' );
76781                 }
76783                 if ( config.trim ) {
76784                         str = str.replace( /^\s+|\s+$/g, '' );
76785                 }
76787                 if ( config.stripNewlines ) {
76788                         str = str.replace( /\n/g, ' ' );
76789                 }
76791                 if ( config.decodeEntities ) {
76792                         _exportTextarea.innerHTML = str;
76793                         str = _exportTextarea.value;
76794                 }
76796                 return str;
76797         };
76800         var header = dt.columns( config.columns ).indexes().map( function (idx) {
76801                 var el = dt.column( idx ).header();
76802                 return config.format.header( el.innerHTML, idx, el );
76803         } ).toArray();
76805         var footer = dt.table().footer() ?
76806                 dt.columns( config.columns ).indexes().map( function (idx) {
76807                         var el = dt.column( idx ).footer();
76808                         return config.format.footer( el ? el.innerHTML : '', idx, el );
76809                 } ).toArray() :
76810                 null;
76812         // If Select is available on this table, and any rows are selected, limit the export
76813         // to the selected rows. If no rows are selected, all rows will be exported. Specify
76814         // a `selected` modifier to control directly.
76815         var modifier = $.extend( {}, config.modifier );
76816         if ( dt.select && typeof dt.select.info === 'function' && modifier.selected === undefined ) {
76817                 if ( dt.rows( config.rows, $.extend( { selected: true }, modifier ) ).any() ) {
76818                         $.extend( modifier, { selected: true } )
76819                 }
76820         }
76822         var rowIndexes = dt.rows( config.rows, modifier ).indexes().toArray();
76823         var selectedCells = dt.cells( rowIndexes, config.columns );
76824         var cells = selectedCells
76825                 .render( config.orthogonal )
76826                 .toArray();
76827         var cellNodes = selectedCells
76828                 .nodes()
76829                 .toArray();
76831         var columns = header.length;
76832         var rows = columns > 0 ? cells.length / columns : 0;
76833         var body = [];
76834         var cellCounter = 0;
76836         for ( var i=0, ien=rows ; i<ien ; i++ ) {
76837                 var row = [ columns ];
76839                 for ( var j=0 ; j<columns ; j++ ) {
76840                         row[j] = config.format.body( cells[ cellCounter ], i, j, cellNodes[ cellCounter ] );
76841                         cellCounter++;
76842                 }
76844                 body[i] = row;
76845         }
76847         var data = {
76848                 header: header,
76849                 footer: footer,
76850                 body:   body
76851         };
76853         if ( config.customizeData ) {
76854                 config.customizeData( data );
76855         }
76857         return data;
76861 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
76862  * DataTables interface
76863  */
76865 // Attach to DataTables objects for global access
76866 $.fn.dataTable.Buttons = Buttons;
76867 $.fn.DataTable.Buttons = Buttons;
76871 // DataTables creation - check if the buttons have been defined for this table,
76872 // they will have been if the `B` option was used in `dom`, otherwise we should
76873 // create the buttons instance here so they can be inserted into the document
76874 // using the API. Listen for `init` for compatibility with pre 1.10.10, but to
76875 // be removed in future.
76876 $(document).on( 'init.dt plugin-init.dt', function (e, settings) {
76877         if ( e.namespace !== 'dt' ) {
76878                 return;
76879         }
76881         var opts = settings.oInit.buttons || DataTable.defaults.buttons;
76883         if ( opts && ! settings._buttons ) {
76884                 new Buttons( settings, opts ).container();
76885         }
76886 } );
76888 function _init ( settings ) {
76889         var api = new DataTable.Api( settings );
76890         var opts = api.init().buttons || DataTable.defaults.buttons;
76892         return new Buttons( api, opts ).container();
76895 // DataTables `dom` feature option
76896 DataTable.ext.feature.push( {
76897         fnInit: _init,
76898         cFeature: "B"
76899 } );
76901 // DataTables 2 layout feature
76902 if ( DataTable.ext.features ) {
76903         DataTable.ext.features.register( 'buttons', _init );
76907 return Buttons;
76908 }));
76912  * Column visibility buttons for Buttons and DataTables.
76913  * 2016 SpryMedia Ltd - datatables.net/license
76914  */
76916 (function( factory ){
76917         if ( typeof define === 'function' && define.amd ) {
76918                 // AMD
76919                 define( ['jquery', 'datatables.net', 'datatables.net-buttons'], function ( $ ) {
76920                         return factory( $, window, document );
76921                 } );
76922         }
76923         else if ( typeof exports === 'object' ) {
76924                 // CommonJS
76925                 module.exports = function (root, $) {
76926                         if ( ! root ) {
76927                                 root = window;
76928                         }
76930                         if ( ! $ || ! $.fn.dataTable ) {
76931                                 $ = require('datatables.net')(root, $).$;
76932                         }
76934                         if ( ! $.fn.dataTable.Buttons ) {
76935                                 require('datatables.net-buttons')(root, $);
76936                         }
76938                         return factory( $, root, root.document );
76939                 };
76940         }
76941         else {
76942                 // Browser
76943                 factory( jQuery, window, document );
76944         }
76945 }(function( $, window, document, undefined ) {
76946 'use strict';
76947 var DataTable = $.fn.dataTable;
76950 $.extend( DataTable.ext.buttons, {
76951         // A collection of column visibility buttons
76952         colvis: function ( dt, conf ) {
76953                 return {
76954                         extend: 'collection',
76955                         text: function ( dt ) {
76956                                 return dt.i18n( 'buttons.colvis', 'Column visibility' );
76957                         },
76958                         className: 'buttons-colvis',
76959                         buttons: [ {
76960                                 extend: 'columnsToggle',
76961                                 columns: conf.columns,
76962                                 columnText: conf.columnText
76963                         } ]
76964                 };
76965         },
76967         // Selected columns with individual buttons - toggle column visibility
76968         columnsToggle: function ( dt, conf ) {
76969                 var columns = dt.columns( conf.columns ).indexes().map( function ( idx ) {
76970                         return {
76971                                 extend: 'columnToggle',
76972                                 columns: idx,
76973                                 columnText: conf.columnText
76974                         };
76975                 } ).toArray();
76977                 return columns;
76978         },
76980         // Single button to toggle column visibility
76981         columnToggle: function ( dt, conf ) {
76982                 return {
76983                         extend: 'columnVisibility',
76984                         columns: conf.columns,
76985                         columnText: conf.columnText
76986                 };
76987         },
76989         // Selected columns with individual buttons - set column visibility
76990         columnsVisibility: function ( dt, conf ) {
76991                 var columns = dt.columns( conf.columns ).indexes().map( function ( idx ) {
76992                         return {
76993                                 extend: 'columnVisibility',
76994                                 columns: idx,
76995                                 visibility: conf.visibility,
76996                                 columnText: conf.columnText
76997                         };
76998                 } ).toArray();
77000                 return columns;
77001         },
77003         // Single button to set column visibility
77004         columnVisibility: {
77005                 columns: undefined, // column selector
77006                 text: function ( dt, button, conf ) {
77007                         return conf._columnText( dt, conf );
77008                 },
77009                 className: 'buttons-columnVisibility',
77010                 action: function ( e, dt, button, conf ) {
77011                         var col = dt.columns( conf.columns );
77012                         var curr = col.visible();
77014                         col.visible( conf.visibility !== undefined ?
77015                                 conf.visibility :
77016                                 ! (curr.length ? curr[0] : false )
77017                         );
77018                 },
77019                 init: function ( dt, button, conf ) {
77020                         var that = this;
77021                         button.attr( 'data-cv-idx', conf.columns );
77023                         dt
77024                                 .on( 'column-visibility.dt'+conf.namespace, function (e, settings) {
77025                                         if ( ! settings.bDestroying && settings.nTable == dt.settings()[0].nTable ) {
77026                                                 that.active( dt.column( conf.columns ).visible() );
77027                                         }
77028                                 } )
77029                                 .on( 'column-reorder.dt'+conf.namespace, function (e, settings, details) {
77030                                         // Don't rename buttons based on column name if the button
77031                                         // controls more than one column!
77032                                         if ( dt.columns( conf.columns ).count() !== 1 ) {
77033                                                 return;
77034                                         }
77036                                         conf.columns = $.inArray( conf.columns, details.mapping );
77037                                         button.attr( 'data-cv-idx', conf.columns );
77039                                         // Reorder buttons for new table order
77040                                         button
77041                                                 .parent()
77042                                                 .children('[data-cv-idx]')
77043                                                 .sort( function (a, b) {
77044                                                         return (a.getAttribute('data-cv-idx')*1) - (b.getAttribute('data-cv-idx')*1);
77045                                                 } )
77046                                                 .appendTo(button.parent());
77047                                 } );
77049                         this.active( dt.column( conf.columns ).visible() );
77050                 },
77051                 destroy: function ( dt, button, conf ) {
77052                         dt
77053                                 .off( 'column-visibility.dt'+conf.namespace )
77054                                 .off( 'column-reorder.dt'+conf.namespace );
77055                 },
77057                 _columnText: function ( dt, conf ) {
77058                         // Use DataTables' internal data structure until this is presented
77059                         // is a public API. The other option is to use
77060                         // `$( column(col).node() ).text()` but the node might not have been
77061                         // populated when Buttons is constructed.
77062                         var idx = dt.column( conf.columns ).index();
77063                         var title = dt.settings()[0].aoColumns[ idx ].sTitle
77064                                 .replace(/\n/g," ")        // remove new lines
77065                                 .replace(/<br\s*\/?>/gi, " ")  // replace line breaks with spaces
77066                                 .replace(/<select(.*?)<\/select>/g, "") // remove select tags, including options text
77067                                 .replace(/<!\-\-.*?\-\->/g, "") // strip HTML comments
77068                                 .replace(/<.*?>/g, "")   // strip HTML
77069                                 .replace(/^\s+|\s+$/g,""); // trim
77071                         return conf.columnText ?
77072                                 conf.columnText( dt, idx, title ) :
77073                                 title;
77074                 }
77075         },
77078         colvisRestore: {
77079                 className: 'buttons-colvisRestore',
77081                 text: function ( dt ) {
77082                         return dt.i18n( 'buttons.colvisRestore', 'Restore visibility' );
77083                 },
77085                 init: function ( dt, button, conf ) {
77086                         conf._visOriginal = dt.columns().indexes().map( function ( idx ) {
77087                                 return dt.column( idx ).visible();
77088                         } ).toArray();
77089                 },
77091                 action: function ( e, dt, button, conf ) {
77092                         dt.columns().every( function ( i ) {
77093                                 // Take into account that ColReorder might have disrupted our
77094                                 // indexes
77095                                 var idx = dt.colReorder && dt.colReorder.transpose ?
77096                                         dt.colReorder.transpose( i, 'toOriginal' ) :
77097                                         i;
77099                                 this.visible( conf._visOriginal[ idx ] );
77100                         } );
77101                 }
77102         },
77105         colvisGroup: {
77106                 className: 'buttons-colvisGroup',
77108                 action: function ( e, dt, button, conf ) {
77109                         dt.columns( conf.show ).visible( true, false );
77110                         dt.columns( conf.hide ).visible( false, false );
77112                         dt.columns.adjust();
77113                 },
77115                 show: [],
77117                 hide: []
77118         }
77119 } );
77122 return DataTable.Buttons;
77123 }));
77127  * HTML5 export buttons for Buttons and DataTables.
77128  * 2016 SpryMedia Ltd - datatables.net/license
77130  * FileSaver.js (1.3.3) - MIT license
77131  * Copyright © 2016 Eli Grey - http://eligrey.com
77132  */
77134 (function( factory ){
77135         if ( typeof define === 'function' && define.amd ) {
77136                 // AMD
77137                 define( ['jquery', 'datatables.net', 'datatables.net-buttons'], function ( $ ) {
77138                         return factory( $, window, document );
77139                 } );
77140         }
77141         else if ( typeof exports === 'object' ) {
77142                 // CommonJS
77143                 module.exports = function (root, $, jszip, pdfmake) {
77144                         if ( ! root ) {
77145                                 root = window;
77146                         }
77148                         if ( ! $ || ! $.fn.dataTable ) {
77149                                 $ = require('datatables.net')(root, $).$;
77150                         }
77152                         if ( ! $.fn.dataTable.Buttons ) {
77153                                 require('datatables.net-buttons')(root, $);
77154                         }
77156                         return factory( $, root, root.document, jszip, pdfmake );
77157                 };
77158         }
77159         else {
77160                 // Browser
77161                 factory( jQuery, window, document );
77162         }
77163 }(function( $, window, document, jszip, pdfmake, undefined ) {
77164 'use strict';
77165 var DataTable = $.fn.dataTable;
77167 // Allow the constructor to pass in JSZip and PDFMake from external requires.
77168 // Otherwise, use globally defined variables, if they are available.
77169 function _jsZip () {
77170         return jszip || window.JSZip;
77172 function _pdfMake () {
77173         return pdfmake || window.pdfMake;
77176 DataTable.Buttons.pdfMake = function (_) {
77177         if ( ! _ ) {
77178                 return _pdfMake();
77179         }
77180         pdfmake = m_ake;
77183 DataTable.Buttons.jszip = function (_) {
77184         if ( ! _ ) {
77185                 return _jsZip();
77186         }
77187         jszip = _;
77191 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
77192  * FileSaver.js dependency
77193  */
77195 /*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
77197 var _saveAs = (function(view) {
77198         "use strict";
77199         // IE <10 is explicitly unsupported
77200         if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
77201                 return;
77202         }
77203         var
77204                   doc = view.document
77205                   // only get URL when necessary in case Blob.js hasn't overridden it yet
77206                 , get_URL = function() {
77207                         return view.URL || view.webkitURL || view;
77208                 }
77209                 , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
77210                 , can_use_save_link = "download" in save_link
77211                 , click = function(node) {
77212                         var event = new MouseEvent("click");
77213                         node.dispatchEvent(event);
77214                 }
77215                 , is_safari = /constructor/i.test(view.HTMLElement) || view.safari
77216                 , is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent)
77217                 , throw_outside = function(ex) {
77218                         (view.setImmediate || view.setTimeout)(function() {
77219                                 throw ex;
77220                         }, 0);
77221                 }
77222                 , force_saveable_type = "application/octet-stream"
77223                 // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
77224                 , arbitrary_revoke_timeout = 1000 * 40 // in ms
77225                 , revoke = function(file) {
77226                         var revoker = function() {
77227                                 if (typeof file === "string") { // file is an object URL
77228                                         get_URL().revokeObjectURL(file);
77229                                 } else { // file is a File
77230                                         file.remove();
77231                                 }
77232                         };
77233                         setTimeout(revoker, arbitrary_revoke_timeout);
77234                 }
77235                 , dispatch = function(filesaver, event_types, event) {
77236                         event_types = [].concat(event_types);
77237                         var i = event_types.length;
77238                         while (i--) {
77239                                 var listener = filesaver["on" + event_types[i]];
77240                                 if (typeof listener === "function") {
77241                                         try {
77242                                                 listener.call(filesaver, event || filesaver);
77243                                         } catch (ex) {
77244                                                 throw_outside(ex);
77245                                         }
77246                                 }
77247                         }
77248                 }
77249                 , auto_bom = function(blob) {
77250                         // prepend BOM for UTF-8 XML and text/* types (including HTML)
77251                         // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
77252                         if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
77253                                 return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});
77254                         }
77255                         return blob;
77256                 }
77257                 , FileSaver = function(blob, name, no_auto_bom) {
77258                         if (!no_auto_bom) {
77259                                 blob = auto_bom(blob);
77260                         }
77261                         // First try a.download, then web filesystem, then object URLs
77262                         var
77263                                   filesaver = this
77264                                 , type = blob.type
77265                                 , force = type === force_saveable_type
77266                                 , object_url
77267                                 , dispatch_all = function() {
77268                                         dispatch(filesaver, "writestart progress write writeend".split(" "));
77269                                 }
77270                                 // on any filesys errors revert to saving with object URLs
77271                                 , fs_error = function() {
77272                                         if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
77273                                                 // Safari doesn't allow downloading of blob urls
77274                                                 var reader = new FileReader();
77275                                                 reader.onloadend = function() {
77276                                                         var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
77277                                                         var popup = view.open(url, '_blank');
77278                                                         if(!popup) view.location.href = url;
77279                                                         url=undefined; // release reference before dispatching
77280                                                         filesaver.readyState = filesaver.DONE;
77281                                                         dispatch_all();
77282                                                 };
77283                                                 reader.readAsDataURL(blob);
77284                                                 filesaver.readyState = filesaver.INIT;
77285                                                 return;
77286                                         }
77287                                         // don't create more object URLs than needed
77288                                         if (!object_url) {
77289                                                 object_url = get_URL().createObjectURL(blob);
77290                                         }
77291                                         if (force) {
77292                                                 view.location.href = object_url;
77293                                         } else {
77294                                                 var opened = view.open(object_url, "_blank");
77295                                                 if (!opened) {
77296                                                         // Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
77297                                                         view.location.href = object_url;
77298                                                 }
77299                                         }
77300                                         filesaver.readyState = filesaver.DONE;
77301                                         dispatch_all();
77302                                         revoke(object_url);
77303                                 }
77304                         ;
77305                         filesaver.readyState = filesaver.INIT;
77307                         if (can_use_save_link) {
77308                                 object_url = get_URL().createObjectURL(blob);
77309                                 setTimeout(function() {
77310                                         save_link.href = object_url;
77311                                         save_link.download = name;
77312                                         click(save_link);
77313                                         dispatch_all();
77314                                         revoke(object_url);
77315                                         filesaver.readyState = filesaver.DONE;
77316                                 });
77317                                 return;
77318                         }
77320                         fs_error();
77321                 }
77322                 , FS_proto = FileSaver.prototype
77323                 , saveAs = function(blob, name, no_auto_bom) {
77324                         return new FileSaver(blob, name || blob.name || "download", no_auto_bom);
77325                 }
77326         ;
77327         // IE 10+ (native saveAs)
77328         if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
77329                 return function(blob, name, no_auto_bom) {
77330                         name = name || blob.name || "download";
77332                         if (!no_auto_bom) {
77333                                 blob = auto_bom(blob);
77334                         }
77335                         return navigator.msSaveOrOpenBlob(blob, name);
77336                 };
77337         }
77339         FS_proto.abort = function(){};
77340         FS_proto.readyState = FS_proto.INIT = 0;
77341         FS_proto.WRITING = 1;
77342         FS_proto.DONE = 2;
77344         FS_proto.error =
77345         FS_proto.onwritestart =
77346         FS_proto.onprogress =
77347         FS_proto.onwrite =
77348         FS_proto.onabort =
77349         FS_proto.onerror =
77350         FS_proto.onwriteend =
77351                 null;
77353         return saveAs;
77355            typeof self !== "undefined" && self
77356         || typeof window !== "undefined" && window
77357         || this.content
77361 // Expose file saver on the DataTables API. Can't attach to `DataTables.Buttons`
77362 // since this file can be loaded before Button's core!
77363 DataTable.fileSave = _saveAs;
77366 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
77367  * Local (private) functions
77368  */
77371  * Get the sheet name for Excel exports.
77373  * @param {object}      config Button configuration
77374  */
77375 var _sheetname = function ( config )
77377         var sheetName = 'Sheet1';
77379         if ( config.sheetName ) {
77380                 sheetName = config.sheetName.replace(/[\[\]\*\/\\\?\:]/g, '');
77381         }
77383         return sheetName;
77387  * Get the newline character(s)
77389  * @param {object}      config Button configuration
77390  * @return {string}                             Newline character
77391  */
77392 var _newLine = function ( config )
77394         return config.newline ?
77395                 config.newline :
77396                 navigator.userAgent.match(/Windows/) ?
77397                         '\r\n' :
77398                         '\n';
77402  * Combine the data from the `buttons.exportData` method into a string that
77403  * will be used in the export file.
77405  * @param       {DataTable.Api} dt               DataTables API instance
77406  * @param       {object}                                config Button configuration
77407  * @return {object}                                                      The data to export
77408  */
77409 var _exportData = function ( dt, config )
77411         var newLine = _newLine( config );
77412         var data = dt.buttons.exportData( config.exportOptions );
77413         var boundary = config.fieldBoundary;
77414         var separator = config.fieldSeparator;
77415         var reBoundary = new RegExp( boundary, 'g' );
77416         var escapeChar = config.escapeChar !== undefined ?
77417                 config.escapeChar :
77418                 '\\';
77419         var join = function ( a ) {
77420                 var s = '';
77422                 // If there is a field boundary, then we might need to escape it in
77423                 // the source data
77424                 for ( var i=0, ien=a.length ; i<ien ; i++ ) {
77425                         if ( i > 0 ) {
77426                                 s += separator;
77427                         }
77429                         s += boundary ?
77430                                 boundary + ('' + a[i]).replace( reBoundary, escapeChar+boundary ) + boundary :
77431                                 a[i];
77432                 }
77434                 return s;
77435         };
77437         var header = config.header ? join( data.header )+newLine : '';
77438         var footer = config.footer && data.footer ? newLine+join( data.footer ) : '';
77439         var body = [];
77441         for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
77442                 body.push( join( data.body[i] ) );
77443         }
77445         return {
77446                 str: header + body.join( newLine ) + footer,
77447                 rows: body.length
77448         };
77452  * Older versions of Safari (prior to tech preview 18) don't support the
77453  * download option required.
77455  * @return {Boolean} `true` if old Safari
77456  */
77457 var _isDuffSafari = function ()
77459         var safari = navigator.userAgent.indexOf('Safari') !== -1 &&
77460                 navigator.userAgent.indexOf('Chrome') === -1 &&
77461                 navigator.userAgent.indexOf('Opera') === -1;
77463         if ( ! safari ) {
77464                 return false;
77465         }
77467         var version = navigator.userAgent.match( /AppleWebKit\/(\d+\.\d+)/ );
77468         if ( version && version.length > 1 && version[1]*1 < 603.1 ) {
77469                 return true;
77470         }
77472         return false;
77476  * Convert from numeric position to letter for column names in Excel
77477  * @param  {int} n Column number
77478  * @return {string} Column letter(s) name
77479  */
77480 function createCellPos( n ){
77481         var ordA = 'A'.charCodeAt(0);
77482         var ordZ = 'Z'.charCodeAt(0);
77483         var len = ordZ - ordA + 1;
77484         var s = "";
77486         while( n >= 0 ) {
77487                 s = String.fromCharCode(n % len + ordA) + s;
77488                 n = Math.floor(n / len) - 1;
77489         }
77491         return s;
77494 try {
77495         var _serialiser = new XMLSerializer();
77496         var _ieExcel;
77498 catch (t) {}
77501  * Recursively add XML files from an object's structure to a ZIP file. This
77502  * allows the XSLX file to be easily defined with an object's structure matching
77503  * the files structure.
77505  * @param {JSZip} zip ZIP package
77506  * @param {object} obj Object to add (recursive)
77507  */
77508 function _addToZip( zip, obj ) {
77509         if ( _ieExcel === undefined ) {
77510                 // Detect if we are dealing with IE's _awful_ serialiser by seeing if it
77511                 // drop attributes
77512                 _ieExcel = _serialiser
77513                         .serializeToString(
77514                                 $.parseXML( excelStrings['xl/worksheets/sheet1.xml'] )
77515                         )
77516                         .indexOf( 'xmlns:r' ) === -1;
77517         }
77519         $.each( obj, function ( name, val ) {
77520                 if ( $.isPlainObject( val ) ) {
77521                         var newDir = zip.folder( name );
77522                         _addToZip( newDir, val );
77523                 }
77524                 else {
77525                         if ( _ieExcel ) {
77526                                 // IE's XML serialiser will drop some name space attributes from
77527                                 // from the root node, so we need to save them. Do this by
77528                                 // replacing the namespace nodes with a regular attribute that
77529                                 // we convert back when serialised. Edge does not have this
77530                                 // issue
77531                                 var worksheet = val.childNodes[0];
77532                                 var i, ien;
77533                                 var attrs = [];
77535                                 for ( i=worksheet.attributes.length-1 ; i>=0 ; i-- ) {
77536                                         var attrName = worksheet.attributes[i].nodeName;
77537                                         var attrValue = worksheet.attributes[i].nodeValue;
77539                                         if ( attrName.indexOf( ':' ) !== -1 ) {
77540                                                 attrs.push( { name: attrName, value: attrValue } );
77542                                                 worksheet.removeAttribute( attrName );
77543                                         }
77544                                 }
77546                                 for ( i=0, ien=attrs.length ; i<ien ; i++ ) {
77547                                         var attr = val.createAttribute( attrs[i].name.replace( ':', '_dt_b_namespace_token_' ) );
77548                                         attr.value = attrs[i].value;
77549                                         worksheet.setAttributeNode( attr );
77550                                 }
77551                         }
77553                         var str = _serialiser.serializeToString(val);
77555                         // Fix IE's XML
77556                         if ( _ieExcel ) {
77557                                 // IE doesn't include the XML declaration
77558                                 if ( str.indexOf( '<?xml' ) === -1 ) {
77559                                         str = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+str;
77560                                 }
77562                                 // Return namespace attributes to being as such
77563                                 str = str.replace( /_dt_b_namespace_token_/g, ':' );
77565                                 // Remove testing name space that IE puts into the space preserve attr
77566                                 str = str.replace( /xmlns:NS[\d]+="" NS[\d]+:/g, '' );
77567                         }
77569                         // Safari, IE and Edge will put empty name space attributes onto
77570                         // various elements making them useless. This strips them out
77571                         str = str.replace( /<([^<>]*?) xmlns=""([^<>]*?)>/g, '<$1 $2>' );
77573                         zip.file( name, str );
77574                 }
77575         } );
77579  * Create an XML node and add any children, attributes, etc without needing to
77580  * be verbose in the DOM.
77582  * @param  {object} doc      XML document
77583  * @param  {string} nodeName Node name
77584  * @param  {object} opts     Options - can be `attr` (attributes), `children`
77585  *   (child nodes) and `text` (text content)
77586  * @return {node}            Created node
77587  */
77588 function _createNode( doc, nodeName, opts ) {
77589         var tempNode = doc.createElement( nodeName );
77591         if ( opts ) {
77592                 if ( opts.attr ) {
77593                         $(tempNode).attr( opts.attr );
77594                 }
77596                 if ( opts.children ) {
77597                         $.each( opts.children, function ( key, value ) {
77598                                 tempNode.appendChild( value );
77599                         } );
77600                 }
77602                 if ( opts.text !== null && opts.text !== undefined ) {
77603                         tempNode.appendChild( doc.createTextNode( opts.text ) );
77604                 }
77605         }
77607         return tempNode;
77611  * Get the width for an Excel column based on the contents of that column
77612  * @param  {object} data Data for export
77613  * @param  {int}    col  Column index
77614  * @return {int}         Column width
77615  */
77616 function _excelColWidth( data, col ) {
77617         var max = data.header[col].length;
77618         var len, lineSplit, str;
77620         if ( data.footer && data.footer[col].length > max ) {
77621                 max = data.footer[col].length;
77622         }
77624         for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
77625                 var point = data.body[i][col];
77626                 str = point !== null && point !== undefined ?
77627                         point.toString() :
77628                         '';
77630                 // If there is a newline character, workout the width of the column
77631                 // based on the longest line in the string
77632                 if ( str.indexOf('\n') !== -1 ) {
77633                         lineSplit = str.split('\n');
77634                         lineSplit.sort( function (a, b) {
77635                                 return b.length - a.length;
77636                         } );
77638                         len = lineSplit[0].length;
77639                 }
77640                 else {
77641                         len = str.length;
77642                 }
77644                 if ( len > max ) {
77645                         max = len;
77646                 }
77648                 // Max width rather than having potentially massive column widths
77649                 if ( max > 40 ) {
77650                         return 54; // 40 * 1.35
77651                 }
77652         }
77654         max *= 1.35;
77656         // And a min width
77657         return max > 6 ? max : 6;
77660 // Excel - Pre-defined strings to build a basic XLSX file
77661 var excelStrings = {
77662         "_rels/.rels":
77663                 '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
77664                 '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">'+
77665                         '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>'+
77666                 '</Relationships>',
77668         "xl/_rels/workbook.xml.rels":
77669                 '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
77670                 '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">'+
77671                         '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>'+
77672                         '<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>'+
77673                 '</Relationships>',
77675         "[Content_Types].xml":
77676                 '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
77677                 '<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">'+
77678                         '<Default Extension="xml" ContentType="application/xml" />'+
77679                         '<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" />'+
77680                         '<Default Extension="jpeg" ContentType="image/jpeg" />'+
77681                         '<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" />'+
77682                         '<Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" />'+
77683                         '<Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" />'+
77684                 '</Types>',
77686         "xl/workbook.xml":
77687                 '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
77688                 '<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">'+
77689                         '<fileVersion appName="xl" lastEdited="5" lowestEdited="5" rupBuild="24816"/>'+
77690                         '<workbookPr showInkAnnotation="0" autoCompressPictures="0"/>'+
77691                         '<bookViews>'+
77692                                 '<workbookView xWindow="0" yWindow="0" windowWidth="25600" windowHeight="19020" tabRatio="500"/>'+
77693                         '</bookViews>'+
77694                         '<sheets>'+
77695                                 '<sheet name="Sheet1" sheetId="1" r:id="rId1"/>'+
77696                         '</sheets>'+
77697                         '<definedNames/>'+
77698                 '</workbook>',
77700         "xl/worksheets/sheet1.xml":
77701                 '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
77702                 '<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">'+
77703                         '<sheetData/>'+
77704                         '<mergeCells count="0"/>'+
77705                 '</worksheet>',
77707         "xl/styles.xml":
77708                 '<?xml version="1.0" encoding="UTF-8"?>'+
77709                 '<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">'+
77710                         '<numFmts count="6">'+
77711                                 '<numFmt numFmtId="164" formatCode="#,##0.00_-\ [$$-45C]"/>'+
77712                                 '<numFmt numFmtId="165" formatCode="&quot;£&quot;#,##0.00"/>'+
77713                                 '<numFmt numFmtId="166" formatCode="[$€-2]\ #,##0.00"/>'+
77714                                 '<numFmt numFmtId="167" formatCode="0.0%"/>'+
77715                                 '<numFmt numFmtId="168" formatCode="#,##0;(#,##0)"/>'+
77716                                 '<numFmt numFmtId="169" formatCode="#,##0.00;(#,##0.00)"/>'+
77717                         '</numFmts>'+
77718                         '<fonts count="5" x14ac:knownFonts="1">'+
77719                                 '<font>'+
77720                                         '<sz val="11" />'+
77721                                         '<name val="Calibri" />'+
77722                                 '</font>'+
77723                                 '<font>'+
77724                                         '<sz val="11" />'+
77725                                         '<name val="Calibri" />'+
77726                                         '<color rgb="FFFFFFFF" />'+
77727                                 '</font>'+
77728                                 '<font>'+
77729                                         '<sz val="11" />'+
77730                                         '<name val="Calibri" />'+
77731                                         '<b />'+
77732                                 '</font>'+
77733                                 '<font>'+
77734                                         '<sz val="11" />'+
77735                                         '<name val="Calibri" />'+
77736                                         '<i />'+
77737                                 '</font>'+
77738                                 '<font>'+
77739                                         '<sz val="11" />'+
77740                                         '<name val="Calibri" />'+
77741                                         '<u />'+
77742                                 '</font>'+
77743                         '</fonts>'+
77744                         '<fills count="6">'+
77745                                 '<fill>'+
77746                                         '<patternFill patternType="none" />'+
77747                                 '</fill>'+
77748                                 '<fill>'+ // Excel appears to use this as a dotted background regardless of values but
77749                                         '<patternFill patternType="none" />'+ // to be valid to the schema, use a patternFill
77750                                 '</fill>'+
77751                                 '<fill>'+
77752                                         '<patternFill patternType="solid">'+
77753                                                 '<fgColor rgb="FFD9D9D9" />'+
77754                                                 '<bgColor indexed="64" />'+
77755                                         '</patternFill>'+
77756                                 '</fill>'+
77757                                 '<fill>'+
77758                                         '<patternFill patternType="solid">'+
77759                                                 '<fgColor rgb="FFD99795" />'+
77760                                                 '<bgColor indexed="64" />'+
77761                                         '</patternFill>'+
77762                                 '</fill>'+
77763                                 '<fill>'+
77764                                         '<patternFill patternType="solid">'+
77765                                                 '<fgColor rgb="ffc6efce" />'+
77766                                                 '<bgColor indexed="64" />'+
77767                                         '</patternFill>'+
77768                                 '</fill>'+
77769                                 '<fill>'+
77770                                         '<patternFill patternType="solid">'+
77771                                                 '<fgColor rgb="ffc6cfef" />'+
77772                                                 '<bgColor indexed="64" />'+
77773                                         '</patternFill>'+
77774                                 '</fill>'+
77775                         '</fills>'+
77776                         '<borders count="2">'+
77777                                 '<border>'+
77778                                         '<left />'+
77779                                         '<right />'+
77780                                         '<top />'+
77781                                         '<bottom />'+
77782                                         '<diagonal />'+
77783                                 '</border>'+
77784                                 '<border diagonalUp="false" diagonalDown="false">'+
77785                                         '<left style="thin">'+
77786                                                 '<color auto="1" />'+
77787                                         '</left>'+
77788                                         '<right style="thin">'+
77789                                                 '<color auto="1" />'+
77790                                         '</right>'+
77791                                         '<top style="thin">'+
77792                                                 '<color auto="1" />'+
77793                                         '</top>'+
77794                                         '<bottom style="thin">'+
77795                                                 '<color auto="1" />'+
77796                                         '</bottom>'+
77797                                         '<diagonal />'+
77798                                 '</border>'+
77799                         '</borders>'+
77800                         '<cellStyleXfs count="1">'+
77801                                 '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" />'+
77802                         '</cellStyleXfs>'+
77803                         '<cellXfs count="67">'+
77804                                 '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77805                                 '<xf numFmtId="0" fontId="1" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77806                                 '<xf numFmtId="0" fontId="2" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77807                                 '<xf numFmtId="0" fontId="3" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77808                                 '<xf numFmtId="0" fontId="4" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77809                                 '<xf numFmtId="0" fontId="0" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77810                                 '<xf numFmtId="0" fontId="1" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77811                                 '<xf numFmtId="0" fontId="2" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77812                                 '<xf numFmtId="0" fontId="3" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77813                                 '<xf numFmtId="0" fontId="4" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77814                                 '<xf numFmtId="0" fontId="0" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77815                                 '<xf numFmtId="0" fontId="1" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77816                                 '<xf numFmtId="0" fontId="2" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77817                                 '<xf numFmtId="0" fontId="3" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77818                                 '<xf numFmtId="0" fontId="4" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77819                                 '<xf numFmtId="0" fontId="0" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77820                                 '<xf numFmtId="0" fontId="1" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77821                                 '<xf numFmtId="0" fontId="2" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77822                                 '<xf numFmtId="0" fontId="3" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77823                                 '<xf numFmtId="0" fontId="4" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77824                                 '<xf numFmtId="0" fontId="0" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77825                                 '<xf numFmtId="0" fontId="1" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77826                                 '<xf numFmtId="0" fontId="2" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77827                                 '<xf numFmtId="0" fontId="3" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77828                                 '<xf numFmtId="0" fontId="4" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
77829                                 '<xf numFmtId="0" fontId="0" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77830                                 '<xf numFmtId="0" fontId="1" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77831                                 '<xf numFmtId="0" fontId="2" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77832                                 '<xf numFmtId="0" fontId="3" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77833                                 '<xf numFmtId="0" fontId="4" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77834                                 '<xf numFmtId="0" fontId="0" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77835                                 '<xf numFmtId="0" fontId="1" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77836                                 '<xf numFmtId="0" fontId="2" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77837                                 '<xf numFmtId="0" fontId="3" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77838                                 '<xf numFmtId="0" fontId="4" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77839                                 '<xf numFmtId="0" fontId="0" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77840                                 '<xf numFmtId="0" fontId="1" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77841                                 '<xf numFmtId="0" fontId="2" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77842                                 '<xf numFmtId="0" fontId="3" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77843                                 '<xf numFmtId="0" fontId="4" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77844                                 '<xf numFmtId="0" fontId="0" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77845                                 '<xf numFmtId="0" fontId="1" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77846                                 '<xf numFmtId="0" fontId="2" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77847                                 '<xf numFmtId="0" fontId="3" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77848                                 '<xf numFmtId="0" fontId="4" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77849                                 '<xf numFmtId="0" fontId="0" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77850                                 '<xf numFmtId="0" fontId="1" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77851                                 '<xf numFmtId="0" fontId="2" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77852                                 '<xf numFmtId="0" fontId="3" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77853                                 '<xf numFmtId="0" fontId="4" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
77854                                 '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
77855                                         '<alignment horizontal="left"/>'+
77856                                 '</xf>'+
77857                                 '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
77858                                         '<alignment horizontal="center"/>'+
77859                                 '</xf>'+
77860                                 '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
77861                                         '<alignment horizontal="right"/>'+
77862                                 '</xf>'+
77863                                 '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
77864                                         '<alignment horizontal="fill"/>'+
77865                                 '</xf>'+
77866                                 '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
77867                                         '<alignment textRotation="90"/>'+
77868                                 '</xf>'+
77869                                 '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
77870                                         '<alignment wrapText="1"/>'+
77871                                 '</xf>'+
77872                                 '<xf numFmtId="9"   fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
77873                                 '<xf numFmtId="164" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
77874                                 '<xf numFmtId="165" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
77875                                 '<xf numFmtId="166" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
77876                                 '<xf numFmtId="167" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
77877                                 '<xf numFmtId="168" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
77878                                 '<xf numFmtId="169" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
77879                                 '<xf numFmtId="3" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
77880                                 '<xf numFmtId="4" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
77881                                 '<xf numFmtId="1" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
77882                                 '<xf numFmtId="2" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
77883                         '</cellXfs>'+
77884                         '<cellStyles count="1">'+
77885                                 '<cellStyle name="Normal" xfId="0" builtinId="0" />'+
77886                         '</cellStyles>'+
77887                         '<dxfs count="0" />'+
77888                         '<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4" />'+
77889                 '</styleSheet>'
77891 // Note we could use 3 `for` loops for the styles, but when gzipped there is
77892 // virtually no difference in size, since the above can be easily compressed
77894 // Pattern matching for special number formats. Perhaps this should be exposed
77895 // via an API in future?
77896 // Ref: section 3.8.30 - built in formatters in open spreadsheet
77897 //   https://www.ecma-international.org/news/TC45_current_work/Office%20Open%20XML%20Part%204%20-%20Markup%20Language%20Reference.pdf
77898 var _excelSpecials = [
77899         { match: /^\-?\d+\.\d%$/,       style: 60, fmt: function (d) { return d/100; } }, // Precent with d.p.
77900         { match: /^\-?\d+\.?\d*%$/,     style: 56, fmt: function (d) { return d/100; } }, // Percent
77901         { match: /^\-?\$[\d,]+.?\d*$/,  style: 57 }, // Dollars
77902         { match: /^\-?£[\d,]+.?\d*$/,   style: 58 }, // Pounds
77903         { match: /^\-?€[\d,]+.?\d*$/,   style: 59 }, // Euros
77904         { match: /^\-?\d+$/,            style: 65 }, // Numbers without thousand separators
77905         { match: /^\-?\d+\.\d{2}$/,     style: 66 }, // Numbers 2 d.p. without thousands separators
77906         { match: /^\([\d,]+\)$/,        style: 61, fmt: function (d) { return -1 * d.replace(/[\(\)]/g, ''); } },  // Negative numbers indicated by brackets
77907         { match: /^\([\d,]+\.\d{2}\)$/, style: 62, fmt: function (d) { return -1 * d.replace(/[\(\)]/g, ''); } },  // Negative numbers indicated by brackets - 2d.p.
77908         { match: /^\-?[\d,]+$/,         style: 63 }, // Numbers with thousand separators
77909         { match: /^\-?[\d,]+\.\d{2}$/,  style: 64 }  // Numbers with 2 d.p. and thousands separators
77914 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
77915  * Buttons
77916  */
77919 // Copy to clipboard
77921 DataTable.ext.buttons.copyHtml5 = {
77922         className: 'buttons-copy buttons-html5',
77924         text: function ( dt ) {
77925                 return dt.i18n( 'buttons.copy', 'Copy' );
77926         },
77928         action: function ( e, dt, button, config ) {
77929                 this.processing( true );
77931                 var that = this;
77932                 var exportData = _exportData( dt, config );
77933                 var info = dt.buttons.exportInfo( config );
77934                 var newline = _newLine(config);
77935                 var output = exportData.str;
77936                 var hiddenDiv = $('<div/>')
77937                         .css( {
77938                                 height: 1,
77939                                 width: 1,
77940                                 overflow: 'hidden',
77941                                 position: 'fixed',
77942                                 top: 0,
77943                                 left: 0
77944                         } );
77946                 if ( info.title ) {
77947                         output = info.title + newline + newline + output;
77948                 }
77950                 if ( info.messageTop ) {
77951                         output = info.messageTop + newline + newline + output;
77952                 }
77954                 if ( info.messageBottom ) {
77955                         output = output + newline + newline + info.messageBottom;
77956                 }
77958                 if ( config.customize ) {
77959                         output = config.customize( output, config, dt );
77960                 }
77962                 var textarea = $('<textarea readonly/>')
77963                         .val( output )
77964                         .appendTo( hiddenDiv );
77966                 // For browsers that support the copy execCommand, try to use it
77967                 if ( document.queryCommandSupported('copy') ) {
77968                         hiddenDiv.appendTo( dt.table().container() );
77969                         textarea[0].focus();
77970                         textarea[0].select();
77972                         try {
77973                                 var successful = document.execCommand( 'copy' );
77974                                 hiddenDiv.remove();
77976                                 if (successful) {
77977                                         dt.buttons.info(
77978                                                 dt.i18n( 'buttons.copyTitle', 'Copy to clipboard' ),
77979                                                 dt.i18n( 'buttons.copySuccess', {
77980                                                         1: 'Copied one row to clipboard',
77981                                                         _: 'Copied %d rows to clipboard'
77982                                                 }, exportData.rows ),
77983                                                 2000
77984                                         );
77986                                         this.processing( false );
77987                                         return;
77988                                 }
77989                         }
77990                         catch (t) {}
77991                 }
77993                 // Otherwise we show the text box and instruct the user to use it
77994                 var message = $('<span>'+dt.i18n( 'buttons.copyKeys',
77995                                 'Press <i>ctrl</i> or <i>\u2318</i> + <i>C</i> to copy the table data<br>to your system clipboard.<br><br>'+
77996                                 'To cancel, click this message or press escape.' )+'</span>'
77997                         )
77998                         .append( hiddenDiv );
78000                 dt.buttons.info( dt.i18n( 'buttons.copyTitle', 'Copy to clipboard' ), message, 0 );
78002                 // Select the text so when the user activates their system clipboard
78003                 // it will copy that text
78004                 textarea[0].focus();
78005                 textarea[0].select();
78007                 // Event to hide the message when the user is done
78008                 var container = $(message).closest('.dt-button-info');
78009                 var close = function () {
78010                         container.off( 'click.buttons-copy' );
78011                         $(document).off( '.buttons-copy' );
78012                         dt.buttons.info( false );
78013                 };
78015                 container.on( 'click.buttons-copy', close );
78016                 $(document)
78017                         .on( 'keydown.buttons-copy', function (e) {
78018                                 if ( e.keyCode === 27 ) { // esc
78019                                         close();
78020                                         that.processing( false );
78021                                 }
78022                         } )
78023                         .on( 'copy.buttons-copy cut.buttons-copy', function () {
78024                                 close();
78025                                 that.processing( false );
78026                         } );
78027         },
78029         exportOptions: {},
78031         fieldSeparator: '\t',
78033         fieldBoundary: '',
78035         header: true,
78037         footer: false,
78039         title: '*',
78041         messageTop: '*',
78043         messageBottom: '*'
78047 // CSV export
78049 DataTable.ext.buttons.csvHtml5 = {
78050         bom: false,
78052         className: 'buttons-csv buttons-html5',
78054         available: function () {
78055                 return window.FileReader !== undefined && window.Blob;
78056         },
78058         text: function ( dt ) {
78059                 return dt.i18n( 'buttons.csv', 'CSV' );
78060         },
78062         action: function ( e, dt, button, config ) {
78063                 this.processing( true );
78065                 // Set the text
78066                 var output = _exportData( dt, config ).str;
78067                 var info = dt.buttons.exportInfo(config);
78068                 var charset = config.charset;
78070                 if ( config.customize ) {
78071                         output = config.customize( output, config, dt );
78072                 }
78074                 if ( charset !== false ) {
78075                         if ( ! charset ) {
78076                                 charset = document.characterSet || document.charset;
78077                         }
78079                         if ( charset ) {
78080                                 charset = ';charset='+charset;
78081                         }
78082                 }
78083                 else {
78084                         charset = '';
78085                 }
78087                 if ( config.bom ) {
78088                         output = '\ufeff' + output;
78089                 }
78091                 _saveAs(
78092                         new Blob( [output], {type: 'text/csv'+charset} ),
78093                         info.filename,
78094                         true
78095                 );
78097                 this.processing( false );
78098         },
78100         filename: '*',
78102         extension: '.csv',
78104         exportOptions: {},
78106         fieldSeparator: ',',
78108         fieldBoundary: '"',
78110         escapeChar: '"',
78112         charset: null,
78114         header: true,
78116         footer: false
78120 // Excel (xlsx) export
78122 DataTable.ext.buttons.excelHtml5 = {
78123         className: 'buttons-excel buttons-html5',
78125         available: function () {
78126                 return window.FileReader !== undefined && _jsZip() !== undefined && ! _isDuffSafari() && _serialiser;
78127         },
78129         text: function ( dt ) {
78130                 return dt.i18n( 'buttons.excel', 'Excel' );
78131         },
78133         action: function ( e, dt, button, config ) {
78134                 this.processing( true );
78136                 var that = this;
78137                 var rowPos = 0;
78138                 var dataStartRow, dataEndRow;
78139                 var getXml = function ( type ) {
78140                         var str = excelStrings[ type ];
78142                         //str = str.replace( /xmlns:/g, 'xmlns_' ).replace( /mc:/g, 'mc_' );
78144                         return $.parseXML( str );
78145                 };
78146                 var rels = getXml('xl/worksheets/sheet1.xml');
78147                 var relsGet = rels.getElementsByTagName( "sheetData" )[0];
78149                 var xlsx = {
78150                         _rels: {
78151                                 ".rels": getXml('_rels/.rels')
78152                         },
78153                         xl: {
78154                                 _rels: {
78155                                         "workbook.xml.rels": getXml('xl/_rels/workbook.xml.rels')
78156                                 },
78157                                 "workbook.xml": getXml('xl/workbook.xml'),
78158                                 "styles.xml": getXml('xl/styles.xml'),
78159                                 "worksheets": {
78160                                         "sheet1.xml": rels
78161                                 }
78163                         },
78164                         "[Content_Types].xml": getXml('[Content_Types].xml')
78165                 };
78167                 var data = dt.buttons.exportData( config.exportOptions );
78168                 var currentRow, rowNode;
78169                 var addRow = function ( row ) {
78170                         currentRow = rowPos+1;
78171                         rowNode = _createNode( rels, "row", { attr: {r:currentRow} } );
78173                         for ( var i=0, ien=row.length ; i<ien ; i++ ) {
78174                                 // Concat both the Cell Columns as a letter and the Row of the cell.
78175                                 var cellId = createCellPos(i) + '' + currentRow;
78176                                 var cell = null;
78178                                 // For null, undefined of blank cell, continue so it doesn't create the _createNode
78179                                 if ( row[i] === null || row[i] === undefined || row[i] === '' ) {
78180                                         if ( config.createEmptyCells === true ) {
78181                                                 row[i] = '';
78182                                         }
78183                                         else {
78184                                                 continue;
78185                                         }
78186                                 }
78188                                 var originalContent = row[i];
78189                                 row[i] = $.trim( row[i] );
78191                                 // Special number formatting options
78192                                 for ( var j=0, jen=_excelSpecials.length ; j<jen ; j++ ) {
78193                                         var special = _excelSpecials[j];
78195                                         // TODO Need to provide the ability for the specials to say
78196                                         // if they are returning a string, since at the moment it is
78197                                         // assumed to be a number
78198                                         if ( row[i].match && ! row[i].match(/^0\d+/) && row[i].match( special.match ) ) {
78199                                                 var val = row[i].replace(/[^\d\.\-]/g, '');
78201                                                 if ( special.fmt ) {
78202                                                         val = special.fmt( val );
78203                                                 }
78205                                                 cell = _createNode( rels, 'c', {
78206                                                         attr: {
78207                                                                 r: cellId,
78208                                                                 s: special.style
78209                                                         },
78210                                                         children: [
78211                                                                 _createNode( rels, 'v', { text: val } )
78212                                                         ]
78213                                                 } );
78215                                                 break;
78216                                         }
78217                                 }
78219                                 if ( ! cell ) {
78220                                         if ( typeof row[i] === 'number' || (
78221                                                 row[i].match &&
78222                                                 row[i].match(/^-?\d+(\.\d+)?$/) &&
78223                                                 ! row[i].match(/^0\d+/) )
78224                                         ) {
78225                                                 // Detect numbers - don't match numbers with leading zeros
78226                                                 // or a negative anywhere but the start
78227                                                 cell = _createNode( rels, 'c', {
78228                                                         attr: {
78229                                                                 t: 'n',
78230                                                                 r: cellId
78231                                                         },
78232                                                         children: [
78233                                                                 _createNode( rels, 'v', { text: row[i] } )
78234                                                         ]
78235                                                 } );
78236                                         }
78237                                         else {
78238                                                 // String output - replace non standard characters for text output
78239                                                 var text = ! originalContent.replace ?
78240                                                         originalContent :
78241                                                         originalContent.replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, '');
78243                                                 cell = _createNode( rels, 'c', {
78244                                                         attr: {
78245                                                                 t: 'inlineStr',
78246                                                                 r: cellId
78247                                                         },
78248                                                         children:{
78249                                                                 row: _createNode( rels, 'is', {
78250                                                                         children: {
78251                                                                                 row: _createNode( rels, 't', {
78252                                                                                         text: text,
78253                                                                                         attr: {
78254                                                                                                 'xml:space': 'preserve'
78255                                                                                         }
78256                                                                                 } )
78257                                                                         }
78258                                                                 } )
78259                                                         }
78260                                                 } );
78261                                         }
78262                                 }
78264                                 rowNode.appendChild( cell );
78265                         }
78267                         relsGet.appendChild(rowNode);
78268                         rowPos++;
78269                 };
78271                 if ( config.customizeData ) {
78272                         config.customizeData( data );
78273                 }
78275                 var mergeCells = function ( row, colspan ) {
78276                         var mergeCells = $('mergeCells', rels);
78278                         mergeCells[0].appendChild( _createNode( rels, 'mergeCell', {
78279                                 attr: {
78280                                         ref: 'A'+row+':'+createCellPos(colspan)+row
78281                                 }
78282                         } ) );
78283                         mergeCells.attr( 'count', parseFloat(mergeCells.attr( 'count' ))+1 );
78284                         $('row:eq('+(row-1)+') c', rels).attr( 's', '51' ); // centre
78285                 };
78287                 // Title and top messages
78288                 var exportInfo = dt.buttons.exportInfo( config );
78289                 if ( exportInfo.title ) {
78290                         addRow( [exportInfo.title], rowPos );
78291                         mergeCells( rowPos, data.header.length-1 );
78292                 }
78294                 if ( exportInfo.messageTop ) {
78295                         addRow( [exportInfo.messageTop], rowPos );
78296                         mergeCells( rowPos, data.header.length-1 );
78297                 }
78300                 // Table itself
78301                 if ( config.header ) {
78302                         addRow( data.header, rowPos );
78303                         $('row:last c', rels).attr( 's', '2' ); // bold
78304                 }
78306                 dataStartRow = rowPos;
78308                 for ( var n=0, ie=data.body.length ; n<ie ; n++ ) {
78309                         addRow( data.body[n], rowPos );
78310                 }
78312                 dataEndRow = rowPos;
78314                 if ( config.footer && data.footer ) {
78315                         addRow( data.footer, rowPos);
78316                         $('row:last c', rels).attr( 's', '2' ); // bold
78317                 }
78319                 // Below the table
78320                 if ( exportInfo.messageBottom ) {
78321                         addRow( [exportInfo.messageBottom], rowPos );
78322                         mergeCells( rowPos, data.header.length-1 );
78323                 }
78325                 // Set column widths
78326                 var cols = _createNode( rels, 'cols' );
78327                 $('worksheet', rels).prepend( cols );
78329                 for ( var i=0, ien=data.header.length ; i<ien ; i++ ) {
78330                         cols.appendChild( _createNode( rels, 'col', {
78331                                 attr: {
78332                                         min: i+1,
78333                                         max: i+1,
78334                                         width: _excelColWidth( data, i ),
78335                                         customWidth: 1
78336                                 }
78337                         } ) );
78338                 }
78340                 // Workbook modifications
78341                 var workbook = xlsx.xl['workbook.xml'];
78343                 $( 'sheets sheet', workbook ).attr( 'name', _sheetname( config ) );
78345                 // Auto filter for columns
78346                 if ( config.autoFilter ) {
78347                         $('mergeCells', rels).before( _createNode( rels, 'autoFilter', {
78348                                 attr: {
78349                                         ref: 'A'+dataStartRow+':'+createCellPos(data.header.length-1)+dataEndRow
78350                                 }
78351                         } ) );
78353                         $('definedNames', workbook).append( _createNode( workbook, 'definedName', {
78354                                 attr: {
78355                                         name: '_xlnm._FilterDatabase',
78356                                         localSheetId: '0',
78357                                         hidden: 1
78358                                 },
78359                                 text: _sheetname(config)+'!$A$'+dataStartRow+':'+createCellPos(data.header.length-1)+dataEndRow
78360                         } ) );
78361                 }
78363                 // Let the developer customise the document if they want to
78364                 if ( config.customize ) {
78365                         config.customize( xlsx, config, dt );
78366                 }
78368                 // Excel doesn't like an empty mergeCells tag
78369                 if ( $('mergeCells', rels).children().length === 0 ) {
78370                         $('mergeCells', rels).remove();
78371                 }
78373                 var jszip = _jsZip();
78374                 var zip = new jszip();
78375                 var zipConfig = {
78376                         type: 'blob',
78377                         mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
78378                 };
78380                 _addToZip( zip, xlsx );
78382                 if ( zip.generateAsync ) {
78383                         // JSZip 3+
78384                         zip
78385                                 .generateAsync( zipConfig )
78386                                 .then( function ( blob ) {
78387                                         _saveAs( blob, exportInfo.filename );
78388                                         that.processing( false );
78389                                 } );
78390                 }
78391                 else {
78392                         // JSZip 2.5
78393                         _saveAs(
78394                                 zip.generate( zipConfig ),
78395                                 exportInfo.filename
78396                         );
78397                         this.processing( false );
78398                 }
78399         },
78401         filename: '*',
78403         extension: '.xlsx',
78405         exportOptions: {},
78407         header: true,
78409         footer: false,
78411         title: '*',
78413         messageTop: '*',
78415         messageBottom: '*',
78417         createEmptyCells: false,
78419         autoFilter: false,
78421         sheetName: ''
78425 // PDF export - using pdfMake - http://pdfmake.org
78427 DataTable.ext.buttons.pdfHtml5 = {
78428         className: 'buttons-pdf buttons-html5',
78430         available: function () {
78431                 return window.FileReader !== undefined && _pdfMake();
78432         },
78434         text: function ( dt ) {
78435                 return dt.i18n( 'buttons.pdf', 'PDF' );
78436         },
78438         action: function ( e, dt, button, config ) {
78439                 this.processing( true );
78441                 var that = this;
78442                 var data = dt.buttons.exportData( config.exportOptions );
78443                 var info = dt.buttons.exportInfo( config );
78444                 var rows = [];
78446                 if ( config.header ) {
78447                         rows.push( $.map( data.header, function ( d ) {
78448                                 return {
78449                                         text: typeof d === 'string' ? d : d+'',
78450                                         style: 'tableHeader'
78451                                 };
78452                         } ) );
78453                 }
78455                 for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
78456                         rows.push( $.map( data.body[i], function ( d ) {
78457                                 if ( d === null || d === undefined ) {
78458                                         d = '';
78459                                 }
78460                                 return {
78461                                         text: typeof d === 'string' ? d : d+'',
78462                                         style: i % 2 ? 'tableBodyEven' : 'tableBodyOdd'
78463                                 };
78464                         } ) );
78465                 }
78467                 if ( config.footer && data.footer) {
78468                         rows.push( $.map( data.footer, function ( d ) {
78469                                 return {
78470                                         text: typeof d === 'string' ? d : d+'',
78471                                         style: 'tableFooter'
78472                                 };
78473                         } ) );
78474                 }
78476                 var doc = {
78477                         pageSize: config.pageSize,
78478                         pageOrientation: config.orientation,
78479                         content: [
78480                                 {
78481                                         table: {
78482                                                 headerRows: 1,
78483                                                 body: rows
78484                                         },
78485                                         layout: 'noBorders'
78486                                 }
78487                         ],
78488                         styles: {
78489                                 tableHeader: {
78490                                         bold: true,
78491                                         fontSize: 11,
78492                                         color: 'white',
78493                                         fillColor: '#2d4154',
78494                                         alignment: 'center'
78495                                 },
78496                                 tableBodyEven: {},
78497                                 tableBodyOdd: {
78498                                         fillColor: '#f3f3f3'
78499                                 },
78500                                 tableFooter: {
78501                                         bold: true,
78502                                         fontSize: 11,
78503                                         color: 'white',
78504                                         fillColor: '#2d4154'
78505                                 },
78506                                 title: {
78507                                         alignment: 'center',
78508                                         fontSize: 15
78509                                 },
78510                                 message: {}
78511                         },
78512                         defaultStyle: {
78513                                 fontSize: 10
78514                         }
78515                 };
78517                 if ( info.messageTop ) {
78518                         doc.content.unshift( {
78519                                 text: info.messageTop,
78520                                 style: 'message',
78521                                 margin: [ 0, 0, 0, 12 ]
78522                         } );
78523                 }
78525                 if ( info.messageBottom ) {
78526                         doc.content.push( {
78527                                 text: info.messageBottom,
78528                                 style: 'message',
78529                                 margin: [ 0, 0, 0, 12 ]
78530                         } );
78531                 }
78533                 if ( info.title ) {
78534                         doc.content.unshift( {
78535                                 text: info.title,
78536                                 style: 'title',
78537                                 margin: [ 0, 0, 0, 12 ]
78538                         } );
78539                 }
78541                 if ( config.customize ) {
78542                         config.customize( doc, config, dt );
78543                 }
78545                 var pdf = _pdfMake().createPdf( doc );
78547                 if ( config.download === 'open' && ! _isDuffSafari() ) {
78548                         pdf.open();
78549                 }
78550                 else {
78551                         pdf.download( info.filename );
78552                 }
78554                 this.processing( false );
78555         },
78557         title: '*',
78559         filename: '*',
78561         extension: '.pdf',
78563         exportOptions: {},
78565         orientation: 'portrait',
78567         pageSize: 'A4',
78569         header: true,
78571         footer: false,
78573         messageTop: '*',
78575         messageBottom: '*',
78577         customize: null,
78579         download: 'download'
78583 return DataTable.Buttons;
78584 }));
78588  * Print button for Buttons and DataTables.
78589  * 2016 SpryMedia Ltd - datatables.net/license
78590  */
78592 (function( factory ){
78593         if ( typeof define === 'function' && define.amd ) {
78594                 // AMD
78595                 define( ['jquery', 'datatables.net', 'datatables.net-buttons'], function ( $ ) {
78596                         return factory( $, window, document );
78597                 } );
78598         }
78599         else if ( typeof exports === 'object' ) {
78600                 // CommonJS
78601                 module.exports = function (root, $) {
78602                         if ( ! root ) {
78603                                 root = window;
78604                         }
78606                         if ( ! $ || ! $.fn.dataTable ) {
78607                                 $ = require('datatables.net')(root, $).$;
78608                         }
78610                         if ( ! $.fn.dataTable.Buttons ) {
78611                                 require('datatables.net-buttons')(root, $);
78612                         }
78614                         return factory( $, root, root.document );
78615                 };
78616         }
78617         else {
78618                 // Browser
78619                 factory( jQuery, window, document );
78620         }
78621 }(function( $, window, document, undefined ) {
78622 'use strict';
78623 var DataTable = $.fn.dataTable;
78626 var _link = document.createElement( 'a' );
78629  * Clone link and style tags, taking into account the need to change the source
78630  * path.
78632  * @param  {node}     el Element to convert
78633  */
78634 var _styleToAbs = function( el ) {
78635         var url;
78636         var clone = $(el).clone()[0];
78637         var linkHost;
78639         if ( clone.nodeName.toLowerCase() === 'link' ) {
78640                 clone.href = _relToAbs( clone.href );
78641         }
78643         return clone.outerHTML;
78647  * Convert a URL from a relative to an absolute address so it will work
78648  * correctly in the popup window which has no base URL.
78650  * @param  {string} href URL
78651  */
78652 var _relToAbs = function( href ) {
78653         // Assign to a link on the original page so the browser will do all the
78654         // hard work of figuring out where the file actually is
78655         _link.href = href;
78656         var linkHost = _link.host;
78658         // IE doesn't have a trailing slash on the host
78659         // Chrome has it on the pathname
78660         if ( linkHost.indexOf('/') === -1 && _link.pathname.indexOf('/') !== 0) {
78661                 linkHost += '/';
78662         }
78664         return _link.protocol+"//"+linkHost+_link.pathname+_link.search;
78668 DataTable.ext.buttons.print = {
78669         className: 'buttons-print',
78671         text: function ( dt ) {
78672                 return dt.i18n( 'buttons.print', 'Print' );
78673         },
78675         action: function ( e, dt, button, config ) {
78676                 var data = dt.buttons.exportData(
78677                         $.extend( {decodeEntities: false}, config.exportOptions ) // XSS protection
78678                 );
78679                 var exportInfo = dt.buttons.exportInfo( config );
78680                 var columnClasses = dt
78681                         .columns( config.exportOptions.columns )
78682                         .flatten()
78683                         .map( function (idx) {
78684                                 return dt.settings()[0].aoColumns[dt.column(idx).index()].sClass;
78685                         } )
78686                         .toArray();
78688                 var addRow = function ( d, tag ) {
78689                         var str = '<tr>';
78691                         for ( var i=0, ien=d.length ; i<ien ; i++ ) {
78692                                 // null and undefined aren't useful in the print output
78693                                 var dataOut = d[i] === null || d[i] === undefined ?
78694                                         '' :
78695                                         d[i];
78696                                 var classAttr = columnClasses[i] ?
78697                                         'class="'+columnClasses[i]+'"' :
78698                                         '';
78700                                 str += '<'+tag+' '+classAttr+'>'+dataOut+'</'+tag+'>';
78701                         }
78703                         return str + '</tr>';
78704                 };
78706                 // Construct a table for printing
78707                 var html = '<table class="'+dt.table().node().className+'">';
78709                 if ( config.header ) {
78710                         html += '<thead>'+ addRow( data.header, 'th' ) +'</thead>';
78711                 }
78713                 html += '<tbody>';
78714                 for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
78715                         html += addRow( data.body[i], 'td' );
78716                 }
78717                 html += '</tbody>';
78719                 if ( config.footer && data.footer ) {
78720                         html += '<tfoot>'+ addRow( data.footer, 'th' ) +'</tfoot>';
78721                 }
78722                 html += '</table>';
78724                 // Open a new window for the printable table
78725                 var win = window.open( '', '' );
78726                 win.document.close();
78728                 // Inject the title and also a copy of the style and link tags from this
78729                 // document so the table can retain its base styling. Note that we have
78730                 // to use string manipulation as IE won't allow elements to be created
78731                 // in the host document and then appended to the new window.
78732                 var head = '<title>'+exportInfo.title+'</title>';
78733                 $('style, link').each( function () {
78734                         head += _styleToAbs( this );
78735                 } );
78737                 try {
78738                         win.document.head.innerHTML = head; // Work around for Edge
78739                 }
78740                 catch (e) {
78741                         $(win.document.head).html( head ); // Old IE
78742                 }
78744                 // Inject the table and other surrounding information
78745                 win.document.body.innerHTML =
78746                         '<h1>'+exportInfo.title+'</h1>'+
78747                         '<div>'+(exportInfo.messageTop || '')+'</div>'+
78748                         html+
78749                         '<div>'+(exportInfo.messageBottom || '')+'</div>';
78751                 $(win.document.body).addClass('dt-print-view');
78753                 $('img', win.document.body).each( function ( i, img ) {
78754                         img.setAttribute( 'src', _relToAbs( img.getAttribute('src') ) );
78755                 } );
78757                 if ( config.customize ) {
78758                         config.customize( win, config, dt );
78759                 }
78761                 // Allow stylesheets time to load
78762                 var autoPrint = function () {
78763                         if ( config.autoPrint ) {
78764                                 win.print(); // blocking - so close will not
78765                                 win.close(); // execute until this is done
78766                         }
78767                 };
78769                 if ( navigator.userAgent.match(/Trident\/\d.\d/) ) { // IE needs to call this without a setTimeout
78770                         autoPrint();
78771                 }
78772                 else {
78773                         win.setTimeout( autoPrint, 1000 );
78774                 }
78775         },
78777         title: '*',
78779         messageTop: '*',
78781         messageBottom: '*',
78783         exportOptions: {},
78785         header: true,
78787         footer: false,
78789         autoPrint: true,
78791         customize: null
78795 return DataTable.Buttons;
78796 }));
78799 /*! FixedHeader 3.1.4
78800  * ©2009-2018 SpryMedia Ltd - datatables.net/license
78801  */
78804  * @summary     FixedHeader
78805  * @description Fix a table's header or footer, so it is always visible while
78806  *              scrolling
78807  * @version     3.1.4
78808  * @file        dataTables.fixedHeader.js
78809  * @author      SpryMedia Ltd (www.sprymedia.co.uk)
78810  * @contact     www.sprymedia.co.uk/contact
78811  * @copyright   Copyright 2009-2018 SpryMedia Ltd.
78813  * This source file is free software, available under the following license:
78814  *   MIT license - http://datatables.net/license/mit
78816  * This source file is distributed in the hope that it will be useful, but
78817  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
78818  * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
78820  * For details please refer to: http://www.datatables.net
78821  */
78823 (function( factory ){
78824         if ( typeof define === 'function' && define.amd ) {
78825                 // AMD
78826                 define( ['jquery', 'datatables.net'], function ( $ ) {
78827                         return factory( $, window, document );
78828                 } );
78829         }
78830         else if ( typeof exports === 'object' ) {
78831                 // CommonJS
78832                 module.exports = function (root, $) {
78833                         if ( ! root ) {
78834                                 root = window;
78835                         }
78837                         if ( ! $ || ! $.fn.dataTable ) {
78838                                 $ = require('datatables.net')(root, $).$;
78839                         }
78841                         return factory( $, root, root.document );
78842                 };
78843         }
78844         else {
78845                 // Browser
78846                 factory( jQuery, window, document );
78847         }
78848 }(function( $, window, document, undefined ) {
78849 'use strict';
78850 var DataTable = $.fn.dataTable;
78853 var _instCounter = 0;
78855 var FixedHeader = function ( dt, config ) {
78856         // Sanity check - you just know it will happen
78857         if ( ! (this instanceof FixedHeader) ) {
78858                 throw "FixedHeader must be initialised with the 'new' keyword.";
78859         }
78861         // Allow a boolean true for defaults
78862         if ( config === true ) {
78863                 config = {};
78864         }
78866         dt = new DataTable.Api( dt );
78868         this.c = $.extend( true, {}, FixedHeader.defaults, config );
78870         this.s = {
78871                 dt: dt,
78872                 position: {
78873                         theadTop: 0,
78874                         tbodyTop: 0,
78875                         tfootTop: 0,
78876                         tfootBottom: 0,
78877                         width: 0,
78878                         left: 0,
78879                         tfootHeight: 0,
78880                         theadHeight: 0,
78881                         windowHeight: $(window).height(),
78882                         visible: true
78883                 },
78884                 headerMode: null,
78885                 footerMode: null,
78886                 autoWidth: dt.settings()[0].oFeatures.bAutoWidth,
78887                 namespace: '.dtfc'+(_instCounter++),
78888                 scrollLeft: {
78889                         header: -1,
78890                         footer: -1
78891                 },
78892                 enable: true
78893         };
78895         this.dom = {
78896                 floatingHeader: null,
78897                 thead: $(dt.table().header()),
78898                 tbody: $(dt.table().body()),
78899                 tfoot: $(dt.table().footer()),
78900                 header: {
78901                         host: null,
78902                         floating: null,
78903                         placeholder: null
78904                 },
78905                 footer: {
78906                         host: null,
78907                         floating: null,
78908                         placeholder: null
78909                 }
78910         };
78912         this.dom.header.host = this.dom.thead.parent();
78913         this.dom.footer.host = this.dom.tfoot.parent();
78915         var dtSettings = dt.settings()[0];
78916         if ( dtSettings._fixedHeader ) {
78917                 throw "FixedHeader already initialised on table "+dtSettings.nTable.id;
78918         }
78920         dtSettings._fixedHeader = this;
78922         this._constructor();
78927  * Variable: FixedHeader
78928  * Purpose:  Prototype for FixedHeader
78929  * Scope:    global
78930  */
78931 $.extend( FixedHeader.prototype, {
78932         /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
78933          * API methods
78934          */
78936         /**
78937          * Enable / disable the fixed elements
78938          *
78939          * @param  {boolean} enable `true` to enable, `false` to disable
78940          */
78941         enable: function ( enable )
78942         {
78943                 this.s.enable = enable;
78945                 if ( this.c.header ) {
78946                         this._modeChange( 'in-place', 'header', true );
78947                 }
78949                 if ( this.c.footer && this.dom.tfoot.length ) {
78950                         this._modeChange( 'in-place', 'footer', true );
78951                 }
78953                 this.update();
78954         },
78956         /**
78957          * Set header offset
78958          *
78959          * @param  {int} new value for headerOffset
78960          */
78961         headerOffset: function ( offset )
78962         {
78963                 if ( offset !== undefined ) {
78964                         this.c.headerOffset = offset;
78965                         this.update();
78966                 }
78968                 return this.c.headerOffset;
78969         },
78971         /**
78972          * Set footer offset
78973          *
78974          * @param  {int} new value for footerOffset
78975          */
78976         footerOffset: function ( offset )
78977         {
78978                 if ( offset !== undefined ) {
78979                         this.c.footerOffset = offset;
78980                         this.update();
78981                 }
78983                 return this.c.footerOffset;
78984         },
78987         /**
78988          * Recalculate the position of the fixed elements and force them into place
78989          */
78990         update: function ()
78991         {
78992                 this._positions();
78993                 this._scroll( true );
78994         },
78997         /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
78998          * Constructor
78999          */
79001         /**
79002          * FixedHeader constructor - adding the required event listeners and
79003          * simple initialisation
79004          *
79005          * @private
79006          */
79007         _constructor: function ()
79008         {
79009                 var that = this;
79010                 var dt = this.s.dt;
79012                 $(window)
79013                         .on( 'scroll'+this.s.namespace, function () {
79014                                 that._scroll();
79015                         } )
79016                         .on( 'resize'+this.s.namespace, DataTable.util.throttle( function () {
79017                                 that.s.position.windowHeight = $(window).height();
79018                                 that.update();
79019                         }, 50 ) );
79021                 var autoHeader = $('.fh-fixedHeader');
79022                 if ( ! this.c.headerOffset && autoHeader.length ) {
79023                         this.c.headerOffset = autoHeader.outerHeight();
79024                 }
79026                 var autoFooter = $('.fh-fixedFooter');
79027                 if ( ! this.c.footerOffset && autoFooter.length ) {
79028                         this.c.footerOffset = autoFooter.outerHeight();
79029                 }
79031                 dt.on( 'column-reorder.dt.dtfc column-visibility.dt.dtfc draw.dt.dtfc column-sizing.dt.dtfc responsive-display.dt.dtfc', function () {
79032                         that.update();
79033                 } );
79035                 dt.on( 'destroy.dtfc', function () {
79036                         if ( that.c.header ) {
79037                                 that._modeChange( 'in-place', 'header', true );
79038                         }
79040                         if ( that.c.footer && that.dom.tfoot.length ) {
79041                                 that._modeChange( 'in-place', 'footer', true );
79042                         }
79044                         dt.off( '.dtfc' );
79045                         $(window).off( that.s.namespace );
79046                 } );
79048                 this._positions();
79049                 this._scroll();
79050         },
79053         /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
79054          * Private methods
79055          */
79057         /**
79058          * Clone a fixed item to act as a place holder for the original element
79059          * which is moved into a clone of the table element, and moved around the
79060          * document to give the fixed effect.
79061          *
79062          * @param  {string}  item  'header' or 'footer'
79063          * @param  {boolean} force Force the clone to happen, or allow automatic
79064          *   decision (reuse existing if available)
79065          * @private
79066          */
79067         _clone: function ( item, force )
79068         {
79069                 var dt = this.s.dt;
79070                 var itemDom = this.dom[ item ];
79071                 var itemElement = item === 'header' ?
79072                         this.dom.thead :
79073                         this.dom.tfoot;
79075                 if ( ! force && itemDom.floating ) {
79076                         // existing floating element - reuse it
79077                         itemDom.floating.removeClass( 'fixedHeader-floating fixedHeader-locked' );
79078                 }
79079                 else {
79080                         if ( itemDom.floating ) {
79081                                 itemDom.placeholder.remove();
79082                                 this._unsize( item );
79083                                 itemDom.floating.children().detach();
79084                                 itemDom.floating.remove();
79085                         }
79087                         itemDom.floating = $( dt.table().node().cloneNode( false ) )
79088                                 .css( 'table-layout', 'fixed' )
79089                                 .attr( 'aria-hidden', 'true' )
79090                                 .removeAttr( 'id' )
79091                                 .append( itemElement )
79092                                 .appendTo( 'body' );
79094                         // Insert a fake thead/tfoot into the DataTable to stop it jumping around
79095                         itemDom.placeholder = itemElement.clone( false )
79096                         itemDom.placeholder
79097                                 .find( '*[id]' )
79098                                 .removeAttr( 'id' );
79100                         itemDom.host.prepend( itemDom.placeholder );
79102                         // Clone widths
79103                         this._matchWidths( itemDom.placeholder, itemDom.floating );
79104                 }
79105         },
79107         /**
79108          * Copy widths from the cells in one element to another. This is required
79109          * for the footer as the footer in the main table takes its sizes from the
79110          * header columns. That isn't present in the footer so to have it still
79111          * align correctly, the sizes need to be copied over. It is also required
79112          * for the header when auto width is not enabled
79113          *
79114          * @param  {jQuery} from Copy widths from
79115          * @param  {jQuery} to   Copy widths to
79116          * @private
79117          */
79118         _matchWidths: function ( from, to ) {
79119                 var get = function ( name ) {
79120                         return $(name, from)
79121                                 .map( function () {
79122                                         return $(this).width();
79123                                 } ).toArray();
79124                 };
79126                 var set = function ( name, toWidths ) {
79127                         $(name, to).each( function ( i ) {
79128                                 $(this).css( {
79129                                         width: toWidths[i],
79130                                         minWidth: toWidths[i]
79131                                 } );
79132                         } );
79133                 };
79135                 var thWidths = get( 'th' );
79136                 var tdWidths = get( 'td' );
79138                 set( 'th', thWidths );
79139                 set( 'td', tdWidths );
79140         },
79142         /**
79143          * Remove assigned widths from the cells in an element. This is required
79144          * when inserting the footer back into the main table so the size is defined
79145          * by the header columns and also when auto width is disabled in the
79146          * DataTable.
79147          *
79148          * @param  {string} item The `header` or `footer`
79149          * @private
79150          */
79151         _unsize: function ( item ) {
79152                 var el = this.dom[ item ].floating;
79154                 if ( el && (item === 'footer' || (item === 'header' && ! this.s.autoWidth)) ) {
79155                         $('th, td', el).css( {
79156                                 width: '',
79157                                 minWidth: ''
79158                         } );
79159                 }
79160                 else if ( el && item === 'header' ) {
79161                         $('th, td', el).css( 'min-width', '' );
79162                 }
79163         },
79165         /**
79166          * Reposition the floating elements to take account of horizontal page
79167          * scroll
79168          *
79169          * @param  {string} item       The `header` or `footer`
79170          * @param  {int}    scrollLeft Document scrollLeft
79171          * @private
79172          */
79173         _horizontal: function ( item, scrollLeft )
79174         {
79175                 var itemDom = this.dom[ item ];
79176                 var position = this.s.position;
79177                 var lastScrollLeft = this.s.scrollLeft;
79179                 if ( itemDom.floating && lastScrollLeft[ item ] !== scrollLeft ) {
79180                         itemDom.floating.css( 'left', position.left - scrollLeft );
79182                         lastScrollLeft[ item ] = scrollLeft;
79183                 }
79184         },
79186         /**
79187          * Change from one display mode to another. Each fixed item can be in one
79188          * of:
79189          *
79190          * * `in-place` - In the main DataTable
79191          * * `in` - Floating over the DataTable
79192          * * `below` - (Header only) Fixed to the bottom of the table body
79193          * * `above` - (Footer only) Fixed to the top of the table body
79194          *
79195          * @param  {string}  mode        Mode that the item should be shown in
79196          * @param  {string}  item        'header' or 'footer'
79197          * @param  {boolean} forceChange Force a redraw of the mode, even if already
79198          *     in that mode.
79199          * @private
79200          */
79201         _modeChange: function ( mode, item, forceChange )
79202         {
79203                 var dt = this.s.dt;
79204                 var itemDom = this.dom[ item ];
79205                 var position = this.s.position;
79207                 // Record focus. Browser's will cause input elements to loose focus if
79208                 // they are inserted else where in the doc
79209                 var tablePart = this.dom[ item==='footer' ? 'tfoot' : 'thead' ];
79210                 var focus = $.contains( tablePart[0], document.activeElement ) ?
79211                         document.activeElement :
79212                         null;
79214                 if ( focus ) {
79215                         focus.blur();
79216                 }
79218                 if ( mode === 'in-place' ) {
79219                         // Insert the header back into the table's real header
79220                         if ( itemDom.placeholder ) {
79221                                 itemDom.placeholder.remove();
79222                                 itemDom.placeholder = null;
79223                         }
79225                         this._unsize( item );
79227                         if ( item === 'header' ) {
79228                                 itemDom.host.prepend( tablePart );
79229                         }
79230                         else {
79231                                 itemDom.host.append( tablePart );
79232                         }
79234                         if ( itemDom.floating ) {
79235                                 itemDom.floating.remove();
79236                                 itemDom.floating = null;
79237                         }
79238                 }
79239                 else if ( mode === 'in' ) {
79240                         // Remove the header from the read header and insert into a fixed
79241                         // positioned floating table clone
79242                         this._clone( item, forceChange );
79244                         itemDom.floating
79245                                 .addClass( 'fixedHeader-floating' )
79246                                 .css( item === 'header' ? 'top' : 'bottom', this.c[item+'Offset'] )
79247                                 .css( 'left', position.left+'px' )
79248                                 .css( 'width', position.width+'px' );
79250                         if ( item === 'footer' ) {
79251                                 itemDom.floating.css( 'top', '' );
79252                         }
79253                 }
79254                 else if ( mode === 'below' ) { // only used for the header
79255                         // Fix the position of the floating header at base of the table body
79256                         this._clone( item, forceChange );
79258                         itemDom.floating
79259                                 .addClass( 'fixedHeader-locked' )
79260                                 .css( 'top', position.tfootTop - position.theadHeight )
79261                                 .css( 'left', position.left+'px' )
79262                                 .css( 'width', position.width+'px' );
79263                 }
79264                 else if ( mode === 'above' ) { // only used for the footer
79265                         // Fix the position of the floating footer at top of the table body
79266                         this._clone( item, forceChange );
79268                         itemDom.floating
79269                                 .addClass( 'fixedHeader-locked' )
79270                                 .css( 'top', position.tbodyTop )
79271                                 .css( 'left', position.left+'px' )
79272                                 .css( 'width', position.width+'px' );
79273                 }
79275                 // Restore focus if it was lost
79276                 if ( focus && focus !== document.activeElement ) {
79277                         setTimeout( function () {
79278                                 focus.focus();
79279                         }, 10 );
79280                 }
79282                 this.s.scrollLeft.header = -1;
79283                 this.s.scrollLeft.footer = -1;
79284                 this.s[item+'Mode'] = mode;
79285         },
79287         /**
79288          * Cache the positional information that is required for the mode
79289          * calculations that FixedHeader performs.
79290          *
79291          * @private
79292          */
79293         _positions: function ()
79294         {
79295                 var dt = this.s.dt;
79296                 var table = dt.table();
79297                 var position = this.s.position;
79298                 var dom = this.dom;
79299                 var tableNode = $(table.node());
79301                 // Need to use the header and footer that are in the main table,
79302                 // regardless of if they are clones, since they hold the positions we
79303                 // want to measure from
79304                 var thead = tableNode.children('thead');
79305                 var tfoot = tableNode.children('tfoot');
79306                 var tbody = dom.tbody;
79308                 position.visible = tableNode.is(':visible');
79309                 position.width = tableNode.outerWidth();
79310                 position.left = tableNode.offset().left;
79311                 position.theadTop = thead.offset().top;
79312                 position.tbodyTop = tbody.offset().top;
79313                 position.theadHeight = position.tbodyTop - position.theadTop;
79315                 if ( tfoot.length ) {
79316                         position.tfootTop = tfoot.offset().top;
79317                         position.tfootBottom = position.tfootTop + tfoot.outerHeight();
79318                         position.tfootHeight = position.tfootBottom - position.tfootTop;
79319                 }
79320                 else {
79321                         position.tfootTop = position.tbodyTop + tbody.outerHeight();
79322                         position.tfootBottom = position.tfootTop;
79323                         position.tfootHeight = position.tfootTop;
79324                 }
79325         },
79328         /**
79329          * Mode calculation - determine what mode the fixed items should be placed
79330          * into.
79331          *
79332          * @param  {boolean} forceChange Force a redraw of the mode, even if already
79333          *     in that mode.
79334          * @private
79335          */
79336         _scroll: function ( forceChange )
79337         {
79338                 var windowTop = $(document).scrollTop();
79339                 var windowLeft = $(document).scrollLeft();
79340                 var position = this.s.position;
79341                 var headerMode, footerMode;
79343                 if ( ! this.s.enable ) {
79344                         return;
79345                 }
79347                 if ( this.c.header ) {
79348                         if ( ! position.visible || windowTop <= position.theadTop - this.c.headerOffset ) {
79349                                 headerMode = 'in-place';
79350                         }
79351                         else if ( windowTop <= position.tfootTop - position.theadHeight - this.c.headerOffset ) {
79352                                 headerMode = 'in';
79353                         }
79354                         else {
79355                                 headerMode = 'below';
79356                         }
79358                         if ( forceChange || headerMode !== this.s.headerMode ) {
79359                                 this._modeChange( headerMode, 'header', forceChange );
79360                         }
79362                         this._horizontal( 'header', windowLeft );
79363                 }
79365                 if ( this.c.footer && this.dom.tfoot.length ) {
79366                         if ( ! position.visible || windowTop + position.windowHeight >= position.tfootBottom + this.c.footerOffset ) {
79367                                 footerMode = 'in-place';
79368                         }
79369                         else if ( position.windowHeight + windowTop > position.tbodyTop + position.tfootHeight + this.c.footerOffset ) {
79370                                 footerMode = 'in';
79371                         }
79372                         else {
79373                                 footerMode = 'above';
79374                         }
79376                         if ( forceChange || footerMode !== this.s.footerMode ) {
79377                                 this._modeChange( footerMode, 'footer', forceChange );
79378                         }
79380                         this._horizontal( 'footer', windowLeft );
79381                 }
79382         }
79383 } );
79387  * Version
79388  * @type {String}
79389  * @static
79390  */
79391 FixedHeader.version = "3.1.4";
79394  * Defaults
79395  * @type {Object}
79396  * @static
79397  */
79398 FixedHeader.defaults = {
79399         header: true,
79400         footer: false,
79401         headerOffset: 0,
79402         footerOffset: 0
79406 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
79407  * DataTables interfaces
79408  */
79410 // Attach for constructor access
79411 $.fn.dataTable.FixedHeader = FixedHeader;
79412 $.fn.DataTable.FixedHeader = FixedHeader;
79415 // DataTables creation - check if the FixedHeader option has been defined on the
79416 // table and if so, initialise
79417 $(document).on( 'init.dt.dtfh', function (e, settings, json) {
79418         if ( e.namespace !== 'dt' ) {
79419                 return;
79420         }
79422         var init = settings.oInit.fixedHeader;
79423         var defaults = DataTable.defaults.fixedHeader;
79425         if ( (init || defaults) && ! settings._fixedHeader ) {
79426                 var opts = $.extend( {}, defaults, init );
79428                 if ( init !== false ) {
79429                         new FixedHeader( settings, opts );
79430                 }
79431         }
79432 } );
79434 // DataTables API methods
79435 DataTable.Api.register( 'fixedHeader()', function () {} );
79437 DataTable.Api.register( 'fixedHeader.adjust()', function () {
79438         return this.iterator( 'table', function ( ctx ) {
79439                 var fh = ctx._fixedHeader;
79441                 if ( fh ) {
79442                         fh.update();
79443                 }
79444         } );
79445 } );
79447 DataTable.Api.register( 'fixedHeader.enable()', function ( flag ) {
79448         return this.iterator( 'table', function ( ctx ) {
79449                 var fh = ctx._fixedHeader;
79451                 flag = ( flag !== undefined ? flag : true );
79452                 if ( fh && flag !== fh.s.enable ) {
79453                         fh.enable( flag );
79454                 }
79455         } );
79456 } );
79458 DataTable.Api.register( 'fixedHeader.disable()', function ( ) {
79459         return this.iterator( 'table', function ( ctx ) {
79460                 var fh = ctx._fixedHeader;
79462                 if ( fh && fh.s.enable ) {
79463                         fh.enable( false );
79464                 }
79465         } );
79466 } );
79468 $.each( ['header', 'footer'], function ( i, el ) {
79469         DataTable.Api.register( 'fixedHeader.'+el+'Offset()', function ( offset ) {
79470                 var ctx = this.context;
79472                 if ( offset === undefined ) {
79473                         return ctx.length && ctx[0]._fixedHeader ?
79474                                 ctx[0]._fixedHeader[el +'Offset']() :
79475                                 undefined;
79476                 }
79478                 return this.iterator( 'table', function ( ctx ) {
79479                         var fh = ctx._fixedHeader;
79481                         if ( fh ) {
79482                                 fh[ el +'Offset' ]( offset );
79483                         }
79484                 } );
79485         } );
79486 } );
79489 return FixedHeader;
79490 }));