Bug 24193: Add CodeMirror linting of JavaScript, CSS, HTML, and YAML
[koha.git] / koha-tmpl / intranet-tmpl / lib / linters / jshint.js
blob6ce0fdc068a197ef5e132d851eb1da56d41a6806
1 /*! 2.9.7 */
2 var JSHINT;
3 if (typeof window === 'undefined') window = {};
4 (function () {
5 var require;
6 require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
7 var identifierStartTable = [];
9 for (var i = 0; i < 128; i++) {
10   identifierStartTable[i] =
11     i === 36 ||           // $
12     i >= 65 && i <= 90 || // A-Z
13     i === 95 ||           // _
14     i >= 97 && i <= 122;  // a-z
17 var identifierPartTable = [];
19 for (var i = 0; i < 128; i++) {
20   identifierPartTable[i] =
21     identifierStartTable[i] || // $, _, A-Z, a-z
22     i >= 48 && i <= 57;        // 0-9
25 module.exports = {
26   asciiIdentifierStartTable: identifierStartTable,
27   asciiIdentifierPartTable: identifierPartTable
30 },{}],2:[function(require,module,exports){
31 module.exports = /^(?:[\$A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0525\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0621-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971\u0972\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3D\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC\u0EDD\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8B\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10D0-\u10FA\u10FC\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u2094\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2D00-\u2D25\u2D30-\u2D65\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31B7\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCB\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA65F\uA662-\uA66E\uA67F-\uA697\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B\uA78C\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA2D\uFA30-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC])(?:[\$0-9A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u0525\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0621-\u065E\u0660-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0900-\u0939\u093C-\u094E\u0950-\u0955\u0958-\u0963\u0966-\u096F\u0971\u0972\u0979-\u097F\u0981-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C82\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0D02\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC\u0EDD\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F8B\u0F90-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10D0-\u10FA\u10FC\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17B3\u17B6-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191C\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BAA\u1BAE-\u1BB9\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF2\u1D00-\u1DE6\u1DFD-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u2094\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF1\u2D00-\u2D25\u2D30-\u2D65\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31B7\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCB\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA65F\uA662-\uA66F\uA67C\uA67D\uA67F-\uA697\uA6A0-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B\uA78C\uA7FB-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7B\uAA80-\uAAC2\uAADB-\uAADD\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA2D\uFA30-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE26\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC])*$/;
32 },{}],3:[function(require,module,exports){
33 var str = '183,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,903,1155,1156,1157,1158,1159,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1471,1473,1474,1476,1477,1479,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1648,1750,1751,1752,1753,1754,1755,1756,1759,1760,1761,1762,1763,1764,1767,1768,1770,1771,1772,1773,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1809,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,2027,2028,2029,2030,2031,2032,2033,2034,2035,2045,2070,2071,2072,2073,2075,2076,2077,2078,2079,2080,2081,2082,2083,2085,2086,2087,2089,2090,2091,2092,2093,2137,2138,2139,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2362,2363,2364,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2385,2386,2387,2388,2389,2390,2391,2402,2403,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2433,2434,2435,2492,2494,2495,2496,2497,2498,2499,2500,2503,2504,2507,2508,2509,2519,2530,2531,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2558,2561,2562,2563,2620,2622,2623,2624,2625,2626,2631,2632,2635,2636,2637,2641,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2677,2689,2690,2691,2748,2750,2751,2752,2753,2754,2755,2756,2757,2759,2760,2761,2763,2764,2765,2786,2787,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2810,2811,2812,2813,2814,2815,2817,2818,2819,2876,2878,2879,2880,2881,2882,2883,2884,2887,2888,2891,2892,2893,2902,2903,2914,2915,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2946,3006,3007,3008,3009,3010,3014,3015,3016,3018,3019,3020,3021,3031,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3072,3073,3074,3075,3076,3134,3135,3136,3137,3138,3139,3140,3142,3143,3144,3146,3147,3148,3149,3157,3158,3170,3171,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3201,3202,3203,3260,3262,3263,3264,3265,3266,3267,3268,3270,3271,3272,3274,3275,3276,3277,3285,3286,3298,3299,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3328,3329,3330,3331,3387,3388,3390,3391,3392,3393,3394,3395,3396,3398,3399,3400,3402,3403,3404,3405,3415,3426,3427,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3458,3459,3530,3535,3536,3537,3538,3539,3540,3542,3544,3545,3546,3547,3548,3549,3550,3551,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3570,3571,3633,3636,3637,3638,3639,3640,3641,3642,3655,3656,3657,3658,3659,3660,3661,3662,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3761,3764,3765,3766,3767,3768,3769,3771,3772,3784,3785,3786,3787,3788,3789,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3864,3865,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3893,3895,3897,3902,3903,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3974,3975,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4038,4139,4140,4141,4142,4143,4144,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157,4158,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4182,4183,4184,4185,4190,4191,4192,4194,4195,4196,4199,4200,4201,4202,4203,4204,4205,4209,4210,4211,4212,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4239,4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,4250,4251,4252,4253,4957,4958,4959,4969,4970,4971,4972,4973,4974,4975,4976,4977,5906,5907,5908,5938,5939,5940,5970,5971,6002,6003,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6109,6112,6113,6114,6115,6116,6117,6118,6119,6120,6121,6155,6156,6157,6160,6161,6162,6163,6164,6165,6166,6167,6168,6169,6313,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6448,6449,6450,6451,6452,6453,6454,6455,6456,6457,6458,6459,6470,6471,6472,6473,6474,6475,6476,6477,6478,6479,6608,6609,6610,6611,6612,6613,6614,6615,6616,6617,6618,6679,6680,6681,6682,6683,6741,6742,6743,6744,6745,6746,6747,6748,6749,6750,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761,6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779,6780,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,6832,6833,6834,6835,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6912,6913,6914,6915,6916,6964,6965,6966,6967,6968,6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6992,6993,6994,6995,6996,6997,6998,6999,7000,7001,7019,7020,7021,7022,7023,7024,7025,7026,7027,7040,7041,7042,7073,7074,7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7088,7089,7090,7091,7092,7093,7094,7095,7096,7097,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154,7155,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213,7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7376,7377,7378,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400,7405,7410,7411,7412,7415,7416,7417,7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7675,7676,7677,7678,7679,8204,8205,8255,8256,8276,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8417,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,11503,11504,11505,11647,11744,11745,11746,11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,12330,12331,12332,12333,12334,12335,12441,12442,42528,42529,42530,42531,42532,42533,42534,42535,42536,42537,42607,42612,42613,42614,42615,42616,42617,42618,42619,42620,42621,42654,42655,42736,42737,43010,43014,43019,43043,43044,43045,43046,43047,43136,43137,43188,43189,43190,43191,43192,43193,43194,43195,43196,43197,43198,43199,43200,43201,43202,43203,43204,43205,43216,43217,43218,43219,43220,43221,43222,43223,43224,43225,43232,43233,43234,43235,43236,43237,43238,43239,43240,43241,43242,43243,43244,43245,43246,43247,43248,43249,43263,43264,43265,43266,43267,43268,43269,43270,43271,43272,43273,43302,43303,43304,43305,43306,43307,43308,43309,43335,43336,43337,43338,43339,43340,43341,43342,43343,43344,43345,43346,43347,43392,43393,43394,43395,43443,43444,43445,43446,43447,43448,43449,43450,43451,43452,43453,43454,43455,43456,43472,43473,43474,43475,43476,43477,43478,43479,43480,43481,43493,43504,43505,43506,43507,43508,43509,43510,43511,43512,43513,43561,43562,43563,43564,43565,43566,43567,43568,43569,43570,43571,43572,43573,43574,43587,43596,43597,43600,43601,43602,43603,43604,43605,43606,43607,43608,43609,43643,43644,43645,43696,43698,43699,43700,43703,43704,43710,43711,43713,43755,43756,43757,43758,43759,43765,43766,44003,44004,44005,44006,44007,44008,44009,44010,44012,44013,44016,44017,44018,44019,44020,44021,44022,44023,44024,44025,64286,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65056,65057,65058,65059,65060,65061,65062,65063,65064,65065,65066,65067,65068,65069,65070,65071,65075,65076,65101,65102,65103,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65343';
34 var arr = str.split(',').map(function(code) {
35   return parseInt(code, 10);
36 });
37 module.exports = arr;
38 },{}],4:[function(require,module,exports){
39 var str = '170,181,186,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,710,711,712,713,714,715,716,717,718,719,720,721,736,737,738,739,740,748,750,880,881,882,883,884,886,887,890,891,892,893,895,902,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1369,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1519,1520,1521,1522,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1646,1647,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1749,1765,1766,1774,1775,1786,1787,1788,1791,1808,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1969,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2036,2037,2042,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2074,2084,2088,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2230,2231,2232,2233,2234,2235,2236,2237,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2365,2384,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2437,2438,2439,2440,2441,2442,2443,2444,2447,2448,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2474,2475,2476,2477,2478,2479,2480,2482,2486,2487,2488,2489,2493,2510,2524,2525,2527,2528,2529,2544,2545,2556,2565,2566,2567,2568,2569,2570,2575,2576,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2602,2603,2604,2605,2606,2607,2608,2610,2611,2613,2614,2616,2617,2649,2650,2651,2652,2654,2674,2675,2676,2693,2694,2695,2696,2697,2698,2699,2700,2701,2703,2704,2705,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2730,2731,2732,2733,2734,2735,2736,2738,2739,2741,2742,2743,2744,2745,2749,2768,2784,2785,2809,2821,2822,2823,2824,2825,2826,2827,2828,2831,2832,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2858,2859,2860,2861,2862,2863,2864,2866,2867,2869,2870,2871,2872,2873,2877,2908,2909,2911,2912,2913,2929,2947,2949,2950,2951,2952,2953,2954,2958,2959,2960,2962,2963,2964,2965,2969,2970,2972,2974,2975,2979,2980,2984,2985,2986,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3024,3077,3078,3079,3080,3081,3082,3083,3084,3086,3087,3088,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3133,3160,3161,3162,3168,3169,3200,3205,3206,3207,3208,3209,3210,3211,3212,3214,3215,3216,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3253,3254,3255,3256,3257,3261,3294,3296,3297,3313,3314,3333,3334,3335,3336,3337,3338,3339,3340,3342,3343,3344,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3389,3406,3412,3413,3414,3423,3424,3425,3450,3451,3452,3453,3454,3455,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3507,3508,3509,3510,3511,3512,3513,3514,3515,3517,3520,3521,3522,3523,3524,3525,3526,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3634,3635,3648,3649,3650,3651,3652,3653,3654,3713,3714,3716,3719,3720,3722,3725,3732,3733,3734,3735,3737,3738,3739,3740,3741,3742,3743,3745,3746,3747,3749,3751,3754,3755,3757,3758,3759,3760,3762,3763,3773,3776,3777,3778,3779,3780,3782,3804,3805,3806,3807,3840,3904,3905,3906,3907,3908,3909,3910,3911,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3976,3977,3978,3979,3980,4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,4138,4159,4176,4177,4178,4179,4180,4181,4186,4187,4188,4189,4193,4197,4198,4206,4207,4208,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,4225,4238,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419,4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,4675,4676,4677,4678,4679,4680,4682,4683,4684,4685,4688,4689,4690,4691,4692,4693,4694,4696,4698,4699,4700,4701,4704,4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4746,4747,4748,4749,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,4780,4781,4782,4783,4784,4786,4787,4788,4789,4792,4793,4794,4795,4796,4797,4798,4800,4802,4803,4804,4805,4808,4809,4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4824,4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4882,4883,4884,4885,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,5112,5113,5114,5115,5116,5117,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5792,5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5870,5871,5872,5873,5874,5875,5876,5877,5878,5879,5880,5888,5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5902,5903,5904,5905,5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5998,5999,6000,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6103,6108,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264,6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6312,6314,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429,6430,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504,6505,6506,6507,6508,6509,6512,6513,6514,6515,6516,6528,6529,6530,6531,6532,6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,6566,6567,6568,6569,6570,6571,6576,6577,6578,6579,6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,6675,6676,6677,6678,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6823,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6981,6982,6983,6984,6985,6986,6987,7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7086,7087,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,7139,7140,7141,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,7203,7245,7246,7247,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7296,7297,7298,7299,7300,7301,7302,7303,7304,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7357,7358,7359,7401,7402,7403,7404,7406,7407,7408,7409,7413,7414,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7960,7961,7962,7963,7964,7965,7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,8000,8001,8002,8003,8004,8005,8008,8009,8010,8011,8012,8013,8016,8017,8018,8019,8020,8021,8022,8023,8025,8027,8029,8031,8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8112,8113,8114,8115,8116,8118,8119,8120,8121,8122,8123,8124,8126,8130,8131,8132,8134,8135,8136,8137,8138,8139,8140,8144,8145,8146,8147,8150,8151,8152,8153,8154,8155,8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8178,8179,8180,8182,8183,8184,8185,8186,8187,8188,8305,8319,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8450,8455,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8469,8472,8473,8474,8475,8476,8477,8484,8486,8488,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8508,8509,8510,8511,8517,8518,8519,8520,8521,8526,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11360,11361,11362,11363,11364,11365,11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,11378,11379,11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410,11411,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425,11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441,11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457,11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,11470,11471,11472,11473,11474,11475,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486,11487,11488,11489,11490,11491,11492,11499,11500,11501,11502,11506,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578,11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622,11623,11631,11648,11649,11650,11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670,11680,11681,11682,11683,11684,11685,11686,11688,11689,11690,11691,11692,11693,11694,11696,11697,11698,11699,11700,11701,11702,11704,11705,11706,11707,11708,11709,11710,11712,11713,11714,11715,11716,11717,11718,11720,11721,11722,11723,11724,11725,11726,11728,11729,11730,11731,11732,11733,11734,11736,11737,11738,11739,11740,11741,11742,12293,12294,12295,12321,12322,12323,12324,12325,12326,12327,12328,12329,12337,12338,12339,12340,12341,12344,12345,12346,12347,12348,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12436,12437,12438,12443,12444,12445,12446,12447,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12540,12541,12542,12543,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586,12587,12588,12589,12590,12591,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,12704,12705,12706,12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414,13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522,13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570,13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618,13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642,13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554,14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566,14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578,14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590,14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614,14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626,14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638,14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650,14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662,14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710,14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722,14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758,14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770,14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782,14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806,14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818,14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830,14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854,14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866,14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890,14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902,14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962,14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974,14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998,14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034,15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046,15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058,15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070,15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082,15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094,15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106,15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118,15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130,15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142,15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154,15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166,15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178,15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190,15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202,15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214,15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238,15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250,15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262,15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274,15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286,15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298,15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310,15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334,15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346,15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382,15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394,15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406,15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418,15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430,15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442,15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454,15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466,15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478,15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490,15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502,15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514,15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526,15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538,15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550,15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562,15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574,15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586,15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598,15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622,15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646,15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658,15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670,15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682,15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694,15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718,15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730,15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754,15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778,15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802,15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814,15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826,15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838,15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850,15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874,15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898,15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910,15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922,15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934,15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946,15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958,15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970,15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982,15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006,16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066,16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078,16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090,16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102,16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114,16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138,16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162,16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174,16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186,16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198,16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210,16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222,16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234,16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246,16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294,16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306,16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318,16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330,16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342,16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354,16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366,16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390,16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402,16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414,16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426,16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438,16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450,16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462,16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474,16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486,16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498,16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510,16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558,16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570,16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582,16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594,16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618,16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702,16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714,16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762,16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774,16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786,16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810,16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822,16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834,16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846,16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858,16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870,16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882,16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894,16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906,16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918,16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930,16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942,16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966,16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978,16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990,16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002,17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014,17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026,17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038,17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050,17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062,17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110,17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134,17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146,17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158,17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170,17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182,17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194,17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206,17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218,17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230,17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242,17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254,17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266,17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278,17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290,17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302,17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314,17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326,17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338,17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350,17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362,17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374,17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386,17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398,17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410,17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422,17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434,17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446,17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458,17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470,17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482,17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494,17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506,17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518,17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530,17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542,17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554,17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566,17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578,17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590,17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602,17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614,17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626,17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638,17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650,17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674,17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686,17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698,17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710,17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722,17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734,17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746,17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758,17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770,17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782,17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794,17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806,17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830,17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842,17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854,17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866,17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878,17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890,17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902,17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914,17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926,17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938,17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950,17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962,17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974,17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986,17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998,17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010,18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034,18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046,18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058,18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070,18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082,18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106,18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118,18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130,18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142,18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154,18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166,18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178,18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190,18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202,18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214,18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226,18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238,18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250,18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262,18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274,18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286,18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298,18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310,18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322,18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334,18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346,18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358,18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370,18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382,18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394,18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406,18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418,18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430,18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442,18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466,18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478,18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490,18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502,18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514,18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526,18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538,18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550,18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562,18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574,18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586,18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598,18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610,18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622,18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634,18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646,18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658,18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670,18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682,18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694,18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706,18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718,18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730,18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742,18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754,18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766,18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778,18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790,18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802,18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814,18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826,18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838,18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850,18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862,18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874,18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886,18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898,18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910,18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922,18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934,18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946,18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958,18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970,18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982,18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994,18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006,19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018,19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030,19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042,19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054,19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066,19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090,19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102,19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114,19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126,19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138,19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150,19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162,19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174,19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186,19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198,19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210,19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222,19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234,19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246,19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258,19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270,19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282,19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294,19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306,19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318,19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330,19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342,19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354,19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366,19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378,19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390,19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402,19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414,19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426,19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438,19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450,19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462,19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474,19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486,19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498,19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522,19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534,19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546,19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558,19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570,19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582,19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594,19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606,19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618,19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630,19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642,19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654,19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666,19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678,19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690,19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702,19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714,19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726,19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738,19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750,19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762,19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774,19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822,19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834,19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846,19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858,19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870,19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882,19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978,19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990,19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002,20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098,20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110,20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122,20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134,20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146,20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158,20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170,20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182,20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194,20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206,20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218,20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230,20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242,20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254,20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266,20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278,20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290,20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302,20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314,20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326,20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338,20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350,20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362,20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374,20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386,20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410,20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422,20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434,20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446,20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458,20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470,20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494,20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506,20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518,20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542,20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554,20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566,20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578,20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590,20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602,20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614,20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650,20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662,20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710,20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722,20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746,20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806,20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818,20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830,20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842,20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854,20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866,20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878,20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890,20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902,20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914,20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926,20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938,20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950,20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962,20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974,20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986,20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998,20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010,21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022,21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034,21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046,21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058,21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070,21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082,21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094,21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118,21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130,21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166,21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202,21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214,21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238,21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250,21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262,21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274,21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286,21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322,21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334,21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346,21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358,21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370,21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382,21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394,21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430,21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442,21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454,21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478,21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490,21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514,21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526,21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538,21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550,21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562,21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574,21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586,21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598,21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610,21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622,21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634,21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646,21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658,21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682,21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694,21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706,21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718,21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730,21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742,21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802,21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838,21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850,21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862,21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874,21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886,21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898,21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910,21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922,21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934,21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946,21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958,21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970,21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982,21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994,21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006,22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054,22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066,22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078,22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102,22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114,22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126,22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138,22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150,22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162,22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198,22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222,22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246,22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258,22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270,22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306,22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318,22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330,22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342,22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354,22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366,22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378,22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390,22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402,22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414,22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426,22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438,22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450,22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462,22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474,22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486,22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498,22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510,22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522,22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546,22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558,22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570,22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606,22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618,22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630,22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654,22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666,22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678,22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690,22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738,22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762,22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774,22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786,22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798,22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810,22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822,22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834,22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846,22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858,22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870,22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882,22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906,22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918,22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930,22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942,22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954,22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966,22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978,22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990,22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002,23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014,23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038,23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050,23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062,23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074,23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086,23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098,23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110,23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134,23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194,23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218,23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230,23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242,23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254,23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266,23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278,23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350,23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386,23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398,23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410,23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422,23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434,23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446,23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458,23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470,23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482,23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494,23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506,23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518,23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542,23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554,23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566,23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578,23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590,23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602,23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614,23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638,23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662,23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674,23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686,23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698,23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710,23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722,23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734,23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746,23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758,23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782,23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806,23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818,23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830,23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842,23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854,23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866,23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878,23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914,23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962,23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010,24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034,24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046,24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058,24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070,24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082,24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094,24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106,24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118,24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130,24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142,24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154,24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178,24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190,24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202,24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214,24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226,24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238,24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250,24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274,24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298,24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310,24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322,24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334,24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346,24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358,24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370,24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382,24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406,24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418,24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430,24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442,24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454,24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466,24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478,24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490,24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502,24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862,24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874,24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898,24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910,24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922,24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934,24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946,24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982,24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994,24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018,25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030,25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042,25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078,25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090,25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102,25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150,25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162,25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174,25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186,25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198,25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210,25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222,25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234,25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246,25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258,25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270,25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306,25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318,25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330,25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342,25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354,25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366,25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378,25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414,25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426,25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438,25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462,25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474,25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486,25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498,25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510,25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570,25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582,25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594,25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606,25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618,25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630,25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642,25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654,25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666,25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678,25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690,25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702,25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726,25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738,25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750,25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762,25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774,25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786,25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798,25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822,25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870,25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894,25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026,26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038,26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050,26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062,26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074,26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086,26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098,26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110,26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122,26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134,26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146,26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158,26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182,26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194,26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254,26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278,26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290,26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386,26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422,26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434,26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446,26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458,26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470,26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482,26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494,26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506,26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530,26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542,26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554,26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590,26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602,26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638,26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662,26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686,26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698,26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722,26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734,26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830,26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866,26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878,26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890,26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926,26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938,26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986,26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034,27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082,27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094,27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118,27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262,27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274,27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286,27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298,27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430,27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454,27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490,27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514,27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526,27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574,27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622,27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646,27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670,27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682,27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694,27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718,27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730,27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778,27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850,27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874,27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886,27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898,27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910,27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970,27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006,28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354,28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426,28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450,28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462,28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474,28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486,28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546,28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618,28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654,28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690,28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702,28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726,28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750,28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786,28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798,28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810,28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822,28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846,28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858,28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870,28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894,28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906,28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918,28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942,28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966,28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978,28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002,29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026,29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038,29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050,29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062,29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074,29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086,29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098,29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110,29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122,29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134,29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158,29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242,29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254,29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266,29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278,29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290,29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302,29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314,29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326,29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362,29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374,29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386,29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398,29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410,29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422,29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434,29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446,29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458,29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470,29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482,29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494,29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518,29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530,29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566,29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578,29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590,29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602,29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614,29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626,29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638,29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650,29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662,29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674,29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686,29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710,29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722,29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734,29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746,29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758,29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782,29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806,29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818,29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830,29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854,29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914,29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926,29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938,29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950,29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962,29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974,29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986,29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998,29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010,30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022,30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034,30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046,30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058,30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070,30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082,30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094,30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106,30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118,30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130,30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142,30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154,30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166,30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178,30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190,30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202,30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214,30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226,30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238,30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250,30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262,30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274,30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286,30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310,30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322,30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334,30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346,30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358,30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382,30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406,30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418,30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430,30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442,30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454,30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466,30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490,30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502,30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526,30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538,30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550,30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562,30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586,30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598,30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634,30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646,30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670,30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682,30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694,30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706,30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718,30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730,30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742,30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754,30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766,30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778,30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790,30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802,30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826,30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838,30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850,30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862,30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874,30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886,30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898,30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934,30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958,30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970,30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982,30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006,31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030,31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042,31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054,31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066,31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078,31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090,31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102,31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114,31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126,31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162,31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174,31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186,31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198,31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210,31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222,31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234,31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246,31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258,31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294,31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318,31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354,31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366,31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378,31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390,31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402,31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450,31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462,31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474,31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486,31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498,31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510,31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522,31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534,31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546,31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558,31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570,31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582,31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606,31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618,31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630,31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642,31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654,31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666,31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678,31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690,31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702,31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714,31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726,31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738,31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750,31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762,31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774,31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882,31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894,31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906,31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918,31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930,31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942,31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954,31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966,31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978,31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990,31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326,32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422,32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434,32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446,32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458,32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470,32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482,32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494,32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506,32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518,32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530,32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542,32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554,32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566,32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602,32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614,32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650,32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662,32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674,32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686,32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698,32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710,32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722,32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734,32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746,32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758,32759,32760,32761,32762,32763,32764,32765,32766,32767,32768,32769,32770,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,32783,32784,32785,32786,32787,32788,32789,32790,32791,32792,32793,32794,32795,32796,32797,32798,32799,32800,32801,32802,32803,32804,32805,32806,32807,32808,32809,32810,32811,32812,32813,32814,32815,32816,32817,32818,32819,32820,32821,32822,32823,32824,32825,32826,32827,32828,32829,32830,32831,32832,32833,32834,32835,32836,32837,32838,32839,32840,32841,32842,32843,32844,32845,32846,32847,32848,32849,32850,32851,32852,32853,32854,32855,32856,32857,32858,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32873,32874,32875,32876,32877,32878,32879,32880,32881,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,32895,32896,32897,32898,32899,32900,32901,32902,32903,32904,32905,32906,32907,32908,32909,32910,32911,32912,32913,32914,32915,32916,32917,32918,32919,32920,32921,32922,32923,32924,32925,32926,32927,32928,32929,32930,32931,32932,32933,32934,32935,32936,32937,32938,32939,32940,32941,32942,32943,32944,32945,32946,32947,32948,32949,32950,32951,32952,32953,32954,32955,32956,32957,32958,32959,32960,32961,32962,32963,32964,32965,32966,32967,32968,32969,32970,32971,32972,32973,32974,32975,32976,32977,32978,32979,32980,32981,32982,32983,32984,32985,32986,32987,32988,32989,32990,32991,32992,32993,32994,32995,32996,32997,32998,32999,33000,33001,33002,33003,33004,33005,33006,33007,33008,33009,33010,33011,33012,33013,33014,33015,33016,33017,33018,33019,33020,33021,33022,33023,33024,33025,33026,33027,33028,33029,33030,33031,33032,33033,33034,33035,33036,33037,33038,33039,33040,33041,33042,33043,33044,33045,33046,33047,33048,33049,33050,33051,33052,33053,33054,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33068,33069,33070,33071,33072,33073,33074,33075,33076,33077,33078,33079,33080,33081,33082,33083,33084,33085,33086,33087,33088,33089,33090,33091,33092,33093,33094,33095,33096,33097,33098,33099,33100,33101,33102,33103,33104,33105,33106,33107,33108,33109,33110,33111,33112,33113,33114,33115,33116,33117,33118,33119,33120,33121,33122,33123,33124,33125,33126,33127,33128,33129,33130,33131,33132,33133,33134,33135,33136,33137,33138,33139,33140,33141,33142,33143,33144,33145,33146,33147,33148,33149,33150,33151,33152,33153,33154,33155,33156,33157,33158,33159,33160,33161,33162,33163,33164,33165,33166,33167,33168,33169,33170,33171,33172,33173,33174,33175,33176,33177,33178,33179,33180,33181,33182,33183,33184,33185,33186,33187,33188,33189,33190,33191,33192,33193,33194,33195,33196,33197,33198,33199,33200,33201,33202,33203,33204,33205,33206,33207,33208,33209,33210,33211,33212,33213,33214,33215,33216,33217,33218,33219,33220,33221,33222,33223,33224,33225,33226,33227,33228,33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33251,33252,33253,33254,33255,33256,33257,33258,33259,33260,33261,33262,33263,33264,33265,33266,33267,33268,33269,33270,33271,33272,33273,33274,33275,33276,33277,33278,33279,33280,33281,33282,33283,33284,33285,33286,33287,33288,33289,33290,33291,33292,33293,33294,33295,33296,33297,33298,33299,33300,33301,33302,33303,33304,33305,33306,33307,33308,33309,33310,33311,33312,33313,33314,33315,33316,33317,33318,33319,33320,33321,33322,33323,33324,33325,33326,33327,33328,33329,33330,33331,33332,33333,33334,33335,33336,33337,33338,33339,33340,33341,33342,33343,33344,33345,33346,33347,33348,33349,33350,33351,33352,33353,33354,33355,33356,33357,33358,33359,33360,33361,33362,33363,33364,33365,33366,33367,33368,33369,33370,33371,33372,33373,33374,33375,33376,33377,33378,33379,33380,33381,33382,33383,33384,33385,33386,33387,33388,33389,33390,33391,33392,33393,33394,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33405,33406,33407,33408,33409,33410,33411,33412,33413,33414,33415,33416,33417,33418,33419,33420,33421,33422,33423,33424,33425,33426,33427,33428,33429,33430,33431,33432,33433,33434,33435,33436,33437,33438,33439,33440,33441,33442,33443,33444,33445,33446,33447,33448,33449,33450,33451,33452,33453,33454,33455,33456,33457,33458,33459,33460,33461,33462,33463,33464,33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,33476,33477,33478,33479,33480,33481,33482,33483,33484,33485,33486,33487,33488,33489,33490,33491,33492,33493,33494,33495,33496,33497,33498,33499,33500,33501,33502,33503,33504,33505,33506,33507,33508,33509,33510,33511,33512,33513,33514,33515,33516,33517,33518,33519,33520,33521,33522,33523,33524,33525,33526,33527,33528,33529,33530,33531,33532,33533,33534,33535,33536,33537,33538,33539,33540,33541,33542,33543,33544,33545,33546,33547,33548,33549,33550,33551,33552,33553,33554,33555,33556,33557,33558,33559,33560,33561,33562,33563,33564,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33575,33576,33577,33578,33579,33580,33581,33582,33583,33584,33585,33586,33587,33588,33589,33590,33591,33592,33593,33594,33595,33596,33597,33598,33599,33600,33601,33602,33603,33604,33605,33606,33607,33608,33609,33610,33611,33612,33613,33614,33615,33616,33617,33618,33619,33620,33621,33622,33623,33624,33625,33626,33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33637,33638,33639,33640,33641,33642,33643,33644,33645,33646,33647,33648,33649,33650,33651,33652,33653,33654,33655,33656,33657,33658,33659,33660,33661,33662,33663,33664,33665,33666,33667,33668,33669,33670,33671,33672,33673,33674,33675,33676,33677,33678,33679,33680,33681,33682,33683,33684,33685,33686,33687,33688,33689,33690,33691,33692,33693,33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,33706,33707,33708,33709,33710,33711,33712,33713,33714,33715,33716,33717,33718,33719,33720,33721,33722,33723,33724,33725,33726,33727,33728,33729,33730,33731,33732,33733,33734,33735,33736,33737,33738,33739,33740,33741,33742,33743,33744,33745,33746,33747,33748,33749,33750,33751,33752,33753,33754,33755,33756,33757,33758,33759,33760,33761,33762,33763,33764,33765,33766,33767,33768,33769,33770,33771,33772,33773,33774,33775,33776,33777,33778,33779,33780,33781,33782,33783,33784,33785,33786,33787,33788,33789,33790,33791,33792,33793,33794,33795,33796,33797,33798,33799,33800,33801,33802,33803,33804,33805,33806,33807,33808,33809,33810,33811,33812,33813,33814,33815,33816,33817,33818,33819,33820,33821,33822,33823,33824,33825,33826,33827,33828,33829,33830,33831,33832,33833,33834,33835,33836,33837,33838,33839,33840,33841,33842,33843,33844,33845,33846,33847,33848,33849,33850,33851,33852,33853,33854,33855,33856,33857,33858,33859,33860,33861,33862,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33873,33874,33875,33876,33877,33878,33879,33880,33881,33882,33883,33884,33885,33886,33887,33888,33889,33890,33891,33892,33893,33894,33895,33896,33897,33898,33899,33900,33901,33902,33903,33904,33905,33906,33907,33908,33909,33910,33911,33912,33913,33914,33915,33916,33917,33918,33919,33920,33921,33922,33923,33924,33925,33926,33927,33928,33929,33930,33931,33932,33933,33934,33935,33936,33937,33938,33939,33940,33941,33942,33943,33944,33945,33946,33947,33948,33949,33950,33951,33952,33953,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33967,33968,33969,33970,33971,33972,33973,33974,33975,33976,33977,33978,33979,33980,33981,33982,33983,33984,33985,33986,33987,33988,33989,33990,33991,33992,33993,33994,33995,33996,33997,33998,33999,34000,34001,34002,34003,34004,34005,34006,34007,34008,34009,34010,34011,34012,34013,34014,34015,34016,34017,34018,34019,34020,34021,34022,34023,34024,34025,34026,34027,34028,34029,34030,34031,34032,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34044,34045,34046,34047,34048,34049,34050,34051,34052,34053,34054,34055,34056,34057,34058,34059,34060,34061,34062,34063,34064,34065,34066,34067,34068,34069,34070,34071,34072,34073,34074,34075,34076,34077,34078,34079,34080,34081,34082,34083,34084,34085,34086,34087,34088,34089,34090,34091,34092,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34103,34104,34105,34106,34107,34108,34109,34110,34111,34112,34113,34114,34115,34116,34117,34118,34119,34120,34121,34122,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34134,34135,34136,34137,34138,34139,34140,34141,34142,34143,34144,34145,34146,34147,34148,34149,34150,34151,34152,34153,34154,34155,34156,34157,34158,34159,34160,34161,34162,34163,34164,34165,34166,34167,34168,34169,34170,34171,34172,34173,34174,34175,34176,34177,34178,34179,34180,34181,34182,34183,34184,34185,34186,34187,34188,34189,34190,34191,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34203,34204,34205,34206,34207,34208,34209,34210,34211,34212,34213,34214,34215,34216,34217,34218,34219,34220,34221,34222,34223,34224,34225,34226,34227,34228,34229,34230,34231,34232,34233,34234,34235,34236,34237,34238,34239,34240,34241,34242,34243,34244,34245,34246,34247,34248,34249,34250,34251,34252,34253,34254,34255,34256,34257,34258,34259,34260,34261,34262,34263,34264,34265,34266,34267,34268,34269,34270,34271,34272,34273,34274,34275,34276,34277,34278,34279,34280,34281,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34307,34308,34309,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34321,34322,34323,34324,34325,34326,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34343,34344,34345,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34360,34361,34362,34363,34364,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34381,34382,34383,34384,34385,34386,34387,34388,34389,34390,34391,34392,34393,34394,34395,34396,34397,34398,34399,34400,34401,34402,34403,34404,34405,34406,34407,34408,34409,34410,34411,34412,34413,34414,34415,34416,34417,34418,34419,34420,34421,34422,34423,34424,34425,34426,34427,34428,34429,34430,34431,34432,34433,34434,34435,34436,34437,34438,34439,34440,34441,34442,34443,34444,34445,34446,34447,34448,34449,34450,34451,34452,34453,34454,34455,34456,34457,34458,34459,34460,34461,34462,34463,34464,34465,34466,34467,34468,34469,34470,34471,34472,34473,34474,34475,34476,34477,34478,34479,34480,34481,34482,34483,34484,34485,34486,34487,34488,34489,34490,34491,34492,34493,34494,34495,34496,34497,34498,34499,34500,34501,34502,34503,34504,34505,34506,34507,34508,34509,34510,34511,34512,34513,34514,34515,34516,34517,34518,34519,34520,34521,34522,34523,34524,34525,34526,34527,34528,34529,34530,34531,34532,34533,34534,34535,34536,34537,34538,34539,34540,34541,34542,34543,34544,34545,34546,34547,34548,34549,34550,34551,34552,34553,34554,34555,34556,34557,34558,34559,34560,34561,34562,34563,34564,34565,34566,34567,34568,34569,34570,34571,34572,34573,34574,34575,34576,34577,34578,34579,34580,34581,34582,34583,34584,34585,34586,34587,34588,34589,34590,34591,34592,34593,34594,34595,34596,34597,34598,34599,34600,34601,34602,34603,34604,34605,34606,34607,34608,34609,34610,34611,34612,34613,34614,34615,34616,34617,34618,34619,34620,34621,34622,34623,34624,34625,34626,34627,34628,34629,34630,34631,34632,34633,34634,34635,34636,34637,34638,34639,34640,34641,34642,34643,34644,34645,34646,34647,34648,34649,34650,34651,34652,34653,34654,34655,34656,34657,34658,34659,34660,34661,34662,34663,34664,34665,34666,34667,34668,34669,34670,34671,34672,34673,34674,34675,34676,34677,34678,34679,34680,34681,34682,34683,34684,34685,34686,34687,34688,34689,34690,34691,34692,34693,34694,34695,34696,34697,34698,34699,34700,34701,34702,34703,34704,34705,34706,34707,34708,34709,34710,34711,34712,34713,34714,34715,34716,34717,34718,34719,34720,34721,34722,34723,34724,34725,34726,34727,34728,34729,34730,34731,34732,34733,34734,34735,34736,34737,34738,34739,34740,34741,34742,34743,34744,34745,34746,34747,34748,34749,34750,34751,34752,34753,34754,34755,34756,34757,34758,34759,34760,34761,34762,34763,34764,34765,34766,34767,34768,34769,34770,34771,34772,34773,34774,34775,34776,34777,34778,34779,34780,34781,34782,34783,34784,34785,34786,34787,34788,34789,34790,34791,34792,34793,34794,34795,34796,34797,34798,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34809,34810,34811,34812,34813,34814,34815,34816,34817,34818,34819,34820,34821,34822,34823,34824,34825,34826,34827,34828,34829,34830,34831,34832,34833,34834,34835,34836,34837,34838,34839,34840,34841,34842,34843,34844,34845,34846,34847,34848,34849,34850,34851,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34866,34867,34868,34869,34870,34871,34872,34873,34874,34875,34876,34877,34878,34879,34880,34881,34882,34883,34884,34885,34886,34887,34888,34889,34890,34891,34892,34893,34894,34895,34896,34897,34898,34899,34900,34901,34902,34903,34904,34905,34906,34907,34908,34909,34910,34911,34912,34913,34914,34915,34916,34917,34918,34919,34920,34921,34922,34923,34924,34925,34926,34927,34928,34929,34930,34931,34932,34933,34934,34935,34936,34937,34938,34939,34940,34941,34942,34943,34944,34945,34946,34947,34948,34949,34950,34951,34952,34953,34954,34955,34956,34957,34958,34959,34960,34961,34962,34963,34964,34965,34966,34967,34968,34969,34970,34971,34972,34973,34974,34975,34976,34977,34978,34979,34980,34981,34982,34983,34984,34985,34986,34987,34988,34989,34990,34991,34992,34993,34994,34995,34996,34997,34998,34999,35000,35001,35002,35003,35004,35005,35006,35007,35008,35009,35010,35011,35012,35013,35014,35015,35016,35017,35018,35019,35020,35021,35022,35023,35024,35025,35026,35027,35028,35029,35030,35031,35032,35033,35034,35035,35036,35037,35038,35039,35040,35041,35042,35043,35044,35045,35046,35047,35048,35049,35050,35051,35052,35053,35054,35055,35056,35057,35058,35059,35060,35061,35062,35063,35064,35065,35066,35067,35068,35069,35070,35071,35072,35073,35074,35075,35076,35077,35078,35079,35080,35081,35082,35083,35084,35085,35086,35087,35088,35089,35090,35091,35092,35093,35094,35095,35096,35097,35098,35099,35100,35101,35102,35103,35104,35105,35106,35107,35108,35109,35110,35111,35112,35113,35114,35115,35116,35117,35118,35119,35120,35121,35122,35123,35124,35125,35126,35127,35128,35129,35130,35131,35132,35133,35134,35135,35136,35137,35138,35139,35140,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35166,35167,35168,35169,35170,35171,35172,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35195,35196,35197,35198,35199,35200,35201,35202,35203,35204,35205,35206,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,35271,35272,35273,35274,35275,35276,35277,35278,35279,35280,35281,35282,35283,35284,35285,35286,35287,35288,35289,35290,35291,35292,35293,35294,35295,35296,35297,35298,35299,35300,35301,35302,35303,35304,35305,35306,35307,35308,35309,35310,35311,35312,35313,35314,35315,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35328,35329,35330,35331,35332,35333,35334,35335,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35390,35391,35392,35393,35394,35395,35396,35397,35398,35399,35400,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35449,35450,35451,35452,35453,35454,35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,35465,35466,35467,35468,35469,35470,35471,35472,35473,35474,35475,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35591,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35622,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35686,35687,35688,35689,35690,35691,35692,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35744,35745,35746,35747,35748,35749,35750,35751,35752,35753,35754,35755,35756,35757,35758,35759,35760,35761,35762,35763,35764,35765,35766,35767,35768,35769,35770,35771,35772,35773,35774,35775,35776,35777,35778,35779,35780,35781,35782,35783,35784,35785,35786,35787,35788,35789,35790,35791,35792,35793,35794,35795,35796,35797,35798,35799,35800,35801,35802,35803,35804,35805,35806,35807,35808,35809,35810,35811,35812,35813,35814,35815,35816,35817,35818,35819,35820,35821,35822,35823,35824,35825,35826,35827,35828,35829,35830,35831,35832,35833,35834,35835,35836,35837,35838,35839,35840,35841,35842,35843,35844,35845,35846,35847,35848,35849,35850,35851,35852,35853,35854,35855,35856,35857,35858,35859,35860,35861,35862,35863,35864,35865,35866,35867,35868,35869,35870,35871,35872,35873,35874,35875,35876,35877,35878,35879,35880,35881,35882,35883,35884,35885,35886,35887,35888,35889,35890,35891,35892,35893,35894,35895,35896,35897,35898,35899,35900,35901,35902,35903,35904,35905,35906,35907,35908,35909,35910,35911,35912,35913,35914,35915,35916,35917,35918,35919,35920,35921,35922,35923,35924,35925,35926,35927,35928,35929,35930,35931,35932,35933,35934,35935,35936,35937,35938,35939,35940,35941,35942,35943,35944,35945,35946,35947,35948,35949,35950,35951,35952,35953,35954,35955,35956,35957,35958,35959,35960,35961,35962,35963,35964,35965,35966,35967,35968,35969,35970,35971,35972,35973,35974,35975,35976,35977,35978,35979,35980,35981,35982,35983,35984,35985,35986,35987,35988,35989,35990,35991,35992,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36125,36126,36127,36128,36129,36130,36131,36132,36133,36134,36135,36136,36137,36138,36139,36140,36141,36142,36143,36144,36145,36146,36147,36148,36149,36150,36151,36152,36153,36154,36155,36156,36157,36158,36159,36160,36161,36162,36163,36164,36165,36166,36167,36168,36169,36170,36171,36172,36173,36174,36175,36176,36177,36178,36179,36180,36181,36182,36183,36184,36185,36186,36187,36188,36189,36190,36191,36192,36193,36194,36195,36196,36197,36198,36199,36200,36201,36202,36203,36204,36205,36206,36207,36208,36209,36210,36211,36212,36213,36214,36215,36216,36217,36218,36219,36220,36221,36222,36223,36224,36225,36226,36227,36228,36229,36230,36231,36232,36233,36234,36235,36236,36237,36238,36239,36240,36241,36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36255,36256,36257,36258,36259,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36273,36274,36275,36276,36277,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,36292,36293,36294,36295,36296,36297,36298,36299,36300,36301,36302,36303,36304,36305,36306,36307,36308,36309,36310,36311,36312,36313,36314,36315,36316,36317,36318,36319,36320,36321,36322,36323,36324,36325,36326,36327,36328,36329,36330,36331,36332,36333,36334,36335,36336,36337,36338,36339,36340,36341,36342,36343,36344,36345,36346,36347,36348,36349,36350,36351,36352,36353,36354,36355,36356,36357,36358,36359,36360,36361,36362,36363,36364,36365,36366,36367,36368,36369,36370,36371,36372,36373,36374,36375,36376,36377,36378,36379,36380,36381,36382,36383,36384,36385,36386,36387,36388,36389,36390,36391,36392,36393,36394,36395,36396,36397,36398,36399,36400,36401,36402,36403,36404,36405,36406,36407,36408,36409,36410,36411,36412,36413,36414,36415,36416,36417,36418,36419,36420,36421,36422,36423,36424,36425,36426,36427,36428,36429,36430,36431,36432,36433,36434,36435,36436,36437,36438,36439,36440,36441,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36454,36455,36456,36457,36458,36459,36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,36471,36472,36473,36474,36475,36476,36477,36478,36479,36480,36481,36482,36483,36484,36485,36486,36487,36488,36489,36490,36491,36492,36493,36494,36495,36496,36497,36498,36499,36500,36501,36502,36503,36504,36505,36506,36507,36508,36509,36510,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36523,36524,36525,36526,36527,36528,36529,36530,36531,36532,36533,36534,36535,36536,36537,36538,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36558,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36710,36711,36712,36713,36714,36715,36716,36717,36718,36719,36720,36721,36722,36723,36724,36725,36726,36727,36728,36729,36730,36731,36732,36733,36734,36735,36736,36737,36738,36739,36740,36741,36742,36743,36744,36745,36746,36747,36748,36749,36750,36751,36752,36753,36754,36755,36756,36757,36758,36759,36760,36761,36762,36763,36764,36765,36766,36767,36768,36769,36770,36771,36772,36773,36774,36775,36776,36777,36778,36779,36780,36781,36782,36783,36784,36785,36786,36787,36788,36789,36790,36791,36792,36793,36794,36795,36796,36797,36798,36799,36800,36801,36802,36803,36804,36805,36806,36807,36808,36809,36810,36811,36812,36813,36814,36815,36816,36817,36818,36819,36820,36821,36822,36823,36824,36825,36826,36827,36828,36829,36830,36831,36832,36833,36834,36835,36836,36837,36838,36839,36840,36841,36842,36843,36844,36845,36846,36847,36848,36849,36850,36851,36852,36853,36854,36855,36856,36857,36858,36859,36860,36861,36862,36863,36864,36865,36866,36867,36868,36869,36870,36871,36872,36873,36874,36875,36876,36877,36878,36879,36880,36881,36882,36883,36884,36885,36886,36887,36888,36889,36890,36891,36892,36893,36894,36895,36896,36897,36898,36899,36900,36901,36902,36903,36904,36905,36906,36907,36908,36909,36910,36911,36912,36913,36914,36915,36916,36917,36918,36919,36920,36921,36922,36923,36924,36925,36926,36927,36928,36929,36930,36931,36932,36933,36934,36935,36936,36937,36938,36939,36940,36941,36942,36943,36944,36945,36946,36947,36948,36949,36950,36951,36952,36953,36954,36955,36956,36957,36958,36959,36960,36961,36962,36963,36964,36965,36966,36967,36968,36969,36970,36971,36972,36973,36974,36975,36976,36977,36978,36979,36980,36981,36982,36983,36984,36985,36986,36987,36988,36989,36990,36991,36992,36993,36994,36995,36996,36997,36998,36999,37000,37001,37002,37003,37004,37005,37006,37007,37008,37009,37010,37011,37012,37013,37014,37015,37016,37017,37018,37019,37020,37021,37022,37023,37024,37025,37026,37027,37028,37029,37030,37031,37032,37033,37034,37035,37036,37037,37038,37039,37040,37041,37042,37043,37044,37045,37046,37047,37048,37049,37050,37051,37052,37053,37054,37055,37056,37057,37058,37059,37060,37061,37062,37063,37064,37065,37066,37067,37068,37069,37070,37071,37072,37073,37074,37075,37076,37077,37078,37079,37080,37081,37082,37083,37084,37085,37086,37087,37088,37089,37090,37091,37092,37093,37094,37095,37096,37097,37098,37099,37100,37101,37102,37103,37104,37105,37106,37107,37108,37109,37110,37111,37112,37113,37114,37115,37116,37117,37118,37119,37120,37121,37122,37123,37124,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37145,37146,37147,37148,37149,37150,37151,37152,37153,37154,37155,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37167,37168,37169,37170,37171,37172,37173,37174,37175,37176,37177,37178,37179,37180,37181,37182,37183,37184,37185,37186,37187,37188,37189,37190,37191,37192,37193,37194,37195,37196,37197,37198,37199,37200,37201,37202,37203,37204,37205,37206,37207,37208,37209,37210,37211,37212,37213,37214,37215,37216,37217,37218,37219,37220,37221,37222,37223,37224,37225,37226,37227,37228,37229,37230,37231,37232,37233,37234,37235,37236,37237,37238,37239,37240,37241,37242,37243,37244,37245,37246,37247,37248,37249,37250,37251,37252,37253,37254,37255,37256,37257,37258,37259,37260,37261,37262,37263,37264,37265,37266,37267,37268,37269,37270,37271,37272,37273,37274,37275,37276,37277,37278,37279,37280,37281,37282,37283,37284,37285,37286,37287,37288,37289,37290,37291,37292,37293,37294,37295,37296,37297,37298,37299,37300,37301,37302,37303,37304,37305,37306,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37319,37320,37321,37322,37323,37324,37325,37326,37327,37328,37329,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37340,37341,37342,37343,37344,37345,37346,37347,37348,37349,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37492,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37518,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,37544,37545,37546,37547,37548,37549,37550,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37576,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37694,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37738,37739,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37775,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37834,37835,37836,37837,37838,37839,37840,37841,37842,37843,37844,37845,37846,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37950,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37995,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38021,38022,38023,38024,38025,38026,38027,38028,38029,38030,38031,38032,38033,38034,38035,38036,38037,38038,38039,38040,38041,38042,38043,38044,38045,38046,38047,38048,38049,38050,38051,38052,38053,38054,38055,38056,38057,38058,38059,38060,38061,38062,38063,38064,38065,38066,38067,38068,38069,38070,38071,38072,38073,38074,38075,38076,38077,38078,38079,38080,38081,38082,38083,38084,38085,38086,38087,38088,38089,38090,38091,38092,38093,38094,38095,38096,38097,38098,38099,38100,38101,38102,38103,38104,38105,38106,38107,38108,38109,38110,38111,38112,38113,38114,38115,38116,38117,38118,38119,38120,38121,38122,38123,38124,38125,38126,38127,38128,38129,38130,38131,38132,38133,38134,38135,38136,38137,38138,38139,38140,38141,38142,38143,38144,38145,38146,38147,38148,38149,38150,38151,38152,38153,38154,38155,38156,38157,38158,38159,38160,38161,38162,38163,38164,38165,38166,38167,38168,38169,38170,38171,38172,38173,38174,38175,38176,38177,38178,38179,38180,38181,38182,38183,38184,38185,38186,38187,38188,38189,38190,38191,38192,38193,38194,38195,38196,38197,38198,38199,38200,38201,38202,38203,38204,38205,38206,38207,38208,38209,38210,38211,38212,38213,38214,38215,38216,38217,38218,38219,38220,38221,38222,38223,38224,38225,38226,38227,38228,38229,38230,38231,38232,38233,38234,38235,38236,38237,38238,38239,38240,38241,38242,38243,38244,38245,38246,38247,38248,38249,38250,38251,38252,38253,38254,38255,38256,38257,38258,38259,38260,38261,38262,38263,38264,38265,38266,38267,38268,38269,38270,38271,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38376,38377,38378,38379,38380,38381,38382,38383,38384,38385,38386,38387,38388,38389,38390,38391,38392,38393,38394,38395,38396,38397,38398,38399,38400,38401,38402,38403,38404,38405,38406,38407,38408,38409,38410,38411,38412,38413,38414,38415,38416,38417,38418,38419,38420,38421,38422,38423,38424,38425,38426,38427,38428,38429,38430,38431,38432,38433,38434,38435,38436,38437,38438,38439,38440,38441,38442,38443,38444,38445,38446,38447,38448,38449,38450,38451,38452,38453,38454,38455,38456,38457,38458,38459,38460,38461,38462,38463,38464,38465,38466,38467,38468,38469,38470,38471,38472,38473,38474,38475,38476,38477,38478,38479,38480,38481,38482,38483,38484,38485,38486,38487,38488,38489,38490,38491,38492,38493,38494,38495,38496,38497,38498,38499,38500,38501,38502,38503,38504,38505,38506,38507,38508,38509,38510,38511,38512,38513,38514,38515,38516,38517,38518,38519,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38533,38534,38535,38536,38537,38538,38539,38540,38541,38542,38543,38544,38545,38546,38547,38548,38549,38550,38551,38552,38553,38554,38555,38556,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38567,38568,38569,38570,38571,38572,38573,38574,38575,38576,38577,38578,38579,38580,38581,38582,38583,38584,38585,38586,38587,38588,38589,38590,38591,38592,38593,38594,38595,38596,38597,38598,38599,38600,38601,38602,38603,38604,38605,38606,38607,38608,38609,38610,38611,38612,38613,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38624,38625,38626,38627,38628,38629,38630,38631,38632,38633,38634,38635,38636,38637,38638,38639,38640,38641,38642,38643,38644,38645,38646,38647,38648,38649,38650,38651,38652,38653,38654,38655,38656,38657,38658,38659,38660,38661,38662,38663,38664,38665,38666,38667,38668,38669,38670,38671,38672,38673,38674,38675,38676,38677,38678,38679,38680,38681,38682,38683,38684,38685,38686,38687,38688,38689,38690,38691,38692,38693,38694,38695,38696,38697,38698,38699,38700,38701,38702,38703,38704,38705,38706,38707,38708,38709,38710,38711,38712,38713,38714,38715,38716,38717,38718,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38738,38739,38740,38741,38742,38743,38744,38745,38746,38747,38748,38749,38750,38751,38752,38753,38754,38755,38756,38757,38758,38759,38760,38761,38762,38763,38764,38765,38766,38767,38768,38769,38770,38771,38772,38773,38774,38775,38776,38777,38778,38779,38780,38781,38782,38783,38784,38785,38786,38787,38788,38789,38790,38791,38792,38793,38794,38795,38796,38797,38798,38799,38800,38801,38802,38803,38804,38805,38806,38807,38808,38809,38810,38811,38812,38813,38814,38815,38816,38817,38818,38819,38820,38821,38822,38823,38824,38825,38826,38827,38828,38829,38830,38831,38832,38833,38834,38835,38836,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38886,38887,38888,38889,38890,38891,38892,38893,38894,38895,38896,38897,38898,38899,38900,38901,38902,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,39023,39024,39025,39026,39027,39028,39029,39030,39031,39032,39033,39034,39035,39036,39037,39038,39039,39040,39041,39042,39043,39044,39045,39046,39047,39048,39049,39050,39051,39052,39053,39054,39055,39056,39057,39058,39059,39060,39061,39062,39063,39064,39065,39066,39067,39068,39069,39070,39071,39072,39073,39074,39075,39076,39077,39078,39079,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39118,39119,39120,39121,39122,39123,39124,39125,39126,39127,39128,39129,39130,39131,39132,39133,39134,39135,39136,39137,39138,39139,39140,39141,39142,39143,39144,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,39176,39177,39178,39179,39180,39181,39182,39183,39184,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39214,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39252,39253,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39267,39268,39269,39270,39271,39272,39273,39274,39275,39276,39277,39278,39279,39280,39281,39282,39283,39284,39285,39286,39287,39288,39289,39290,39291,39292,39293,39294,39295,39296,39297,39298,39299,39300,39301,39302,39303,39304,39305,39306,39307,39308,39309,39310,39311,39312,39313,39314,39315,39316,39317,39318,39319,39320,39321,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39333,39334,39335,39336,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39532,39533,39534,39535,39536,39537,39538,39539,39540,39541,39542,39543,39544,39545,39546,39547,39548,39549,39550,39551,39552,39553,39554,39555,39556,39557,39558,39559,39560,39561,39562,39563,39564,39565,39566,39567,39568,39569,39570,39571,39572,39573,39574,39575,39576,39577,39578,39579,39580,39581,39582,39583,39584,39585,39586,39587,39588,39589,39590,39591,39592,39593,39594,39595,39596,39597,39598,39599,39600,39601,39602,39603,39604,39605,39606,39607,39608,39609,39610,39611,39612,39613,39614,39615,39616,39617,39618,39619,39620,39621,39622,39623,39624,39625,39626,39627,39628,39629,39630,39631,39632,39633,39634,39635,39636,39637,39638,39639,39640,39641,39642,39643,39644,39645,39646,39647,39648,39649,39650,39651,39652,39653,39654,39655,39656,39657,39658,39659,39660,39661,39662,39663,39664,39665,39666,39667,39668,39669,39670,39671,39672,39673,39674,39675,39676,39677,39678,39679,39680,39681,39682,39683,39684,39685,39686,39687,39688,39689,39690,39691,39692,39693,39694,39695,39696,39697,39698,39699,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39711,39712,39713,39714,39715,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39727,39728,39729,39730,39731,39732,39733,39734,39735,39736,39737,39738,39739,39740,39741,39742,39743,39744,39745,39746,39747,39748,39749,39750,39751,39752,39753,39754,39755,39756,39757,39758,39759,39760,39761,39762,39763,39764,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40060,40061,40062,40063,40064,40065,40066,40067,40068,40069,40070,40071,40072,40073,40074,40075,40076,40077,40078,40079,40080,40081,40082,40083,40084,40085,40086,40087,40088,40089,40090,40091,40092,40093,40094,40095,40096,40097,40098,40099,40100,40101,40102,40103,40104,40105,40106,40107,40108,40109,40110,40111,40112,40113,40114,40115,40116,40117,40118,40119,40120,40121,40122,40123,40124,40125,40126,40127,40128,40129,40130,40131,40132,40133,40134,40135,40136,40137,40138,40139,40140,40141,40142,40143,40144,40145,40146,40147,40148,40149,40150,40151,40152,40153,40154,40155,40156,40157,40158,40159,40160,40161,40162,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40479,40480,40481,40482,40483,40484,40485,40486,40487,40488,40489,40490,40491,40492,40493,40494,40495,40496,40497,40498,40499,40500,40501,40502,40503,40504,40505,40506,40507,40508,40509,40510,40511,40512,40513,40514,40515,40516,40517,40518,40519,40520,40521,40522,40523,40524,40525,40526,40527,40528,40529,40530,40531,40532,40533,40534,40535,40536,40537,40538,40539,40540,40541,40542,40543,40544,40545,40546,40547,40548,40549,40550,40551,40552,40553,40554,40555,40556,40557,40558,40559,40560,40561,40562,40563,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40574,40575,40576,40577,40578,40579,40580,40581,40582,40583,40584,40585,40586,40587,40588,40589,40590,40591,40592,40593,40594,40595,40596,40597,40598,40599,40600,40601,40602,40603,40604,40605,40606,40607,40608,40609,40610,40611,40612,40613,40614,40615,40616,40617,40618,40619,40620,40621,40622,40623,40624,40625,40626,40627,40628,40629,40630,40631,40632,40633,40634,40635,40636,40637,40638,40639,40640,40641,40642,40643,40644,40645,40646,40647,40648,40649,40650,40651,40652,40653,40654,40655,40656,40657,40658,40659,40660,40661,40662,40663,40664,40665,40666,40667,40668,40669,40670,40671,40672,40673,40674,40675,40676,40677,40678,40679,40680,40681,40682,40683,40684,40685,40686,40687,40688,40689,40690,40691,40692,40693,40694,40695,40696,40697,40698,40699,40700,40701,40702,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40715,40716,40717,40718,40719,40720,40721,40722,40723,40724,40725,40726,40727,40728,40729,40730,40731,40732,40733,40734,40735,40736,40737,40738,40739,40740,40741,40742,40743,40744,40745,40746,40747,40748,40749,40750,40751,40752,40753,40754,40755,40756,40757,40758,40759,40760,40761,40762,40763,40764,40765,40766,40767,40768,40769,40770,40771,40772,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40784,40785,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40831,40832,40833,40834,40835,40836,40837,40838,40839,40840,40841,40842,40843,40844,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40857,40858,40859,40860,40861,40862,40863,40864,40865,40866,40867,40868,40869,40870,40871,40872,40873,40874,40875,40876,40877,40878,40879,40880,40881,40882,40883,40884,40885,40886,40887,40888,40889,40890,40891,40892,40893,40894,40895,40896,40897,40898,40899,40900,40901,40902,40903,40904,40905,40906,40907,40908,40909,40910,40911,40912,40913,40914,40915,40916,40917,40918,40919,40920,40921,40922,40923,40924,40925,40926,40927,40928,40929,40930,40931,40932,40933,40934,40935,40936,40937,40938,40939,40940,40941,40942,40943,40960,40961,40962,40963,40964,40965,40966,40967,40968,40969,40970,40971,40972,40973,40974,40975,40976,40977,40978,40979,40980,40981,40982,40983,40984,40985,40986,40987,40988,40989,40990,40991,40992,40993,40994,40995,40996,40997,40998,40999,41000,41001,41002,41003,41004,41005,41006,41007,41008,41009,41010,41011,41012,41013,41014,41015,41016,41017,41018,41019,41020,41021,41022,41023,41024,41025,41026,41027,41028,41029,41030,41031,41032,41033,41034,41035,41036,41037,41038,41039,41040,41041,41042,41043,41044,41045,41046,41047,41048,41049,41050,41051,41052,41053,41054,41055,41056,41057,41058,41059,41060,41061,41062,41063,41064,41065,41066,41067,41068,41069,41070,41071,41072,41073,41074,41075,41076,41077,41078,41079,41080,41081,41082,41083,41084,41085,41086,41087,41088,41089,41090,41091,41092,41093,41094,41095,41096,41097,41098,41099,41100,41101,41102,41103,41104,41105,41106,41107,41108,41109,41110,41111,41112,41113,41114,41115,41116,41117,41118,41119,41120,41121,41122,41123,41124,41125,41126,41127,41128,41129,41130,41131,41132,41133,41134,41135,41136,41137,41138,41139,41140,41141,41142,41143,41144,41145,41146,41147,41148,41149,41150,41151,41152,41153,41154,41155,41156,41157,41158,41159,41160,41161,41162,41163,41164,41165,41166,41167,41168,41169,41170,41171,41172,41173,41174,41175,41176,41177,41178,41179,41180,41181,41182,41183,41184,41185,41186,41187,41188,41189,41190,41191,41192,41193,41194,41195,41196,41197,41198,41199,41200,41201,41202,41203,41204,41205,41206,41207,41208,41209,41210,41211,41212,41213,41214,41215,41216,41217,41218,41219,41220,41221,41222,41223,41224,41225,41226,41227,41228,41229,41230,41231,41232,41233,41234,41235,41236,41237,41238,41239,41240,41241,41242,41243,41244,41245,41246,41247,41248,41249,41250,41251,41252,41253,41254,41255,41256,41257,41258,41259,41260,41261,41262,41263,41264,41265,41266,41267,41268,41269,41270,41271,41272,41273,41274,41275,41276,41277,41278,41279,41280,41281,41282,41283,41284,41285,41286,41287,41288,41289,41290,41291,41292,41293,41294,41295,41296,41297,41298,41299,41300,41301,41302,41303,41304,41305,41306,41307,41308,41309,41310,41311,41312,41313,41314,41315,41316,41317,41318,41319,41320,41321,41322,41323,41324,41325,41326,41327,41328,41329,41330,41331,41332,41333,41334,41335,41336,41337,41338,41339,41340,41341,41342,41343,41344,41345,41346,41347,41348,41349,41350,41351,41352,41353,41354,41355,41356,41357,41358,41359,41360,41361,41362,41363,41364,41365,41366,41367,41368,41369,41370,41371,41372,41373,41374,41375,41376,41377,41378,41379,41380,41381,41382,41383,41384,41385,41386,41387,41388,41389,41390,41391,41392,41393,41394,41395,41396,41397,41398,41399,41400,41401,41402,41403,41404,41405,41406,41407,41408,41409,41410,41411,41412,41413,41414,41415,41416,41417,41418,41419,41420,41421,41422,41423,41424,41425,41426,41427,41428,41429,41430,41431,41432,41433,41434,41435,41436,41437,41438,41439,41440,41441,41442,41443,41444,41445,41446,41447,41448,41449,41450,41451,41452,41453,41454,41455,41456,41457,41458,41459,41460,41461,41462,41463,41464,41465,41466,41467,41468,41469,41470,41471,41472,41473,41474,41475,41476,41477,41478,41479,41480,41481,41482,41483,41484,41485,41486,41487,41488,41489,41490,41491,41492,41493,41494,41495,41496,41497,41498,41499,41500,41501,41502,41503,41504,41505,41506,41507,41508,41509,41510,41511,41512,41513,41514,41515,41516,41517,41518,41519,41520,41521,41522,41523,41524,41525,41526,41527,41528,41529,41530,41531,41532,41533,41534,41535,41536,41537,41538,41539,41540,41541,41542,41543,41544,41545,41546,41547,41548,41549,41550,41551,41552,41553,41554,41555,41556,41557,41558,41559,41560,41561,41562,41563,41564,41565,41566,41567,41568,41569,41570,41571,41572,41573,41574,41575,41576,41577,41578,41579,41580,41581,41582,41583,41584,41585,41586,41587,41588,41589,41590,41591,41592,41593,41594,41595,41596,41597,41598,41599,41600,41601,41602,41603,41604,41605,41606,41607,41608,41609,41610,41611,41612,41613,41614,41615,41616,41617,41618,41619,41620,41621,41622,41623,41624,41625,41626,41627,41628,41629,41630,41631,41632,41633,41634,41635,41636,41637,41638,41639,41640,41641,41642,41643,41644,41645,41646,41647,41648,41649,41650,41651,41652,41653,41654,41655,41656,41657,41658,41659,41660,41661,41662,41663,41664,41665,41666,41667,41668,41669,41670,41671,41672,41673,41674,41675,41676,41677,41678,41679,41680,41681,41682,41683,41684,41685,41686,41687,41688,41689,41690,41691,41692,41693,41694,41695,41696,41697,41698,41699,41700,41701,41702,41703,41704,41705,41706,41707,41708,41709,41710,41711,41712,41713,41714,41715,41716,41717,41718,41719,41720,41721,41722,41723,41724,41725,41726,41727,41728,41729,41730,41731,41732,41733,41734,41735,41736,41737,41738,41739,41740,41741,41742,41743,41744,41745,41746,41747,41748,41749,41750,41751,41752,41753,41754,41755,41756,41757,41758,41759,41760,41761,41762,41763,41764,41765,41766,41767,41768,41769,41770,41771,41772,41773,41774,41775,41776,41777,41778,41779,41780,41781,41782,41783,41784,41785,41786,41787,41788,41789,41790,41791,41792,41793,41794,41795,41796,41797,41798,41799,41800,41801,41802,41803,41804,41805,41806,41807,41808,41809,41810,41811,41812,41813,41814,41815,41816,41817,41818,41819,41820,41821,41822,41823,41824,41825,41826,41827,41828,41829,41830,41831,41832,41833,41834,41835,41836,41837,41838,41839,41840,41841,41842,41843,41844,41845,41846,41847,41848,41849,41850,41851,41852,41853,41854,41855,41856,41857,41858,41859,41860,41861,41862,41863,41864,41865,41866,41867,41868,41869,41870,41871,41872,41873,41874,41875,41876,41877,41878,41879,41880,41881,41882,41883,41884,41885,41886,41887,41888,41889,41890,41891,41892,41893,41894,41895,41896,41897,41898,41899,41900,41901,41902,41903,41904,41905,41906,41907,41908,41909,41910,41911,41912,41913,41914,41915,41916,41917,41918,41919,41920,41921,41922,41923,41924,41925,41926,41927,41928,41929,41930,41931,41932,41933,41934,41935,41936,41937,41938,41939,41940,41941,41942,41943,41944,41945,41946,41947,41948,41949,41950,41951,41952,41953,41954,41955,41956,41957,41958,41959,41960,41961,41962,41963,41964,41965,41966,41967,41968,41969,41970,41971,41972,41973,41974,41975,41976,41977,41978,41979,41980,41981,41982,41983,41984,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,41997,41998,41999,42000,42001,42002,42003,42004,42005,42006,42007,42008,42009,42010,42011,42012,42013,42014,42015,42016,42017,42018,42019,42020,42021,42022,42023,42024,42025,42026,42027,42028,42029,42030,42031,42032,42033,42034,42035,42036,42037,42038,42039,42040,42041,42042,42043,42044,42045,42046,42047,42048,42049,42050,42051,42052,42053,42054,42055,42056,42057,42058,42059,42060,42061,42062,42063,42064,42065,42066,42067,42068,42069,42070,42071,42072,42073,42074,42075,42076,42077,42078,42079,42080,42081,42082,42083,42084,42085,42086,42087,42088,42089,42090,42091,42092,42093,42094,42095,42096,42097,42098,42099,42100,42101,42102,42103,42104,42105,42106,42107,42108,42109,42110,42111,42112,42113,42114,42115,42116,42117,42118,42119,42120,42121,42122,42123,42124,42192,42193,42194,42195,42196,42197,42198,42199,42200,42201,42202,42203,42204,42205,42206,42207,42208,42209,42210,42211,42212,42213,42214,42215,42216,42217,42218,42219,42220,42221,42222,42223,42224,42225,42226,42227,42228,42229,42230,42231,42232,42233,42234,42235,42236,42237,42240,42241,42242,42243,42244,42245,42246,42247,42248,42249,42250,42251,42252,42253,42254,42255,42256,42257,42258,42259,42260,42261,42262,42263,42264,42265,42266,42267,42268,42269,42270,42271,42272,42273,42274,42275,42276,42277,42278,42279,42280,42281,42282,42283,42284,42285,42286,42287,42288,42289,42290,42291,42292,42293,42294,42295,42296,42297,42298,42299,42300,42301,42302,42303,42304,42305,42306,42307,42308,42309,42310,42311,42312,42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332,42333,42334,42335,42336,42337,42338,42339,42340,42341,42342,42343,42344,42345,42346,42347,42348,42349,42350,42351,42352,42353,42354,42355,42356,42357,42358,42359,42360,42361,42362,42363,42364,42365,42366,42367,42368,42369,42370,42371,42372,42373,42374,42375,42376,42377,42378,42379,42380,42381,42382,42383,42384,42385,42386,42387,42388,42389,42390,42391,42392,42393,42394,42395,42396,42397,42398,42399,42400,42401,42402,42403,42404,42405,42406,42407,42408,42409,42410,42411,42412,42413,42414,42415,42416,42417,42418,42419,42420,42421,42422,42423,42424,42425,42426,42427,42428,42429,42430,42431,42432,42433,42434,42435,42436,42437,42438,42439,42440,42441,42442,42443,42444,42445,42446,42447,42448,42449,42450,42451,42452,42453,42454,42455,42456,42457,42458,42459,42460,42461,42462,42463,42464,42465,42466,42467,42468,42469,42470,42471,42472,42473,42474,42475,42476,42477,42478,42479,42480,42481,42482,42483,42484,42485,42486,42487,42488,42489,42490,42491,42492,42493,42494,42495,42496,42497,42498,42499,42500,42501,42502,42503,42504,42505,42506,42507,42508,42512,42513,42514,42515,42516,42517,42518,42519,42520,42521,42522,42523,42524,42525,42526,42527,42538,42539,42560,42561,42562,42563,42564,42565,42566,42567,42568,42569,42570,42571,42572,42573,42574,42575,42576,42577,42578,42579,42580,42581,42582,42583,42584,42585,42586,42587,42588,42589,42590,42591,42592,42593,42594,42595,42596,42597,42598,42599,42600,42601,42602,42603,42604,42605,42606,42623,42624,42625,42626,42627,42628,42629,42630,42631,42632,42633,42634,42635,42636,42637,42638,42639,42640,42641,42642,42643,42644,42645,42646,42647,42648,42649,42650,42651,42652,42653,42656,42657,42658,42659,42660,42661,42662,42663,42664,42665,42666,42667,42668,42669,42670,42671,42672,42673,42674,42675,42676,42677,42678,42679,42680,42681,42682,42683,42684,42685,42686,42687,42688,42689,42690,42691,42692,42693,42694,42695,42696,42697,42698,42699,42700,42701,42702,42703,42704,42705,42706,42707,42708,42709,42710,42711,42712,42713,42714,42715,42716,42717,42718,42719,42720,42721,42722,42723,42724,42725,42726,42727,42728,42729,42730,42731,42732,42733,42734,42735,42775,42776,42777,42778,42779,42780,42781,42782,42783,42786,42787,42788,42789,42790,42791,42792,42793,42794,42795,42796,42797,42798,42799,42800,42801,42802,42803,42804,42805,42806,42807,42808,42809,42810,42811,42812,42813,42814,42815,42816,42817,42818,42819,42820,42821,42822,42823,42824,42825,42826,42827,42828,42829,42830,42831,42832,42833,42834,42835,42836,42837,42838,42839,42840,42841,42842,42843,42844,42845,42846,42847,42848,42849,42850,42851,42852,42853,42854,42855,42856,42857,42858,42859,42860,42861,42862,42863,42864,42865,42866,42867,42868,42869,42870,42871,42872,42873,42874,42875,42876,42877,42878,42879,42880,42881,42882,42883,42884,42885,42886,42887,42888,42891,42892,42893,42894,42895,42896,42897,42898,42899,42900,42901,42902,42903,42904,42905,42906,42907,42908,42909,42910,42911,42912,42913,42914,42915,42916,42917,42918,42919,42920,42921,42922,42923,42924,42925,42926,42927,42928,42929,42930,42931,42932,42933,42934,42935,42936,42937,42999,43000,43001,43002,43003,43004,43005,43006,43007,43008,43009,43011,43012,43013,43015,43016,43017,43018,43020,43021,43022,43023,43024,43025,43026,43027,43028,43029,43030,43031,43032,43033,43034,43035,43036,43037,43038,43039,43040,43041,43042,43072,43073,43074,43075,43076,43077,43078,43079,43080,43081,43082,43083,43084,43085,43086,43087,43088,43089,43090,43091,43092,43093,43094,43095,43096,43097,43098,43099,43100,43101,43102,43103,43104,43105,43106,43107,43108,43109,43110,43111,43112,43113,43114,43115,43116,43117,43118,43119,43120,43121,43122,43123,43138,43139,43140,43141,43142,43143,43144,43145,43146,43147,43148,43149,43150,43151,43152,43153,43154,43155,43156,43157,43158,43159,43160,43161,43162,43163,43164,43165,43166,43167,43168,43169,43170,43171,43172,43173,43174,43175,43176,43177,43178,43179,43180,43181,43182,43183,43184,43185,43186,43187,43250,43251,43252,43253,43254,43255,43259,43261,43262,43274,43275,43276,43277,43278,43279,43280,43281,43282,43283,43284,43285,43286,43287,43288,43289,43290,43291,43292,43293,43294,43295,43296,43297,43298,43299,43300,43301,43312,43313,43314,43315,43316,43317,43318,43319,43320,43321,43322,43323,43324,43325,43326,43327,43328,43329,43330,43331,43332,43333,43334,43360,43361,43362,43363,43364,43365,43366,43367,43368,43369,43370,43371,43372,43373,43374,43375,43376,43377,43378,43379,43380,43381,43382,43383,43384,43385,43386,43387,43388,43396,43397,43398,43399,43400,43401,43402,43403,43404,43405,43406,43407,43408,43409,43410,43411,43412,43413,43414,43415,43416,43417,43418,43419,43420,43421,43422,43423,43424,43425,43426,43427,43428,43429,43430,43431,43432,43433,43434,43435,43436,43437,43438,43439,43440,43441,43442,43471,43488,43489,43490,43491,43492,43494,43495,43496,43497,43498,43499,43500,43501,43502,43503,43514,43515,43516,43517,43518,43520,43521,43522,43523,43524,43525,43526,43527,43528,43529,43530,43531,43532,43533,43534,43535,43536,43537,43538,43539,43540,43541,43542,43543,43544,43545,43546,43547,43548,43549,43550,43551,43552,43553,43554,43555,43556,43557,43558,43559,43560,43584,43585,43586,43588,43589,43590,43591,43592,43593,43594,43595,43616,43617,43618,43619,43620,43621,43622,43623,43624,43625,43626,43627,43628,43629,43630,43631,43632,43633,43634,43635,43636,43637,43638,43642,43646,43647,43648,43649,43650,43651,43652,43653,43654,43655,43656,43657,43658,43659,43660,43661,43662,43663,43664,43665,43666,43667,43668,43669,43670,43671,43672,43673,43674,43675,43676,43677,43678,43679,43680,43681,43682,43683,43684,43685,43686,43687,43688,43689,43690,43691,43692,43693,43694,43695,43697,43701,43702,43705,43706,43707,43708,43709,43712,43714,43739,43740,43741,43744,43745,43746,43747,43748,43749,43750,43751,43752,43753,43754,43762,43763,43764,43777,43778,43779,43780,43781,43782,43785,43786,43787,43788,43789,43790,43793,43794,43795,43796,43797,43798,43808,43809,43810,43811,43812,43813,43814,43816,43817,43818,43819,43820,43821,43822,43824,43825,43826,43827,43828,43829,43830,43831,43832,43833,43834,43835,43836,43837,43838,43839,43840,43841,43842,43843,43844,43845,43846,43847,43848,43849,43850,43851,43852,43853,43854,43855,43856,43857,43858,43859,43860,43861,43862,43863,43864,43865,43866,43868,43869,43870,43871,43872,43873,43874,43875,43876,43877,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,43968,43969,43970,43971,43972,43973,43974,43975,43976,43977,43978,43979,43980,43981,43982,43983,43984,43985,43986,43987,43988,43989,43990,43991,43992,43993,43994,43995,43996,43997,43998,43999,44000,44001,44002,44032,44033,44034,44035,44036,44037,44038,44039,44040,44041,44042,44043,44044,44045,44046,44047,44048,44049,44050,44051,44052,44053,44054,44055,44056,44057,44058,44059,44060,44061,44062,44063,44064,44065,44066,44067,44068,44069,44070,44071,44072,44073,44074,44075,44076,44077,44078,44079,44080,44081,44082,44083,44084,44085,44086,44087,44088,44089,44090,44091,44092,44093,44094,44095,44096,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44107,44108,44109,44110,44111,44112,44113,44114,44115,44116,44117,44118,44119,44120,44121,44122,44123,44124,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44144,44145,44146,44147,44148,44149,44150,44151,44152,44153,44154,44155,44156,44157,44158,44159,44160,44161,44162,44163,44164,44165,44166,44167,44168,44169,44170,44171,44172,44173,44174,44175,44176,44177,44178,44179,44180,44181,44182,44183,44184,44185,44186,44187,44188,44189,44190,44191,44192,44193,44194,44195,44196,44197,44198,44199,44200,44201,44202,44203,44204,44205,44206,44207,44208,44209,44210,44211,44212,44213,44214,44215,44216,44217,44218,44219,44220,44221,44222,44223,44224,44225,44226,44227,44228,44229,44230,44231,44232,44233,44234,44235,44236,44237,44238,44239,44240,44241,44242,44243,44244,44245,44246,44247,44248,44249,44250,44251,44252,44253,44254,44255,44256,44257,44258,44259,44260,44261,44262,44263,44264,44265,44266,44267,44268,44269,44270,44271,44272,44273,44274,44275,44276,44277,44278,44279,44280,44281,44282,44283,44284,44285,44286,44287,44288,44289,44290,44291,44292,44293,44294,44295,44296,44297,44298,44299,44300,44301,44302,44303,44304,44305,44306,44307,44308,44309,44310,44311,44312,44313,44314,44315,44316,44317,44318,44319,44320,44321,44322,44323,44324,44325,44326,44327,44328,44329,44330,44331,44332,44333,44334,44335,44336,44337,44338,44339,44340,44341,44342,44343,44344,44345,44346,44347,44348,44349,44350,44351,44352,44353,44354,44355,44356,44357,44358,44359,44360,44361,44362,44363,44364,44365,44366,44367,44368,44369,44370,44371,44372,44373,44374,44375,44376,44377,44378,44379,44380,44381,44382,44383,44384,44385,44386,44387,44388,44389,44390,44391,44392,44393,44394,44395,44396,44397,44398,44399,44400,44401,44402,44403,44404,44405,44406,44407,44408,44409,44410,44411,44412,44413,44414,44415,44416,44417,44418,44419,44420,44421,44422,44423,44424,44425,44426,44427,44428,44429,44430,44431,44432,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44444,44445,44446,44447,44448,44449,44450,44451,44452,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44471,44472,44473,44474,44475,44476,44477,44478,44479,44480,44481,44482,44483,44484,44485,44486,44487,44488,44489,44490,44491,44492,44493,44494,44495,44496,44497,44498,44499,44500,44501,44502,44503,44504,44505,44506,44507,44508,44509,44510,44511,44512,44513,44514,44515,44516,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44536,44537,44538,44539,44540,44541,44542,44543,44544,44545,44546,44547,44548,44549,44550,44551,44552,44553,44554,44555,44556,44557,44558,44559,44560,44561,44562,44563,44564,44565,44566,44567,44568,44569,44570,44571,44572,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44592,44593,44594,44595,44596,44597,44598,44599,44600,44601,44602,44603,44604,44605,44606,44607,44608,44609,44610,44611,44612,44613,44614,44615,44616,44617,44618,44619,44620,44621,44622,44623,44624,44625,44626,44627,44628,44629,44630,44631,44632,44633,44634,44635,44636,44637,44638,44639,44640,44641,44642,44643,44644,44645,44646,44647,44648,44649,44650,44651,44652,44653,44654,44655,44656,44657,44658,44659,44660,44661,44662,44663,44664,44665,44666,44667,44668,44669,44670,44671,44672,44673,44674,44675,44676,44677,44678,44679,44680,44681,44682,44683,44684,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44732,44733,44734,44735,44736,44737,44738,44739,44740,44741,44742,44743,44744,44745,44746,44747,44748,44749,44750,44751,44752,44753,44754,44755,44756,44757,44758,44759,44760,44761,44762,44763,44764,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44776,44777,44778,44779,44780,44781,44782,44783,44784,44785,44786,44787,44788,44789,44790,44791,44792,44793,44794,44795,44796,44797,44798,44799,44800,44801,44802,44803,44804,44805,44806,44807,44808,44809,44810,44811,44812,44813,44814,44815,44816,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,44836,44837,44838,44839,44840,44841,44842,44843,44844,44845,44846,44847,44848,44849,44850,44851,44852,44853,44854,44855,44856,44857,44858,44859,44860,44861,44862,44863,44864,44865,44866,44867,44868,44869,44870,44871,44872,44873,44874,44875,44876,44877,44878,44879,44880,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44892,44893,44894,44895,44896,44897,44898,44899,44900,44901,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44921,44922,44923,44924,44925,44926,44927,44928,44929,44930,44931,44932,44933,44934,44935,44936,44937,44938,44939,44940,44941,44942,44943,44944,44945,44946,44947,44948,44949,44950,44951,44952,44953,44954,44955,44956,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44984,44985,44986,44987,44988,44989,44990,44991,44992,44993,44994,44995,44996,44997,44998,44999,45000,45001,45002,45003,45004,45005,45006,45007,45008,45009,45010,45011,45012,45013,45014,45015,45016,45017,45018,45019,45020,45021,45022,45023,45024,45025,45026,45027,45028,45029,45030,45031,45032,45033,45034,45035,45036,45037,45038,45039,45040,45041,45042,45043,45044,45045,45046,45047,45048,45049,45050,45051,45052,45053,45054,45055,45056,45057,45058,45059,45060,45061,45062,45063,45064,45065,45066,45067,45068,45069,45070,45071,45072,45073,45074,45075,45076,45077,45078,45079,45080,45081,45082,45083,45084,45085,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45096,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45124,45125,45126,45127,45128,45129,45130,45131,45132,45133,45134,45135,45136,45137,45138,45139,45140,45141,45142,45143,45144,45145,45146,45147,45148,45149,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45180,45181,45182,45183,45184,45185,45186,45187,45188,45189,45190,45191,45192,45193,45194,45195,45196,45197,45198,45199,45200,45201,45202,45203,45204,45205,45206,45207,45208,45209,45210,45211,45212,45213,45214,45215,45216,45217,45218,45219,45220,45221,45222,45223,45224,45225,45226,45227,45228,45229,45230,45231,45232,45233,45234,45235,45236,45237,45238,45239,45240,45241,45242,45243,45244,45245,45246,45247,45248,45249,45250,45251,45252,45253,45254,45255,45256,45257,45258,45259,45260,45261,45262,45263,45264,45265,45266,45267,45268,45269,45270,45271,45272,45273,45274,45275,45276,45277,45278,45279,45280,45281,45282,45283,45284,45285,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45320,45321,45322,45323,45324,45325,45326,45327,45328,45329,45330,45331,45332,45333,45334,45335,45336,45337,45338,45339,45340,45341,45342,45343,45344,45345,45346,45347,45348,45349,45350,45351,45352,45353,45354,45355,45356,45357,45358,45359,45360,45361,45362,45363,45364,45365,45366,45367,45368,45369,45370,45371,45372,45373,45374,45375,45376,45377,45378,45379,45380,45381,45382,45383,45384,45385,45386,45387,45388,45389,45390,45391,45392,45393,45394,45395,45396,45397,45398,45399,45400,45401,45402,45403,45404,45405,45406,45407,45408,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45432,45433,45434,45435,45436,45437,45438,45439,45440,45441,45442,45443,45444,45445,45446,45447,45448,45449,45450,45451,45452,45453,45454,45455,45456,45457,45458,45459,45460,45461,45462,45463,45464,45465,45466,45467,45468,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45480,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45516,45517,45518,45519,45520,45521,45522,45523,45524,45525,45526,45527,45528,45529,45530,45531,45532,45533,45534,45535,45536,45537,45538,45539,45540,45541,45542,45543,45544,45545,45546,45547,45548,45549,45550,45551,45552,45553,45554,45555,45556,45557,45558,45559,45560,45561,45562,45563,45564,45565,45566,45567,45568,45569,45570,45571,45572,45573,45574,45575,45576,45577,45578,45579,45580,45581,45582,45583,45584,45585,45586,45587,45588,45589,45590,45591,45592,45593,45594,45595,45596,45597,45598,45599,45600,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45620,45621,45622,45623,45624,45625,45626,45627,45628,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45656,45657,45658,45659,45660,45661,45662,45663,45664,45665,45666,45667,45668,45669,45670,45671,45672,45673,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45684,45685,45686,45687,45688,45689,45690,45691,45692,45693,45694,45695,45696,45697,45698,45699,45700,45701,45702,45703,45704,45705,45706,45707,45708,45709,45710,45711,45712,45713,45714,45715,45716,45717,45718,45719,45720,45721,45722,45723,45724,45725,45726,45727,45728,45729,45730,45731,45732,45733,45734,45735,45736,45737,45738,45739,45740,45741,45742,45743,45744,45745,45746,45747,45748,45749,45750,45751,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45768,45769,45770,45771,45772,45773,45774,45775,45776,45777,45778,45779,45780,45781,45782,45783,45784,45785,45786,45787,45788,45789,45790,45791,45792,45793,45794,45795,45796,45797,45798,45799,45800,45801,45802,45803,45804,45805,45806,45807,45808,45809,45810,45811,45812,45813,45814,45815,45816,45817,45818,45819,45820,45821,45822,45823,45824,45825,45826,45827,45828,45829,45830,45831,45832,45833,45834,45835,45836,45837,45838,45839,45840,45841,45842,45843,45844,45845,45846,45847,45848,45849,45850,45851,45852,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45908,45909,45910,45911,45912,45913,45914,45915,45916,45917,45918,45919,45920,45921,45922,45923,45924,45925,45926,45927,45928,45929,45930,45931,45932,45933,45934,45935,45936,45937,45938,45939,45940,45941,45942,45943,45944,45945,45946,45947,45948,45949,45950,45951,45952,45953,45954,45955,45956,45957,45958,45959,45960,45961,45962,45963,45964,45965,45966,45967,45968,45969,45970,45971,45972,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45984,45985,45986,45987,45988,45989,45990,45991,45992,45993,45994,45995,45996,45997,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46020,46021,46022,46023,46024,46025,46026,46027,46028,46029,46030,46031,46032,46033,46034,46035,46036,46037,46038,46039,46040,46041,46042,46043,46044,46045,46046,46047,46048,46049,46050,46051,46052,46053,46054,46055,46056,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46076,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46096,46097,46098,46099,46100,46101,46102,46103,46104,46105,46106,46107,46108,46109,46110,46111,46112,46113,46114,46115,46116,46117,46118,46119,46120,46121,46122,46123,46124,46125,46126,46127,46128,46129,46130,46131,46132,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46160,46161,46162,46163,46164,46165,46166,46167,46168,46169,46170,46171,46172,46173,46174,46175,46176,46177,46178,46179,46180,46181,46182,46183,46184,46185,46186,46187,46188,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46208,46209,46210,46211,46212,46213,46214,46215,46216,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46237,46238,46239,46240,46241,46242,46243,46244,46245,46246,46247,46248,46249,46250,46251,46252,46253,46254,46255,46256,46257,46258,46259,46260,46261,46262,46263,46264,46265,46266,46267,46268,46269,46270,46271,46272,46273,46274,46275,46276,46277,46278,46279,46280,46281,46282,46283,46284,46285,46286,46287,46288,46289,46290,46291,46292,46293,46294,46295,46296,46297,46298,46299,46300,46301,46302,46303,46304,46305,46306,46307,46308,46309,46310,46311,46312,46313,46314,46315,46316,46317,46318,46319,46320,46321,46322,46323,46324,46325,46326,46327,46328,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46356,46357,46358,46359,46360,46361,46362,46363,46364,46365,46366,46367,46368,46369,46370,46371,46372,46373,46374,46375,46376,46377,46378,46379,46380,46381,46382,46383,46384,46385,46386,46387,46388,46389,46390,46391,46392,46393,46394,46395,46396,46397,46398,46399,46400,46401,46402,46403,46404,46405,46406,46407,46408,46409,46410,46411,46412,46413,46414,46415,46416,46417,46418,46419,46420,46421,46422,46423,46424,46425,46426,46427,46428,46429,46430,46431,46432,46433,46434,46435,46436,46437,46438,46439,46440,46441,46442,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46496,46497,46498,46499,46500,46501,46502,46503,46504,46505,46506,46507,46508,46509,46510,46511,46512,46513,46514,46515,46516,46517,46518,46519,46520,46521,46522,46523,46524,46525,46526,46527,46528,46529,46530,46531,46532,46533,46534,46535,46536,46537,46538,46539,46540,46541,46542,46543,46544,46545,46546,46547,46548,46549,46550,46551,46552,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46572,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46608,46609,46610,46611,46612,46613,46614,46615,46616,46617,46618,46619,46620,46621,46622,46623,46624,46625,46626,46627,46628,46629,46630,46631,46632,46633,46634,46635,46636,46637,46638,46639,46640,46641,46642,46643,46644,46645,46646,46647,46648,46649,46650,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46664,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46692,46693,46694,46695,46696,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46748,46749,46750,46751,46752,46753,46754,46755,46756,46757,46758,46759,46760,46761,46762,46763,46764,46765,46766,46767,46768,46769,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46804,46805,46806,46807,46808,46809,46810,46811,46812,46813,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46832,46833,46834,46835,46836,46837,46838,46839,46840,46841,46842,46843,46844,46845,46846,46847,46848,46849,46850,46851,46852,46853,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46888,46889,46890,46891,46892,46893,46894,46895,46896,46897,46898,46899,46900,46901,46902,46903,46904,46905,46906,46907,46908,46909,46910,46911,46912,46913,46914,46915,46916,46917,46918,46919,46920,46921,46922,46923,46924,46925,46926,46927,46928,46929,46930,46931,46932,46933,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46944,46945,46946,46947,46948,46949,46950,46951,46952,46953,46954,46955,46956,46957,46958,46959,46960,46961,46962,46963,46964,46965,46966,46967,46968,46969,46970,46971,46972,46973,46974,46975,46976,46977,46978,46979,46980,46981,46982,46983,46984,46985,46986,46987,46988,46989,46990,46991,46992,46993,46994,46995,46996,46997,46998,46999,47000,47001,47002,47003,47004,47005,47006,47007,47008,47009,47010,47011,47012,47013,47014,47015,47016,47017,47018,47019,47020,47021,47022,47023,47024,47025,47026,47027,47028,47029,47030,47031,47032,47033,47034,47035,47036,47037,47038,47039,47040,47041,47042,47043,47044,47045,47046,47047,47048,47049,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47084,47085,47086,47087,47088,47089,47090,47091,47092,47093,47094,47095,47096,47097,47098,47099,47100,47101,47102,47103,47104,47105,47106,47107,47108,47109,47110,47111,47112,47113,47114,47115,47116,47117,47118,47119,47120,47121,47122,47123,47124,47125,47126,47127,47128,47129,47130,47131,47132,47133,47134,47135,47136,47137,47138,47139,47140,47141,47142,47143,47144,47145,47146,47147,47148,47149,47150,47151,47152,47153,47154,47155,47156,47157,47158,47159,47160,47161,47162,47163,47164,47165,47166,47167,47168,47169,47170,47171,47172,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47185,47186,47187,47188,47189,47190,47191,47192,47193,47194,47195,47196,47197,47198,47199,47200,47201,47202,47203,47204,47205,47206,47207,47208,47209,47210,47211,47212,47213,47214,47215,47216,47217,47218,47219,47220,47221,47222,47223,47224,47225,47226,47227,47228,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47245,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,47264,47265,47266,47267,47268,47269,47270,47271,47272,47273,47274,47275,47276,47277,47278,47279,47280,47281,47282,47283,47284,47285,47286,47287,47288,47289,47290,47291,47292,47293,47294,47295,47296,47297,47298,47299,47300,47301,47302,47303,47304,47305,47306,47307,47308,47309,47310,47311,47312,47313,47314,47315,47316,47317,47318,47319,47320,47321,47322,47323,47324,47325,47326,47327,47328,47329,47330,47331,47332,47333,47334,47335,47336,47337,47338,47339,47340,47341,47342,47343,47344,47345,47346,47347,47348,47349,47350,47351,47352,47353,47354,47355,47356,47357,47358,47359,47360,47361,47362,47363,47364,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47384,47385,47386,47387,47388,47389,47390,47391,47392,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47420,47421,47422,47423,47424,47425,47426,47427,47428,47429,47430,47431,47432,47433,47434,47435,47436,47437,47438,47439,47440,47441,47442,47443,47444,47445,47446,47447,47448,47449,47450,47451,47452,47453,47454,47455,47456,47457,47458,47459,47460,47461,47462,47463,47464,47465,47466,47467,47468,47469,47470,47471,47472,47473,47474,47475,47476,47477,47478,47479,47480,47481,47482,47483,47484,47485,47486,47487,47488,47489,47490,47491,47492,47493,47494,47495,47496,47497,47498,47499,47500,47501,47502,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47532,47533,47534,47535,47536,47537,47538,47539,47540,47541,47542,47543,47544,47545,47546,47547,47548,47549,47550,47551,47552,47553,47554,47555,47556,47557,47558,47559,47560,47561,47562,47563,47564,47565,47566,47567,47568,47569,47570,47571,47572,47573,47574,47575,47576,47577,47578,47579,47580,47581,47582,47583,47584,47585,47586,47587,47588,47589,47590,47591,47592,47593,47594,47595,47596,47597,47598,47599,47600,47601,47602,47603,47604,47605,47606,47607,47608,47609,47610,47611,47612,47613,47614,47615,47616,47617,47618,47619,47620,47621,47622,47623,47624,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47637,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47672,47673,47674,47675,47676,47677,47678,47679,47680,47681,47682,47683,47684,47685,47686,47687,47688,47689,47690,47691,47692,47693,47694,47695,47696,47697,47698,47699,47700,47701,47702,47703,47704,47705,47706,47707,47708,47709,47710,47711,47712,47713,47714,47715,47716,47717,47718,47719,47720,47721,47722,47723,47724,47725,47726,47727,47728,47729,47730,47731,47732,47733,47734,47735,47736,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47747,47748,47749,47750,47751,47752,47753,47754,47755,47756,47757,47758,47759,47760,47761,47762,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47784,47785,47786,47787,47788,47789,47790,47791,47792,47793,47794,47795,47796,47797,47798,47799,47800,47801,47802,47803,47804,47805,47806,47807,47808,47809,47810,47811,47812,47813,47814,47815,47816,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47832,47833,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47868,47869,47870,47871,47872,47873,47874,47875,47876,47877,47878,47879,47880,47881,47882,47883,47884,47885,47886,47887,47888,47889,47890,47891,47892,47893,47894,47895,47896,47897,47898,47899,47900,47901,47902,47903,47904,47905,47906,47907,47908,47909,47910,47911,47912,47913,47914,47915,47916,47917,47918,47919,47920,47921,47922,47923,47924,47925,47926,47927,47928,47929,47930,47931,47932,47933,47934,47935,47936,47937,47938,47939,47940,47941,47942,47943,47944,47945,47946,47947,47948,47949,47950,47951,47952,47953,47954,47955,47956,47957,47958,47959,47960,47961,47962,47963,47964,47965,47966,47967,47968,47969,47970,47971,47972,47973,47974,47975,47976,47977,47978,47979,47980,47981,47982,47983,47984,47985,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48008,48009,48010,48011,48012,48013,48014,48015,48016,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48036,48037,48038,48039,48040,48041,48042,48043,48044,48045,48046,48047,48048,48049,48050,48051,48052,48053,48054,48055,48056,48057,48058,48059,48060,48061,48062,48063,48064,48065,48066,48067,48068,48069,48070,48071,48072,48073,48074,48075,48076,48077,48078,48079,48080,48081,48082,48083,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48120,48121,48122,48123,48124,48125,48126,48127,48128,48129,48130,48131,48132,48133,48134,48135,48136,48137,48138,48139,48140,48141,48142,48143,48144,48145,48146,48147,48148,48149,48150,48151,48152,48153,48154,48155,48156,48157,48158,48159,48160,48161,48162,48163,48164,48165,48166,48167,48168,48169,48170,48171,48172,48173,48174,48175,48176,48177,48178,48179,48180,48181,48182,48183,48184,48185,48186,48187,48188,48189,48190,48191,48192,48193,48194,48195,48196,48197,48198,48199,48200,48201,48202,48203,48204,48205,48206,48207,48208,48209,48210,48211,48212,48213,48214,48215,48216,48217,48218,48219,48220,48221,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48260,48261,48262,48263,48264,48265,48266,48267,48268,48269,48270,48271,48272,48273,48274,48275,48276,48277,48278,48279,48280,48281,48282,48283,48284,48285,48286,48287,48288,48289,48290,48291,48292,48293,48294,48295,48296,48297,48298,48299,48300,48301,48302,48303,48304,48305,48306,48307,48308,48309,48310,48311,48312,48313,48314,48315,48316,48317,48318,48319,48320,48321,48322,48323,48324,48325,48326,48327,48328,48329,48330,48331,48332,48333,48334,48335,48336,48337,48338,48339,48340,48341,48342,48343,48344,48345,48346,48347,48348,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48372,48373,48374,48375,48376,48377,48378,48379,48380,48381,48382,48383,48384,48385,48386,48387,48388,48389,48390,48391,48392,48393,48394,48395,48396,48397,48398,48399,48400,48401,48402,48403,48404,48405,48406,48407,48408,48409,48410,48411,48412,48413,48414,48415,48416,48417,48418,48419,48420,48421,48422,48423,48424,48425,48426,48427,48428,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,48442,48443,48444,48445,48446,48447,48448,48449,48450,48451,48452,48453,48454,48455,48456,48457,48458,48459,48460,48461,48462,48463,48464,48465,48466,48467,48468,48469,48470,48471,48472,48473,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48484,48485,48486,48487,48488,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48512,48513,48514,48515,48516,48517,48518,48519,48520,48521,48522,48523,48524,48525,48526,48527,48528,48529,48530,48531,48532,48533,48534,48535,48536,48537,48538,48539,48540,48541,48542,48543,48544,48545,48546,48547,48548,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48560,48561,48562,48563,48564,48565,48566,48567,48568,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48596,48597,48598,48599,48600,48601,48602,48603,48604,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48617,48618,48619,48620,48621,48622,48623,48624,48625,48626,48627,48628,48629,48630,48631,48632,48633,48634,48635,48636,48637,48638,48639,48640,48641,48642,48643,48644,48645,48646,48647,48648,48649,48650,48651,48652,48653,48654,48655,48656,48657,48658,48659,48660,48661,48662,48663,48664,48665,48666,48667,48668,48669,48670,48671,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48708,48709,48710,48711,48712,48713,48714,48715,48716,48717,48718,48719,48720,48721,48722,48723,48724,48725,48726,48727,48728,48729,48730,48731,48732,48733,48734,48735,48736,48737,48738,48739,48740,48741,48742,48743,48744,48745,48746,48747,48748,48749,48750,48751,48752,48753,48754,48755,48756,48757,48758,48759,48760,48761,48762,48763,48764,48765,48766,48767,48768,48769,48770,48771,48772,48773,48774,48775,48776,48777,48778,48779,48780,48781,48782,48783,48784,48785,48786,48787,48788,48789,48790,48791,48792,48793,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48808,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48848,48849,48850,48851,48852,48853,48854,48855,48856,48857,48858,48859,48860,48861,48862,48863,48864,48865,48866,48867,48868,48869,48870,48871,48872,48873,48874,48875,48876,48877,48878,48879,48880,48881,48882,48883,48884,48885,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48897,48898,48899,48900,48901,48902,48903,48904,48905,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48920,48921,48922,48923,48924,48925,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48960,48961,48962,48963,48964,48965,48966,48967,48968,48969,48970,48971,48972,48973,48974,48975,48976,48977,48978,48979,48980,48981,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49044,49045,49046,49047,49048,49049,49050,49051,49052,49053,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49072,49073,49074,49075,49076,49077,49078,49079,49080,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49093,49094,49095,49096,49097,49098,49099,49100,49101,49102,49103,49104,49105,49106,49107,49108,49109,49110,49111,49112,49113,49114,49115,49116,49117,49118,49119,49120,49121,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49212,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49233,49234,49235,49236,49237,49238,49239,49240,49241,49242,49243,49244,49245,49246,49247,49248,49249,49250,49251,49252,49253,49254,49255,49256,49257,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49296,49297,49298,49299,49300,49301,49302,49303,49304,49305,49306,49307,49308,49309,49310,49311,49312,49313,49314,49315,49316,49317,49318,49319,49320,49321,49322,49323,49324,49325,49326,49327,49328,49329,49330,49331,49332,49333,49334,49335,49336,49337,49338,49339,49340,49341,49342,49343,49344,49345,49346,49347,49348,49349,49350,49351,49352,49353,49354,49355,49356,49357,49358,49359,49360,49361,49362,49363,49364,49365,49366,49367,49368,49369,49370,49371,49372,49373,49374,49375,49376,49377,49378,49379,49380,49381,49382,49383,49384,49385,49386,49387,49388,49389,49390,49391,49392,49393,49394,49395,49396,49397,49398,49399,49400,49401,49402,49403,49404,49405,49406,49407,49408,49409,49410,49411,49412,49413,49414,49415,49416,49417,49418,49419,49420,49421,49422,49423,49424,49425,49426,49427,49428,49429,49430,49431,49432,49433,49434,49435,49436,49437,49438,49439,49440,49441,49442,49443,49444,49445,49446,49447,49448,49449,49450,49451,49452,49453,49454,49455,49456,49457,49458,49459,49460,49461,49462,49463,49464,49465,49466,49467,49468,49469,49470,49471,49472,49473,49474,49475,49476,49477,49478,49479,49480,49481,49482,49483,49484,49485,49486,49487,49488,49489,49490,49491,49492,49493,49494,49495,49496,49497,49498,49499,49500,49501,49502,49503,49504,49505,49506,49507,49508,49509,49510,49511,49512,49513,49514,49515,49516,49517,49518,49519,49520,49521,49522,49523,49524,49525,49526,49527,49528,49529,49530,49531,49532,49533,49534,49535,49536,49537,49538,49539,49540,49541,49542,49543,49544,49545,49546,49547,49548,49549,49550,49551,49552,49553,49554,49555,49556,49557,49558,49559,49560,49561,49562,49563,49564,49565,49566,49567,49568,49569,49570,49571,49572,49573,49574,49575,49576,49577,49578,49579,49580,49581,49582,49583,49584,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49597,49598,49599,49600,49601,49602,49603,49604,49605,49606,49607,49608,49609,49610,49611,49612,49613,49614,49615,49616,49617,49618,49619,49620,49621,49622,49623,49624,49625,49626,49627,49628,49629,49630,49631,49632,49633,49634,49635,49636,49637,49638,49639,49640,49641,49642,49643,49644,49645,49646,49647,49648,49649,49650,49651,49652,49653,49654,49655,49656,49657,49658,49659,49660,49661,49662,49663,49664,49665,49666,49667,49668,49669,49670,49671,49672,49673,49674,49675,49676,49677,49678,49679,49680,49681,49682,49683,49684,49685,49686,49687,49688,49689,49690,49691,49692,49693,49694,49695,49696,49697,49698,49699,49700,49701,49702,49703,49704,49705,49706,49707,49708,49709,49710,49711,49712,49713,49714,49715,49716,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,49734,49735,49736,49737,49738,49739,49740,49741,49742,49743,49744,49745,49746,49747,49748,49749,49750,49751,49752,49753,49754,49755,49756,49757,49758,49759,49760,49761,49762,49763,49764,49765,49766,49767,49768,49769,49770,49771,49772,49773,49774,49775,49776,49777,49778,49779,49780,49781,49782,49783,49784,49785,49786,49787,49788,49789,49790,49791,49792,49793,49794,49795,49796,49797,49798,49799,49800,49801,49802,49803,49804,49805,49806,49807,49808,49809,49810,49811,49812,49813,49814,49815,49816,49817,49818,49819,49820,49821,49822,49823,49824,49825,49826,49827,49828,49829,49830,49831,49832,49833,49834,49835,49836,49837,49838,49839,49840,49841,49842,49843,49844,49845,49846,49847,49848,49849,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49884,49885,49886,49887,49888,49889,49890,49891,49892,49893,49894,49895,49896,49897,49898,49899,49900,49901,49902,49903,49904,49905,49906,49907,49908,49909,49910,49911,49912,49913,49914,49915,49916,49917,49918,49919,49920,49921,49922,49923,49924,49925,49926,49927,49928,49929,49930,49931,49932,49933,49934,49935,49936,49937,49938,49939,49940,49941,49942,49943,49944,49945,49946,49947,49948,49949,49950,49951,49952,49953,49954,49955,49956,49957,49958,49959,49960,49961,49962,49963,49964,49965,49966,49967,49968,49969,49970,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49989,49990,49991,49992,49993,49994,49995,49996,49997,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50024,50025,50026,50027,50028,50029,50030,50031,50032,50033,50034,50035,50036,50037,50038,50039,50040,50041,50042,50043,50044,50045,50046,50047,50048,50049,50050,50051,50052,50053,50054,50055,50056,50057,50058,50059,50060,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50112,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50136,50137,50138,50139,50140,50141,50142,50143,50144,50145,50146,50147,50148,50149,50150,50151,50152,50153,50154,50155,50156,50157,50158,50159,50160,50161,50162,50163,50164,50165,50166,50167,50168,50169,50170,50171,50172,50173,50174,50175,50176,50177,50178,50179,50180,50181,50182,50183,50184,50185,50186,50187,50188,50189,50190,50191,50192,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,50203,50204,50205,50206,50207,50208,50209,50210,50211,50212,50213,50214,50215,50216,50217,50218,50219,50220,50221,50222,50223,50224,50225,50226,50227,50228,50229,50230,50231,50232,50233,50234,50235,50236,50237,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50248,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50276,50277,50278,50279,50280,50281,50282,50283,50284,50285,50286,50287,50288,50289,50290,50291,50292,50293,50294,50295,50296,50297,50298,50299,50300,50301,50302,50303,50304,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50324,50325,50326,50327,50328,50329,50330,50331,50332,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50360,50361,50362,50363,50364,50365,50366,50367,50368,50369,50370,50371,50372,50373,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,50400,50401,50402,50403,50404,50405,50406,50407,50408,50409,50410,50411,50412,50413,50414,50415,50416,50417,50418,50419,50420,50421,50422,50423,50424,50425,50426,50427,50428,50429,50430,50431,50432,50433,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50444,50445,50446,50447,50448,50449,50450,50451,50452,50453,50454,50455,50456,50457,50458,50459,50460,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50472,50473,50474,50475,50476,50477,50478,50479,50480,50481,50482,50483,50484,50485,50486,50487,50488,50489,50490,50491,50492,50493,50494,50495,50496,50497,50498,50499,50500,50501,50502,50503,50504,50505,50506,50507,50508,50509,50510,50511,50512,50513,50514,50515,50516,50517,50518,50519,50520,50521,50522,50523,50524,50525,50526,50527,50528,50529,50530,50531,50532,50533,50534,50535,50536,50537,50538,50539,50540,50541,50542,50543,50544,50545,50546,50547,50548,50549,50550,50551,50552,50553,50554,50555,50556,50557,50558,50559,50560,50561,50562,50563,50564,50565,50566,50567,50568,50569,50570,50571,50572,50573,50574,50575,50576,50577,50578,50579,50580,50581,50582,50583,50584,50585,50586,50587,50588,50589,50590,50591,50592,50593,50594,50595,50596,50597,50598,50599,50600,50601,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50612,50613,50614,50615,50616,50617,50618,50619,50620,50621,50622,50623,50624,50625,50626,50627,50628,50629,50630,50631,50632,50633,50634,50635,50636,50637,50638,50639,50640,50641,50642,50643,50644,50645,50646,50647,50648,50649,50650,50651,50652,50653,50654,50655,50656,50657,50658,50659,50660,50661,50662,50663,50664,50665,50666,50667,50668,50669,50670,50671,50672,50673,50674,50675,50676,50677,50678,50679,50680,50681,50682,50683,50684,50685,50686,50687,50688,50689,50690,50691,50692,50693,50694,50695,50696,50697,50698,50699,50700,50701,50702,50703,50704,50705,50706,50707,50708,50709,50710,50711,50712,50713,50714,50715,50716,50717,50718,50719,50720,50721,50722,50723,50724,50725,50726,50727,50728,50729,50730,50731,50732,50733,50734,50735,50736,50737,50738,50739,50740,50741,50742,50743,50744,50745,50746,50747,50748,50749,50750,50751,50752,50753,50754,50755,50756,50757,50758,50759,50760,50761,50762,50763,50764,50765,50766,50767,50768,50769,50770,50771,50772,50773,50774,50775,50776,50777,50778,50779,50780,50781,50782,50783,50784,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50796,50797,50798,50799,50800,50801,50802,50803,50804,50805,50806,50807,50808,50809,50810,50811,50812,50813,50814,50815,50816,50817,50818,50819,50820,50821,50822,50823,50824,50825,50826,50827,50828,50829,50830,50831,50832,50833,50834,50835,50836,50837,50838,50839,50840,50841,50842,50843,50844,50845,50846,50847,50848,50849,50850,50851,50852,50853,50854,50855,50856,50857,50858,50859,50860,50861,50862,50863,50864,50865,50866,50867,50868,50869,50870,50871,50872,50873,50874,50875,50876,50877,50878,50879,50880,50881,50882,50883,50884,50885,50886,50887,50888,50889,50890,50891,50892,50893,50894,50895,50896,50897,50898,50899,50900,50901,50902,50903,50904,50905,50906,50907,50908,50909,50910,50911,50912,50913,50914,50915,50916,50917,50918,50919,50920,50921,50922,50923,50924,50925,50926,50927,50928,50929,50930,50931,50932,50933,50934,50935,50936,50937,50938,50939,50940,50941,50942,50943,50944,50945,50946,50947,50948,50949,50950,50951,50952,50953,50954,50955,50956,50957,50958,50959,50960,50961,50962,50963,50964,50965,50966,50967,50968,50969,50970,50971,50972,50973,50974,50975,50976,50977,50978,50979,50980,50981,50982,50983,50984,50985,50986,50987,50988,50989,50990,50991,50992,50993,50994,50995,50996,50997,50998,50999,51000,51001,51002,51003,51004,51005,51006,51007,51008,51009,51010,51011,51012,51013,51014,51015,51016,51017,51018,51019,51020,51021,51022,51023,51024,51025,51026,51027,51028,51029,51030,51031,51032,51033,51034,51035,51036,51037,51038,51039,51040,51041,51042,51043,51044,51045,51046,51047,51048,51049,51050,51051,51052,51053,51054,51055,51056,51057,51058,51059,51060,51061,51062,51063,51064,51065,51066,51067,51068,51069,51070,51071,51072,51073,51074,51075,51076,51077,51078,51079,51080,51081,51082,51083,51084,51085,51086,51087,51088,51089,51090,51091,51092,51093,51094,51095,51096,51097,51098,51099,51100,51101,51102,51103,51104,51105,51106,51107,51108,51109,51110,51111,51112,51113,51114,51115,51116,51117,51118,51119,51120,51121,51122,51123,51124,51125,51126,51127,51128,51129,51130,51131,51132,51133,51134,51135,51136,51137,51138,51139,51140,51141,51142,51143,51144,51145,51146,51147,51148,51149,51150,51151,51152,51153,51154,51155,51156,51157,51158,51159,51160,51161,51162,51163,51164,51165,51166,51167,51168,51169,51170,51171,51172,51173,51174,51175,51176,51177,51178,51179,51180,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,51195,51196,51197,51198,51199,51200,51201,51202,51203,51204,51205,51206,51207,51208,51209,51210,51211,51212,51213,51214,51215,51216,51217,51218,51219,51220,51221,51222,51223,51224,51225,51226,51227,51228,51229,51230,51231,51232,51233,51234,51235,51236,51237,51238,51239,51240,51241,51242,51243,51244,51245,51246,51247,51248,51249,51250,51251,51252,51253,51254,51255,51256,51257,51258,51259,51260,51261,51262,51263,51264,51265,51266,51267,51268,51269,51270,51271,51272,51273,51274,51275,51276,51277,51278,51279,51280,51281,51282,51283,51284,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51312,51313,51314,51315,51316,51317,51318,51319,51320,51321,51322,51323,51324,51325,51326,51327,51328,51329,51330,51331,51332,51333,51334,51335,51336,51337,51338,51339,51340,51341,51342,51343,51344,51345,51346,51347,51348,51349,51350,51351,51352,51353,51354,51355,51356,51357,51358,51359,51360,51361,51362,51363,51364,51365,51366,51367,51368,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51388,51389,51390,51391,51392,51393,51394,51395,51396,51397,51398,51399,51400,51401,51402,51403,51404,51405,51406,51407,51408,51409,51410,51411,51412,51413,51414,51415,51416,51417,51418,51419,51420,51421,51422,51423,51424,51425,51426,51427,51428,51429,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51445,51446,51447,51448,51449,51450,51451,51452,51453,51454,51455,51456,51457,51458,51459,51460,51461,51462,51463,51464,51465,51466,51467,51468,51469,51470,51471,51472,51473,51474,51475,51476,51477,51478,51479,51480,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,51500,51501,51502,51503,51504,51505,51506,51507,51508,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,51528,51529,51530,51531,51532,51533,51534,51535,51536,51537,51538,51539,51540,51541,51542,51543,51544,51545,51546,51547,51548,51549,51550,51551,51552,51553,51554,51555,51556,51557,51558,51559,51560,51561,51562,51563,51564,51565,51566,51567,51568,51569,51570,51571,51572,51573,51574,51575,51576,51577,51578,51579,51580,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51592,51593,51594,51595,51596,51597,51598,51599,51600,51601,51602,51603,51604,51605,51606,51607,51608,51609,51610,51611,51612,51613,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51648,51649,51650,51651,51652,51653,51654,51655,51656,51657,51658,51659,51660,51661,51662,51663,51664,51665,51666,51667,51668,51669,51670,51671,51672,51673,51674,51675,51676,51677,51678,51679,51680,51681,51682,51683,51684,51685,51686,51687,51688,51689,51690,51691,51692,51693,51694,51695,51696,51697,51698,51699,51700,51701,51702,51703,51704,51705,51706,51707,51708,51709,51710,51711,51712,51713,51714,51715,51716,51717,51718,51719,51720,51721,51722,51723,51724,51725,51726,51727,51728,51729,51730,51731,51732,51733,51734,51735,51736,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,51750,51751,51752,51753,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,51783,51784,51785,51786,51787,51788,51789,51790,51791,51792,51793,51794,51795,51796,51797,51798,51799,51800,51801,51802,51803,51804,51805,51806,51807,51808,51809,51810,51811,51812,51813,51814,51815,51816,51817,51818,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51837,51838,51839,51840,51841,51842,51843,51844,51845,51846,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51864,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51900,51901,51902,51903,51904,51905,51906,51907,51908,51909,51910,51911,51912,51913,51914,51915,51916,51917,51918,51919,51920,51921,51922,51923,51924,51925,51926,51927,51928,51929,51930,51931,51932,51933,51934,51935,51936,51937,51938,51939,51940,51941,51942,51943,51944,51945,51946,51947,51948,51949,51950,51951,51952,51953,51954,51955,51956,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51976,51977,51978,51979,51980,51981,51982,51983,51984,51985,51986,51987,51988,51989,51990,51991,51992,51993,51994,51995,51996,51997,51998,51999,52000,52001,52002,52003,52004,52005,52006,52007,52008,52009,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52033,52034,52035,52036,52037,52038,52039,52040,52041,52042,52043,52044,52045,52046,52047,52048,52049,52050,52051,52052,52053,52054,52055,52056,52057,52058,52059,52060,52061,52062,52063,52064,52065,52066,52067,52068,52069,52070,52071,52072,52073,52074,52075,52076,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52088,52089,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52124,52125,52126,52127,52128,52129,52130,52131,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52152,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52180,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,52192,52193,52194,52195,52196,52197,52198,52199,52200,52201,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52236,52237,52238,52239,52240,52241,52242,52243,52244,52245,52246,52247,52248,52249,52250,52251,52252,52253,52254,52255,52256,52257,52258,52259,52260,52261,52262,52263,52264,52265,52266,52267,52268,52269,52270,52271,52272,52273,52274,52275,52276,52277,52278,52279,52280,52281,52282,52283,52284,52285,52286,52287,52288,52289,52290,52291,52292,52293,52294,52295,52296,52297,52298,52299,52300,52301,52302,52303,52304,52305,52306,52307,52308,52309,52310,52311,52312,52313,52314,52315,52316,52317,52318,52319,52320,52321,52322,52323,52324,52325,52326,52327,52328,52329,52330,52331,52332,52333,52334,52335,52336,52337,52338,52339,52340,52341,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,52372,52373,52374,52375,52376,52377,52378,52379,52380,52381,52382,52383,52384,52385,52386,52387,52388,52389,52390,52391,52392,52393,52394,52395,52396,52397,52398,52399,52400,52401,52402,52403,52404,52405,52406,52407,52408,52409,52410,52411,52412,52413,52414,52415,52416,52417,52418,52419,52420,52421,52422,52423,52424,52425,52426,52427,52428,52429,52430,52431,52432,52433,52434,52435,52436,52437,52438,52439,52440,52441,52442,52443,52444,52445,52446,52447,52448,52449,52450,52451,52452,52453,52454,52455,52456,52457,52458,52459,52460,52461,52462,52463,52464,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,52478,52479,52480,52481,52482,52483,52484,52485,52486,52487,52488,52489,52490,52491,52492,52493,52494,52495,52496,52497,52498,52499,52500,52501,52502,52503,52504,52505,52506,52507,52508,52509,52510,52511,52512,52513,52514,52515,52516,52517,52518,52519,52520,52521,52522,52523,52524,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52537,52538,52539,52540,52541,52542,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52572,52573,52574,52575,52576,52577,52578,52579,52580,52581,52582,52583,52584,52585,52586,52587,52588,52589,52590,52591,52592,52593,52594,52595,52596,52597,52598,52599,52600,52601,52602,52603,52604,52605,52606,52607,52608,52609,52610,52611,52612,52613,52614,52615,52616,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52628,52629,52630,52631,52632,52633,52634,52635,52636,52637,52638,52639,52640,52641,52642,52643,52644,52645,52646,52647,52648,52649,52650,52651,52652,52653,52654,52655,52656,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52676,52677,52678,52679,52680,52681,52682,52683,52684,52685,52686,52687,52688,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,52706,52707,52708,52709,52710,52711,52712,52713,52714,52715,52716,52717,52718,52719,52720,52721,52722,52723,52724,52725,52726,52727,52728,52729,52730,52731,52732,52733,52734,52735,52736,52737,52738,52739,52740,52741,52742,52743,52744,52745,52746,52747,52748,52749,52750,52751,52752,52753,52754,52755,52756,52757,52758,52759,52760,52761,52762,52763,52764,52765,52766,52767,52768,52769,52770,52771,52772,52773,52774,52775,52776,52777,52778,52779,52780,52781,52782,52783,52784,52785,52786,52787,52788,52789,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52824,52825,52826,52827,52828,52829,52830,52831,52832,52833,52834,52835,52836,52837,52838,52839,52840,52841,52842,52843,52844,52845,52846,52847,52848,52849,52850,52851,52852,52853,52854,52855,52856,52857,52858,52859,52860,52861,52862,52863,52864,52865,52866,52867,52868,52869,52870,52871,52872,52873,52874,52875,52876,52877,52878,52879,52880,52881,52882,52883,52884,52885,52886,52887,52888,52889,52890,52891,52892,52893,52894,52895,52896,52897,52898,52899,52900,52901,52902,52903,52904,52905,52906,52907,52908,52909,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,52923,52924,52925,52926,52927,52928,52929,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52964,52965,52966,52967,52968,52969,52970,52971,52972,52973,52974,52975,52976,52977,52978,52979,52980,52981,52982,52983,52984,52985,52986,52987,52988,52989,52990,52991,52992,52993,52994,52995,52996,52997,52998,52999,53000,53001,53002,53003,53004,53005,53006,53007,53008,53009,53010,53011,53012,53013,53014,53015,53016,53017,53018,53019,53020,53021,53022,53023,53024,53025,53026,53027,53028,53029,53030,53031,53032,53033,53034,53035,53036,53037,53038,53039,53040,53041,53042,53043,53044,53045,53046,53047,53048,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53076,53077,53078,53079,53080,53081,53082,53083,53084,53085,53086,53087,53088,53089,53090,53091,53092,53093,53094,53095,53096,53097,53098,53099,53100,53101,53102,53103,53104,53105,53106,53107,53108,53109,53110,53111,53112,53113,53114,53115,53116,53117,53118,53119,53120,53121,53122,53123,53124,53125,53126,53127,53128,53129,53130,53131,53132,53133,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53153,53154,53155,53156,53157,53158,53159,53160,53161,53162,53163,53164,53165,53166,53167,53168,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53188,53189,53190,53191,53192,53193,53194,53195,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53216,53217,53218,53219,53220,53221,53222,53223,53224,53225,53226,53227,53228,53229,53230,53231,53232,53233,53234,53235,53236,53237,53238,53239,53240,53241,53242,53243,53244,53245,53246,53247,53248,53249,53250,53251,53252,53253,53254,53255,53256,53257,53258,53259,53260,53261,53262,53263,53264,53265,53266,53267,53268,53269,53270,53271,53272,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,53293,53294,53295,53296,53297,53298,53299,53300,53301,53302,53303,53304,53305,53306,53307,53308,53309,53310,53311,53312,53313,53314,53315,53316,53317,53318,53319,53320,53321,53322,53323,53324,53325,53326,53327,53328,53329,53330,53331,53332,53333,53334,53335,53336,53337,53338,53339,53340,53341,53342,53343,53344,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53356,53357,53358,53359,53360,53361,53362,53363,53364,53365,53366,53367,53368,53369,53370,53371,53372,53373,53374,53375,53376,53377,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53412,53413,53414,53415,53416,53417,53418,53419,53420,53421,53422,53423,53424,53425,53426,53427,53428,53429,53430,53431,53432,53433,53434,53435,53436,53437,53438,53439,53440,53441,53442,53443,53444,53445,53446,53447,53448,53449,53450,53451,53452,53453,53454,53455,53456,53457,53458,53459,53460,53461,53462,53463,53464,53465,53466,53467,53468,53469,53470,53471,53472,53473,53474,53475,53476,53477,53478,53479,53480,53481,53482,53483,53484,53485,53486,53487,53488,53489,53490,53491,53492,53493,53494,53495,53496,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,53509,53510,53511,53512,53513,53514,53515,53516,53517,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53552,53553,53554,53555,53556,53557,53558,53559,53560,53561,53562,53563,53564,53565,53566,53567,53568,53569,53570,53571,53572,53573,53574,53575,53576,53577,53578,53579,53580,53581,53582,53583,53584,53585,53586,53587,53588,53589,53590,53591,53592,53593,53594,53595,53596,53597,53598,53599,53600,53601,53602,53603,53604,53605,53606,53607,53608,53609,53610,53611,53612,53613,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53628,53629,53630,53631,53632,53633,53634,53635,53636,53637,53638,53639,53640,53641,53642,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53664,53665,53666,53667,53668,53669,53670,53671,53672,53673,53674,53675,53676,53677,53678,53679,53680,53681,53682,53683,53684,53685,53686,53687,53688,53689,53690,53691,53692,53693,53694,53695,53696,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,53712,53713,53714,53715,53716,53717,53718,53719,53720,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,53739,53740,53741,53742,53743,53744,53745,53746,53747,53748,53749,53750,53751,53752,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,53767,53768,53769,53770,53771,53772,53773,53774,53775,53776,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,53802,53803,53804,53805,53806,53807,53808,53809,53810,53811,53812,53813,53814,53815,53816,53817,53818,53819,53820,53821,53822,53823,53824,53825,53826,53827,53828,53829,53830,53831,53832,53833,53834,53835,53836,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53852,53853,53854,53855,53856,53857,53858,53859,53860,53861,53862,53863,53864,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53888,53889,53890,53891,53892,53893,53894,53895,53896,53897,53898,53899,53900,53901,53902,53903,53904,53905,53906,53907,53908,53909,53910,53911,53912,53913,53914,53915,53916,53917,53918,53919,53920,53921,53922,53923,53924,53925,53926,53927,53928,53929,53930,53931,53932,53933,53934,53935,53936,53937,53938,53939,53940,53941,53942,53943,53944,53945,53946,53947,53948,53949,53950,53951,53952,53953,53954,53955,53956,53957,53958,53959,53960,53961,53962,53963,53964,53965,53966,53967,53968,53969,53970,53971,53972,53973,53974,53975,53976,53977,53978,53979,53980,53981,53982,53983,53984,53985,53986,53987,53988,53989,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54000,54001,54002,54003,54004,54005,54006,54007,54008,54009,54010,54011,54012,54013,54014,54015,54016,54017,54018,54019,54020,54021,54022,54023,54024,54025,54026,54027,54028,54029,54030,54031,54032,54033,54034,54035,54036,54037,54038,54039,54040,54041,54042,54043,54044,54045,54046,54047,54048,54049,54050,54051,54052,54053,54054,54055,54056,54057,54058,54059,54060,54061,54062,54063,54064,54065,54066,54067,54068,54069,54070,54071,54072,54073,54074,54075,54076,54077,54078,54079,54080,54081,54082,54083,54084,54085,54086,54087,54088,54089,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54140,54141,54142,54143,54144,54145,54146,54147,54148,54149,54150,54151,54152,54153,54154,54155,54156,54157,54158,54159,54160,54161,54162,54163,54164,54165,54166,54167,54168,54169,54170,54171,54172,54173,54174,54175,54176,54177,54178,54179,54180,54181,54182,54183,54184,54185,54186,54187,54188,54189,54190,54191,54192,54193,54194,54195,54196,54197,54198,54199,54200,54201,54202,54203,54204,54205,54206,54207,54208,54209,54210,54211,54212,54213,54214,54215,54216,54217,54218,54219,54220,54221,54222,54223,54224,54225,54226,54227,54228,54229,54230,54231,54232,54233,54234,54235,54236,54237,54238,54239,54240,54241,54242,54243,54244,54245,54246,54247,54248,54249,54250,54251,54252,54253,54254,54255,54256,54257,54258,54259,54260,54261,54262,54263,54264,54265,54266,54267,54268,54269,54270,54271,54272,54273,54274,54275,54276,54277,54278,54279,54280,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,54295,54296,54297,54298,54299,54300,54301,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,54328,54329,54330,54331,54332,54333,54334,54335,54336,54337,54338,54339,54340,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,54356,54357,54358,54359,54360,54361,54362,54363,54364,54365,54366,54367,54368,54369,54370,54371,54372,54373,54374,54375,54376,54377,54378,54379,54380,54381,54382,54383,54384,54385,54386,54387,54388,54389,54390,54391,54392,54393,54394,54395,54396,54397,54398,54399,54400,54401,54402,54403,54404,54405,54406,54407,54408,54409,54410,54411,54412,54413,54414,54415,54416,54417,54418,54419,54420,54421,54422,54423,54424,54425,54426,54427,54428,54429,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54441,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54476,54477,54478,54479,54480,54481,54482,54483,54484,54485,54486,54487,54488,54489,54490,54491,54492,54493,54494,54495,54496,54497,54498,54499,54500,54501,54502,54503,54504,54505,54506,54507,54508,54509,54510,54511,54512,54513,54514,54515,54516,54517,54518,54519,54520,54521,54522,54523,54524,54525,54526,54527,54528,54529,54530,54531,54532,54533,54534,54535,54536,54537,54538,54539,54540,54541,54542,54543,54544,54545,54546,54547,54548,54549,54550,54551,54552,54553,54554,54555,54556,54557,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,54584,54585,54586,54587,54588,54589,54590,54591,54592,54593,54594,54595,54596,54597,54598,54599,54600,54601,54602,54603,54604,54605,54606,54607,54608,54609,54610,54611,54612,54613,54614,54615,54616,54617,54618,54619,54620,54621,54622,54623,54624,54625,54626,54627,54628,54629,54630,54631,54632,54633,54634,54635,54636,54637,54638,54639,54640,54641,54642,54643,54644,54645,54646,54647,54648,54649,54650,54651,54652,54653,54654,54655,54656,54657,54658,54659,54660,54661,54662,54663,54664,54665,54666,54667,54668,54669,54670,54671,54672,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54693,54694,54695,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,54728,54729,54730,54731,54732,54733,54734,54735,54736,54737,54738,54739,54740,54741,54742,54743,54744,54745,54746,54747,54748,54749,54750,54751,54752,54753,54754,54755,54756,54757,54758,54759,54760,54761,54762,54763,54764,54765,54766,54767,54768,54769,54770,54771,54772,54773,54774,54775,54776,54777,54778,54779,54780,54781,54782,54783,54784,54785,54786,54787,54788,54789,54790,54791,54792,54793,54794,54795,54796,54797,54798,54799,54800,54801,54802,54803,54804,54805,54806,54807,54808,54809,54810,54811,54812,54813,54814,54815,54816,54817,54818,54819,54820,54821,54822,54823,54824,54825,54826,54827,54828,54829,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54840,54841,54842,54843,54844,54845,54846,54847,54848,54849,54850,54851,54852,54853,54854,54855,54856,54857,54858,54859,54860,54861,54862,54863,54864,54865,54866,54867,54868,54869,54870,54871,54872,54873,54874,54875,54876,54877,54878,54879,54880,54881,54882,54883,54884,54885,54886,54887,54888,54889,54890,54891,54892,54893,54894,54895,54896,54897,54898,54899,54900,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,54913,54914,54915,54916,54917,54918,54919,54920,54921,54922,54923,54924,54925,54926,54927,54928,54929,54930,54931,54932,54933,54934,54935,54936,54937,54938,54939,54940,54941,54942,54943,54944,54945,54946,54947,54948,54949,54950,54951,54952,54953,54954,54955,54956,54957,54958,54959,54960,54961,54962,54963,54964,54965,54966,54967,54968,54969,54970,54971,54972,54973,54974,54975,54976,54977,54978,54979,54980,54981,54982,54983,54984,54985,54986,54987,54988,54989,54990,54991,54992,54993,54994,54995,54996,54997,54998,54999,55000,55001,55002,55003,55004,55005,55006,55007,55008,55009,55010,55011,55012,55013,55014,55015,55016,55017,55018,55019,55020,55021,55022,55023,55024,55025,55026,55027,55028,55029,55030,55031,55032,55033,55034,55035,55036,55037,55038,55039,55040,55041,55042,55043,55044,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55057,55058,55059,55060,55061,55062,55063,55064,55065,55066,55067,55068,55069,55070,55071,55072,55073,55074,55075,55076,55077,55078,55079,55080,55081,55082,55083,55084,55085,55086,55087,55088,55089,55090,55091,55092,55093,55094,55095,55096,55097,55098,55099,55100,55101,55102,55103,55104,55105,55106,55107,55108,55109,55110,55111,55112,55113,55114,55115,55116,55117,55118,55119,55120,55121,55122,55123,55124,55125,55126,55127,55128,55129,55130,55131,55132,55133,55134,55135,55136,55137,55138,55139,55140,55141,55142,55143,55144,55145,55146,55147,55148,55149,55150,55151,55152,55153,55154,55155,55156,55157,55158,55159,55160,55161,55162,55163,55164,55165,55166,55167,55168,55169,55170,55171,55172,55173,55174,55175,55176,55177,55178,55179,55180,55181,55182,55183,55184,55185,55186,55187,55188,55189,55190,55191,55192,55193,55194,55195,55196,55197,55198,55199,55200,55201,55202,55203,55216,55217,55218,55219,55220,55221,55222,55223,55224,55225,55226,55227,55228,55229,55230,55231,55232,55233,55234,55235,55236,55237,55238,55243,55244,55245,55246,55247,55248,55249,55250,55251,55252,55253,55254,55255,55256,55257,55258,55259,55260,55261,55262,55263,55264,55265,55266,55267,55268,55269,55270,55271,55272,55273,55274,55275,55276,55277,55278,55279,55280,55281,55282,55283,55284,55285,55286,55287,55288,55289,55290,55291,63744,63745,63746,63747,63748,63749,63750,63751,63752,63753,63754,63755,63756,63757,63758,63759,63760,63761,63762,63763,63764,63765,63766,63767,63768,63769,63770,63771,63772,63773,63774,63775,63776,63777,63778,63779,63780,63781,63782,63783,63784,63785,63786,63787,63788,63789,63790,63791,63792,63793,63794,63795,63796,63797,63798,63799,63800,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,63812,63813,63814,63815,63816,63817,63818,63819,63820,63821,63822,63823,63824,63825,63826,63827,63828,63829,63830,63831,63832,63833,63834,63835,63836,63837,63838,63839,63840,63841,63842,63843,63844,63845,63846,63847,63848,63849,63850,63851,63852,63853,63854,63855,63856,63857,63858,63859,63860,63861,63862,63863,63864,63865,63866,63867,63868,63869,63870,63871,63872,63873,63874,63875,63876,63877,63878,63879,63880,63881,63882,63883,63884,63885,63886,63887,63888,63889,63890,63891,63892,63893,63894,63895,63896,63897,63898,63899,63900,63901,63902,63903,63904,63905,63906,63907,63908,63909,63910,63911,63912,63913,63914,63915,63916,63917,63918,63919,63920,63921,63922,63923,63924,63925,63926,63927,63928,63929,63930,63931,63932,63933,63934,63935,63936,63937,63938,63939,63940,63941,63942,63943,63944,63945,63946,63947,63948,63949,63950,63951,63952,63953,63954,63955,63956,63957,63958,63959,63960,63961,63962,63963,63964,63965,63966,63967,63968,63969,63970,63971,63972,63973,63974,63975,63976,63977,63978,63979,63980,63981,63982,63983,63984,63985,63986,63987,63988,63989,63990,63991,63992,63993,63994,63995,63996,63997,63998,63999,64000,64001,64002,64003,64004,64005,64006,64007,64008,64009,64010,64011,64012,64013,64014,64015,64016,64017,64018,64019,64020,64021,64022,64023,64024,64025,64026,64027,64028,64029,64030,64031,64032,64033,64034,64035,64036,64037,64038,64039,64040,64041,64042,64043,64044,64045,64046,64047,64048,64049,64050,64051,64052,64053,64054,64055,64056,64057,64058,64059,64060,64061,64062,64063,64064,64065,64066,64067,64068,64069,64070,64071,64072,64073,64074,64075,64076,64077,64078,64079,64080,64081,64082,64083,64084,64085,64086,64087,64088,64089,64090,64091,64092,64093,64094,64095,64096,64097,64098,64099,64100,64101,64102,64103,64104,64105,64106,64107,64108,64109,64112,64113,64114,64115,64116,64117,64118,64119,64120,64121,64122,64123,64124,64125,64126,64127,64128,64129,64130,64131,64132,64133,64134,64135,64136,64137,64138,64139,64140,64141,64142,64143,64144,64145,64146,64147,64148,64149,64150,64151,64152,64153,64154,64155,64156,64157,64158,64159,64160,64161,64162,64163,64164,64165,64166,64167,64168,64169,64170,64171,64172,64173,64174,64175,64176,64177,64178,64179,64180,64181,64182,64183,64184,64185,64186,64187,64188,64189,64190,64191,64192,64193,64194,64195,64196,64197,64198,64199,64200,64201,64202,64203,64204,64205,64206,64207,64208,64209,64210,64211,64212,64213,64214,64215,64216,64217,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,64285,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64606,64607,64608,64609,64610,64611,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65018,65019,65136,65137,65138,65139,65140,65142,65143,65144,65145,65146,65147,65148,65149,65150,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65382,65383,65384,65385,65386,65387,65388,65389,65390,65391,65392,65393,65394,65395,65396,65397,65398,65399,65400,65401,65402,65403,65404,65405,65406,65407,65408,65409,65410,65411,65412,65413,65414,65415,65416,65417,65418,65419,65420,65421,65422,65423,65424,65425,65426,65427,65428,65429,65430,65431,65432,65433,65434,65435,65436,65437,65438,65439,65440,65441,65442,65443,65444,65445,65446,65447,65448,65449,65450,65451,65452,65453,65454,65455,65456,65457,65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65470,65474,65475,65476,65477,65478,65479,65482,65483,65484,65485,65486,65487,65490,65491,65492,65493,65494,65495,65498,65499,65500';
40 var arr = str.split(',').map(function(code) {
41   return parseInt(code, 10);
42 });
43 module.exports = arr;
44 },{}],5:[function(require,module,exports){
45 // http://wiki.commonjs.org/wiki/Unit_Testing/1.0
47 // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
49 // Originally from narwhal.js (http://narwhaljs.org)
50 // Copyright (c) 2009 Thomas Robinson <280north.com>
52 // Permission is hereby granted, free of charge, to any person obtaining a copy
53 // of this software and associated documentation files (the 'Software'), to
54 // deal in the Software without restriction, including without limitation the
55 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
56 // sell copies of the Software, and to permit persons to whom the Software is
57 // furnished to do so, subject to the following conditions:
59 // The above copyright notice and this permission notice shall be included in
60 // all copies or substantial portions of the Software.
62 // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
63 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
64 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
65 // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
66 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
67 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
69 // when used in node, this will actually load the util module we depend on
70 // versus loading the builtin util module as happens otherwise
71 // this is a bug in node module loading as far as I am concerned
72 var util = require('util/');
74 var pSlice = Array.prototype.slice;
75 var hasOwn = Object.prototype.hasOwnProperty;
77 // 1. The assert module provides functions that throw
78 // AssertionError's when particular conditions are not met. The
79 // assert module must conform to the following interface.
81 var assert = module.exports = ok;
83 // 2. The AssertionError is defined in assert.
84 // new assert.AssertionError({ message: message,
85 //                             actual: actual,
86 //                             expected: expected })
88 assert.AssertionError = function AssertionError(options) {
89   this.name = 'AssertionError';
90   this.actual = options.actual;
91   this.expected = options.expected;
92   this.operator = options.operator;
93   if (options.message) {
94     this.message = options.message;
95     this.generatedMessage = false;
96   } else {
97     this.message = getMessage(this);
98     this.generatedMessage = true;
99   }
100   var stackStartFunction = options.stackStartFunction || fail;
102   if (Error.captureStackTrace) {
103     Error.captureStackTrace(this, stackStartFunction);
104   }
105   else {
106     // non v8 browsers so we can have a stacktrace
107     var err = new Error();
108     if (err.stack) {
109       var out = err.stack;
111       // try to strip useless frames
112       var fn_name = stackStartFunction.name;
113       var idx = out.indexOf('\n' + fn_name);
114       if (idx >= 0) {
115         // once we have located the function frame
116         // we need to strip out everything before it (and its line)
117         var next_line = out.indexOf('\n', idx + 1);
118         out = out.substring(next_line + 1);
119       }
121       this.stack = out;
122     }
123   }
126 // assert.AssertionError instanceof Error
127 util.inherits(assert.AssertionError, Error);
129 function replacer(key, value) {
130   if (util.isUndefined(value)) {
131     return '' + value;
132   }
133   if (util.isNumber(value) && !isFinite(value)) {
134     return value.toString();
135   }
136   if (util.isFunction(value) || util.isRegExp(value)) {
137     return value.toString();
138   }
139   return value;
142 function truncate(s, n) {
143   if (util.isString(s)) {
144     return s.length < n ? s : s.slice(0, n);
145   } else {
146     return s;
147   }
150 function getMessage(self) {
151   return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +
152          self.operator + ' ' +
153          truncate(JSON.stringify(self.expected, replacer), 128);
156 // At present only the three keys mentioned above are used and
157 // understood by the spec. Implementations or sub modules can pass
158 // other keys to the AssertionError's constructor - they will be
159 // ignored.
161 // 3. All of the following functions must throw an AssertionError
162 // when a corresponding condition is not met, with a message that
163 // may be undefined if not provided.  All assertion methods provide
164 // both the actual and expected values to the assertion error for
165 // display purposes.
167 function fail(actual, expected, message, operator, stackStartFunction) {
168   throw new assert.AssertionError({
169     message: message,
170     actual: actual,
171     expected: expected,
172     operator: operator,
173     stackStartFunction: stackStartFunction
174   });
177 // EXTENSION! allows for well behaved errors defined elsewhere.
178 assert.fail = fail;
180 // 4. Pure assertion tests whether a value is truthy, as determined
181 // by !!guard.
182 // assert.ok(guard, message_opt);
183 // This statement is equivalent to assert.equal(true, !!guard,
184 // message_opt);. To test strictly for the value true, use
185 // assert.strictEqual(true, guard, message_opt);.
187 function ok(value, message) {
188   if (!value) fail(value, true, message, '==', assert.ok);
190 assert.ok = ok;
192 // 5. The equality assertion tests shallow, coercive equality with
193 // ==.
194 // assert.equal(actual, expected, message_opt);
196 assert.equal = function equal(actual, expected, message) {
197   if (actual != expected) fail(actual, expected, message, '==', assert.equal);
200 // 6. The non-equality assertion tests for whether two objects are not equal
201 // with != assert.notEqual(actual, expected, message_opt);
203 assert.notEqual = function notEqual(actual, expected, message) {
204   if (actual == expected) {
205     fail(actual, expected, message, '!=', assert.notEqual);
206   }
209 // 7. The equivalence assertion tests a deep equality relation.
210 // assert.deepEqual(actual, expected, message_opt);
212 assert.deepEqual = function deepEqual(actual, expected, message) {
213   if (!_deepEqual(actual, expected)) {
214     fail(actual, expected, message, 'deepEqual', assert.deepEqual);
215   }
218 function _deepEqual(actual, expected) {
219   // 7.1. All identical values are equivalent, as determined by ===.
220   if (actual === expected) {
221     return true;
223   } else if (util.isBuffer(actual) && util.isBuffer(expected)) {
224     if (actual.length != expected.length) return false;
226     for (var i = 0; i < actual.length; i++) {
227       if (actual[i] !== expected[i]) return false;
228     }
230     return true;
232   // 7.2. If the expected value is a Date object, the actual value is
233   // equivalent if it is also a Date object that refers to the same time.
234   } else if (util.isDate(actual) && util.isDate(expected)) {
235     return actual.getTime() === expected.getTime();
237   // 7.3 If the expected value is a RegExp object, the actual value is
238   // equivalent if it is also a RegExp object with the same source and
239   // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
240   } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
241     return actual.source === expected.source &&
242            actual.global === expected.global &&
243            actual.multiline === expected.multiline &&
244            actual.lastIndex === expected.lastIndex &&
245            actual.ignoreCase === expected.ignoreCase;
247   // 7.4. Other pairs that do not both pass typeof value == 'object',
248   // equivalence is determined by ==.
249   } else if (!util.isObject(actual) && !util.isObject(expected)) {
250     return actual == expected;
252   // 7.5 For all other Object pairs, including Array objects, equivalence is
253   // determined by having the same number of owned properties (as verified
254   // with Object.prototype.hasOwnProperty.call), the same set of keys
255   // (although not necessarily the same order), equivalent values for every
256   // corresponding key, and an identical 'prototype' property. Note: this
257   // accounts for both named and indexed properties on Arrays.
258   } else {
259     return objEquiv(actual, expected);
260   }
263 function isArguments(object) {
264   return Object.prototype.toString.call(object) == '[object Arguments]';
267 function objEquiv(a, b) {
268   if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))
269     return false;
270   // an identical 'prototype' property.
271   if (a.prototype !== b.prototype) return false;
272   // if one is a primitive, the other must be same
273   if (util.isPrimitive(a) || util.isPrimitive(b)) {
274     return a === b;
275   }
276   var aIsArgs = isArguments(a),
277       bIsArgs = isArguments(b);
278   if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
279     return false;
280   if (aIsArgs) {
281     a = pSlice.call(a);
282     b = pSlice.call(b);
283     return _deepEqual(a, b);
284   }
285   var ka = objectKeys(a),
286       kb = objectKeys(b),
287       key, i;
288   // having the same number of owned properties (keys incorporates
289   // hasOwnProperty)
290   if (ka.length != kb.length)
291     return false;
292   //the same set of keys (although not necessarily the same order),
293   ka.sort();
294   kb.sort();
295   //~~~cheap key test
296   for (i = ka.length - 1; i >= 0; i--) {
297     if (ka[i] != kb[i])
298       return false;
299   }
300   //equivalent values for every corresponding key, and
301   //~~~possibly expensive deep test
302   for (i = ka.length - 1; i >= 0; i--) {
303     key = ka[i];
304     if (!_deepEqual(a[key], b[key])) return false;
305   }
306   return true;
309 // 8. The non-equivalence assertion tests for any deep inequality.
310 // assert.notDeepEqual(actual, expected, message_opt);
312 assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
313   if (_deepEqual(actual, expected)) {
314     fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
315   }
318 // 9. The strict equality assertion tests strict equality, as determined by ===.
319 // assert.strictEqual(actual, expected, message_opt);
321 assert.strictEqual = function strictEqual(actual, expected, message) {
322   if (actual !== expected) {
323     fail(actual, expected, message, '===', assert.strictEqual);
324   }
327 // 10. The strict non-equality assertion tests for strict inequality, as
328 // determined by !==.  assert.notStrictEqual(actual, expected, message_opt);
330 assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
331   if (actual === expected) {
332     fail(actual, expected, message, '!==', assert.notStrictEqual);
333   }
336 function expectedException(actual, expected) {
337   if (!actual || !expected) {
338     return false;
339   }
341   if (Object.prototype.toString.call(expected) == '[object RegExp]') {
342     return expected.test(actual);
343   } else if (actual instanceof expected) {
344     return true;
345   } else if (expected.call({}, actual) === true) {
346     return true;
347   }
349   return false;
352 function _throws(shouldThrow, block, expected, message) {
353   var actual;
355   if (util.isString(expected)) {
356     message = expected;
357     expected = null;
358   }
360   try {
361     block();
362   } catch (e) {
363     actual = e;
364   }
366   message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
367             (message ? ' ' + message : '.');
369   if (shouldThrow && !actual) {
370     fail(actual, expected, 'Missing expected exception' + message);
371   }
373   if (!shouldThrow && expectedException(actual, expected)) {
374     fail(actual, expected, 'Got unwanted exception' + message);
375   }
377   if ((shouldThrow && actual && expected &&
378       !expectedException(actual, expected)) || (!shouldThrow && actual)) {
379     throw actual;
380   }
383 // 11. Expected to throw an error:
384 // assert.throws(block, Error_opt, message_opt);
386 assert.throws = function(block, /*optional*/error, /*optional*/message) {
387   _throws.apply(this, [true].concat(pSlice.call(arguments)));
390 // EXTENSION! This is annoying to write outside this module.
391 assert.doesNotThrow = function(block, /*optional*/message) {
392   _throws.apply(this, [false].concat(pSlice.call(arguments)));
395 assert.ifError = function(err) { if (err) {throw err;}};
397 var objectKeys = Object.keys || function (obj) {
398   var keys = [];
399   for (var key in obj) {
400     if (hasOwn.call(obj, key)) keys.push(key);
401   }
402   return keys;
405 },{"util/":10}],6:[function(require,module,exports){
406 // Copyright Joyent, Inc. and other Node contributors.
408 // Permission is hereby granted, free of charge, to any person obtaining a
409 // copy of this software and associated documentation files (the
410 // "Software"), to deal in the Software without restriction, including
411 // without limitation the rights to use, copy, modify, merge, publish,
412 // distribute, sublicense, and/or sell copies of the Software, and to permit
413 // persons to whom the Software is furnished to do so, subject to the
414 // following conditions:
416 // The above copyright notice and this permission notice shall be included
417 // in all copies or substantial portions of the Software.
419 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
420 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
421 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
422 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
423 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
424 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
425 // USE OR OTHER DEALINGS IN THE SOFTWARE.
427 function EventEmitter() {
428   this._events = this._events || {};
429   this._maxListeners = this._maxListeners || undefined;
431 module.exports = EventEmitter;
433 // Backwards-compat with node 0.10.x
434 EventEmitter.EventEmitter = EventEmitter;
436 EventEmitter.prototype._events = undefined;
437 EventEmitter.prototype._maxListeners = undefined;
439 // By default EventEmitters will print a warning if more than 10 listeners are
440 // added to it. This is a useful default which helps finding memory leaks.
441 EventEmitter.defaultMaxListeners = 10;
443 // Obviously not all Emitters should be limited to 10. This function allows
444 // that to be increased. Set to zero for unlimited.
445 EventEmitter.prototype.setMaxListeners = function(n) {
446   if (!isNumber(n) || n < 0 || isNaN(n))
447     throw TypeError('n must be a positive number');
448   this._maxListeners = n;
449   return this;
452 EventEmitter.prototype.emit = function(type) {
453   var er, handler, len, args, i, listeners;
455   if (!this._events)
456     this._events = {};
458   // If there is no 'error' event listener then throw.
459   if (type === 'error') {
460     if (!this._events.error ||
461         (isObject(this._events.error) && !this._events.error.length)) {
462       er = arguments[1];
463       if (er instanceof Error) {
464         throw er; // Unhandled 'error' event
465       }
466       throw TypeError('Uncaught, unspecified "error" event.');
467     }
468   }
470   handler = this._events[type];
472   if (isUndefined(handler))
473     return false;
475   if (isFunction(handler)) {
476     switch (arguments.length) {
477       // fast cases
478       case 1:
479         handler.call(this);
480         break;
481       case 2:
482         handler.call(this, arguments[1]);
483         break;
484       case 3:
485         handler.call(this, arguments[1], arguments[2]);
486         break;
487       // slower
488       default:
489         len = arguments.length;
490         args = new Array(len - 1);
491         for (i = 1; i < len; i++)
492           args[i - 1] = arguments[i];
493         handler.apply(this, args);
494     }
495   } else if (isObject(handler)) {
496     len = arguments.length;
497     args = new Array(len - 1);
498     for (i = 1; i < len; i++)
499       args[i - 1] = arguments[i];
501     listeners = handler.slice();
502     len = listeners.length;
503     for (i = 0; i < len; i++)
504       listeners[i].apply(this, args);
505   }
507   return true;
510 EventEmitter.prototype.addListener = function(type, listener) {
511   var m;
513   if (!isFunction(listener))
514     throw TypeError('listener must be a function');
516   if (!this._events)
517     this._events = {};
519   // To avoid recursion in the case that type === "newListener"! Before
520   // adding it to the listeners, first emit "newListener".
521   if (this._events.newListener)
522     this.emit('newListener', type,
523               isFunction(listener.listener) ?
524               listener.listener : listener);
526   if (!this._events[type])
527     // Optimize the case of one listener. Don't need the extra array object.
528     this._events[type] = listener;
529   else if (isObject(this._events[type]))
530     // If we've already got an array, just append.
531     this._events[type].push(listener);
532   else
533     // Adding the second element, need to change to array.
534     this._events[type] = [this._events[type], listener];
536   // Check for listener leak
537   if (isObject(this._events[type]) && !this._events[type].warned) {
538     var m;
539     if (!isUndefined(this._maxListeners)) {
540       m = this._maxListeners;
541     } else {
542       m = EventEmitter.defaultMaxListeners;
543     }
545     if (m && m > 0 && this._events[type].length > m) {
546       this._events[type].warned = true;
547       console.error('(node) warning: possible EventEmitter memory ' +
548                     'leak detected. %d listeners added. ' +
549                     'Use emitter.setMaxListeners() to increase limit.',
550                     this._events[type].length);
551       if (typeof console.trace === 'function') {
552         // not supported in IE 10
553         console.trace();
554       }
555     }
556   }
558   return this;
561 EventEmitter.prototype.on = EventEmitter.prototype.addListener;
563 EventEmitter.prototype.once = function(type, listener) {
564   if (!isFunction(listener))
565     throw TypeError('listener must be a function');
567   var fired = false;
569   function g() {
570     this.removeListener(type, g);
572     if (!fired) {
573       fired = true;
574       listener.apply(this, arguments);
575     }
576   }
578   g.listener = listener;
579   this.on(type, g);
581   return this;
584 // emits a 'removeListener' event iff the listener was removed
585 EventEmitter.prototype.removeListener = function(type, listener) {
586   var list, position, length, i;
588   if (!isFunction(listener))
589     throw TypeError('listener must be a function');
591   if (!this._events || !this._events[type])
592     return this;
594   list = this._events[type];
595   length = list.length;
596   position = -1;
598   if (list === listener ||
599       (isFunction(list.listener) && list.listener === listener)) {
600     delete this._events[type];
601     if (this._events.removeListener)
602       this.emit('removeListener', type, listener);
604   } else if (isObject(list)) {
605     for (i = length; i-- > 0;) {
606       if (list[i] === listener ||
607           (list[i].listener && list[i].listener === listener)) {
608         position = i;
609         break;
610       }
611     }
613     if (position < 0)
614       return this;
616     if (list.length === 1) {
617       list.length = 0;
618       delete this._events[type];
619     } else {
620       list.splice(position, 1);
621     }
623     if (this._events.removeListener)
624       this.emit('removeListener', type, listener);
625   }
627   return this;
630 EventEmitter.prototype.removeAllListeners = function(type) {
631   var key, listeners;
633   if (!this._events)
634     return this;
636   // not listening for removeListener, no need to emit
637   if (!this._events.removeListener) {
638     if (arguments.length === 0)
639       this._events = {};
640     else if (this._events[type])
641       delete this._events[type];
642     return this;
643   }
645   // emit removeListener for all listeners on all events
646   if (arguments.length === 0) {
647     for (key in this._events) {
648       if (key === 'removeListener') continue;
649       this.removeAllListeners(key);
650     }
651     this.removeAllListeners('removeListener');
652     this._events = {};
653     return this;
654   }
656   listeners = this._events[type];
658   if (isFunction(listeners)) {
659     this.removeListener(type, listeners);
660   } else {
661     // LIFO order
662     while (listeners.length)
663       this.removeListener(type, listeners[listeners.length - 1]);
664   }
665   delete this._events[type];
667   return this;
670 EventEmitter.prototype.listeners = function(type) {
671   var ret;
672   if (!this._events || !this._events[type])
673     ret = [];
674   else if (isFunction(this._events[type]))
675     ret = [this._events[type]];
676   else
677     ret = this._events[type].slice();
678   return ret;
681 EventEmitter.listenerCount = function(emitter, type) {
682   var ret;
683   if (!emitter._events || !emitter._events[type])
684     ret = 0;
685   else if (isFunction(emitter._events[type]))
686     ret = 1;
687   else
688     ret = emitter._events[type].length;
689   return ret;
692 function isFunction(arg) {
693   return typeof arg === 'function';
696 function isNumber(arg) {
697   return typeof arg === 'number';
700 function isObject(arg) {
701   return typeof arg === 'object' && arg !== null;
704 function isUndefined(arg) {
705   return arg === void 0;
708 },{}],7:[function(require,module,exports){
709 // shim for using process in browser
711 var process = module.exports = {};
712 var queue = [];
713 var draining = false;
715 function drainQueue() {
716     if (draining) {
717         return;
718     }
719     draining = true;
720     var currentQueue;
721     var len = queue.length;
722     while(len) {
723         currentQueue = queue;
724         queue = [];
725         var i = -1;
726         while (++i < len) {
727             currentQueue[i]();
728         }
729         len = queue.length;
730     }
731     draining = false;
733 process.nextTick = function (fun) {
734     queue.push(fun);
735     if (!draining) {
736         setTimeout(drainQueue, 0);
737     }
740 process.title = 'browser';
741 process.browser = true;
742 process.env = {};
743 process.argv = [];
744 process.version = ''; // empty string to avoid regexp issues
745 process.versions = {};
747 function noop() {}
749 process.on = noop;
750 process.addListener = noop;
751 process.once = noop;
752 process.off = noop;
753 process.removeListener = noop;
754 process.removeAllListeners = noop;
755 process.emit = noop;
757 process.binding = function (name) {
758     throw new Error('process.binding is not supported');
761 // TODO(shtylman)
762 process.cwd = function () { return '/' };
763 process.chdir = function (dir) {
764     throw new Error('process.chdir is not supported');
766 process.umask = function() { return 0; };
768 },{}],8:[function(require,module,exports){
769 if (typeof Object.create === 'function') {
770   // implementation from standard node.js 'util' module
771   module.exports = function inherits(ctor, superCtor) {
772     ctor.super_ = superCtor
773     ctor.prototype = Object.create(superCtor.prototype, {
774       constructor: {
775         value: ctor,
776         enumerable: false,
777         writable: true,
778         configurable: true
779       }
780     });
781   };
782 } else {
783   // old school shim for old browsers
784   module.exports = function inherits(ctor, superCtor) {
785     ctor.super_ = superCtor
786     var TempCtor = function () {}
787     TempCtor.prototype = superCtor.prototype
788     ctor.prototype = new TempCtor()
789     ctor.prototype.constructor = ctor
790   }
793 },{}],9:[function(require,module,exports){
794 module.exports = function isBuffer(arg) {
795   return arg && typeof arg === 'object'
796     && typeof arg.copy === 'function'
797     && typeof arg.fill === 'function'
798     && typeof arg.readUInt8 === 'function';
800 },{}],10:[function(require,module,exports){
801 (function (process,global){
802 // Copyright Joyent, Inc. and other Node contributors.
804 // Permission is hereby granted, free of charge, to any person obtaining a
805 // copy of this software and associated documentation files (the
806 // "Software"), to deal in the Software without restriction, including
807 // without limitation the rights to use, copy, modify, merge, publish,
808 // distribute, sublicense, and/or sell copies of the Software, and to permit
809 // persons to whom the Software is furnished to do so, subject to the
810 // following conditions:
812 // The above copyright notice and this permission notice shall be included
813 // in all copies or substantial portions of the Software.
815 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
816 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
817 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
818 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
819 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
820 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
821 // USE OR OTHER DEALINGS IN THE SOFTWARE.
823 var formatRegExp = /%[sdj%]/g;
824 exports.format = function(f) {
825   if (!isString(f)) {
826     var objects = [];
827     for (var i = 0; i < arguments.length; i++) {
828       objects.push(inspect(arguments[i]));
829     }
830     return objects.join(' ');
831   }
833   var i = 1;
834   var args = arguments;
835   var len = args.length;
836   var str = String(f).replace(formatRegExp, function(x) {
837     if (x === '%%') return '%';
838     if (i >= len) return x;
839     switch (x) {
840       case '%s': return String(args[i++]);
841       case '%d': return Number(args[i++]);
842       case '%j':
843         try {
844           return JSON.stringify(args[i++]);
845         } catch (_) {
846           return '[Circular]';
847         }
848       default:
849         return x;
850     }
851   });
852   for (var x = args[i]; i < len; x = args[++i]) {
853     if (isNull(x) || !isObject(x)) {
854       str += ' ' + x;
855     } else {
856       str += ' ' + inspect(x);
857     }
858   }
859   return str;
863 // Mark that a method should not be used.
864 // Returns a modified function which warns once by default.
865 // If --no-deprecation is set, then it is a no-op.
866 exports.deprecate = function(fn, msg) {
867   // Allow for deprecating things in the process of starting up.
868   if (isUndefined(global.process)) {
869     return function() {
870       return exports.deprecate(fn, msg).apply(this, arguments);
871     };
872   }
874   if (process.noDeprecation === true) {
875     return fn;
876   }
878   var warned = false;
879   function deprecated() {
880     if (!warned) {
881       if (process.throwDeprecation) {
882         throw new Error(msg);
883       } else if (process.traceDeprecation) {
884         console.trace(msg);
885       } else {
886         console.error(msg);
887       }
888       warned = true;
889     }
890     return fn.apply(this, arguments);
891   }
893   return deprecated;
897 var debugs = {};
898 var debugEnviron;
899 exports.debuglog = function(set) {
900   if (isUndefined(debugEnviron))
901     debugEnviron = process.env.NODE_DEBUG || '';
902   set = set.toUpperCase();
903   if (!debugs[set]) {
904     if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
905       var pid = process.pid;
906       debugs[set] = function() {
907         var msg = exports.format.apply(exports, arguments);
908         console.error('%s %d: %s', set, pid, msg);
909       };
910     } else {
911       debugs[set] = function() {};
912     }
913   }
914   return debugs[set];
919  * Echos the value of a value. Trys to print the value out
920  * in the best way possible given the different types.
922  * @param {Object} obj The object to print out.
923  * @param {Object} opts Optional options object that alters the output.
924  */
925 /* legacy: obj, showHidden, depth, colors*/
926 function inspect(obj, opts) {
927   // default options
928   var ctx = {
929     seen: [],
930     stylize: stylizeNoColor
931   };
932   // legacy...
933   if (arguments.length >= 3) ctx.depth = arguments[2];
934   if (arguments.length >= 4) ctx.colors = arguments[3];
935   if (isBoolean(opts)) {
936     // legacy...
937     ctx.showHidden = opts;
938   } else if (opts) {
939     // got an "options" object
940     exports._extend(ctx, opts);
941   }
942   // set default options
943   if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
944   if (isUndefined(ctx.depth)) ctx.depth = 2;
945   if (isUndefined(ctx.colors)) ctx.colors = false;
946   if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
947   if (ctx.colors) ctx.stylize = stylizeWithColor;
948   return formatValue(ctx, obj, ctx.depth);
950 exports.inspect = inspect;
953 // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
954 inspect.colors = {
955   'bold' : [1, 22],
956   'italic' : [3, 23],
957   'underline' : [4, 24],
958   'inverse' : [7, 27],
959   'white' : [37, 39],
960   'grey' : [90, 39],
961   'black' : [30, 39],
962   'blue' : [34, 39],
963   'cyan' : [36, 39],
964   'green' : [32, 39],
965   'magenta' : [35, 39],
966   'red' : [31, 39],
967   'yellow' : [33, 39]
970 // Don't use 'blue' not visible on cmd.exe
971 inspect.styles = {
972   'special': 'cyan',
973   'number': 'yellow',
974   'boolean': 'yellow',
975   'undefined': 'grey',
976   'null': 'bold',
977   'string': 'green',
978   'date': 'magenta',
979   // "name": intentionally not styling
980   'regexp': 'red'
984 function stylizeWithColor(str, styleType) {
985   var style = inspect.styles[styleType];
987   if (style) {
988     return '\u001b[' + inspect.colors[style][0] + 'm' + str +
989            '\u001b[' + inspect.colors[style][1] + 'm';
990   } else {
991     return str;
992   }
996 function stylizeNoColor(str, styleType) {
997   return str;
1001 function arrayToHash(array) {
1002   var hash = {};
1004   array.forEach(function(val, idx) {
1005     hash[val] = true;
1006   });
1008   return hash;
1012 function formatValue(ctx, value, recurseTimes) {
1013   // Provide a hook for user-specified inspect functions.
1014   // Check that value is an object with an inspect function on it
1015   if (ctx.customInspect &&
1016       value &&
1017       isFunction(value.inspect) &&
1018       // Filter out the util module, it's inspect function is special
1019       value.inspect !== exports.inspect &&
1020       // Also filter out any prototype objects using the circular check.
1021       !(value.constructor && value.constructor.prototype === value)) {
1022     var ret = value.inspect(recurseTimes, ctx);
1023     if (!isString(ret)) {
1024       ret = formatValue(ctx, ret, recurseTimes);
1025     }
1026     return ret;
1027   }
1029   // Primitive types cannot have properties
1030   var primitive = formatPrimitive(ctx, value);
1031   if (primitive) {
1032     return primitive;
1033   }
1035   // Look up the keys of the object.
1036   var keys = Object.keys(value);
1037   var visibleKeys = arrayToHash(keys);
1039   if (ctx.showHidden) {
1040     keys = Object.getOwnPropertyNames(value);
1041   }
1043   // IE doesn't make error fields non-enumerable
1044   // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
1045   if (isError(value)
1046       && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
1047     return formatError(value);
1048   }
1050   // Some type of object without properties can be shortcutted.
1051   if (keys.length === 0) {
1052     if (isFunction(value)) {
1053       var name = value.name ? ': ' + value.name : '';
1054       return ctx.stylize('[Function' + name + ']', 'special');
1055     }
1056     if (isRegExp(value)) {
1057       return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
1058     }
1059     if (isDate(value)) {
1060       return ctx.stylize(Date.prototype.toString.call(value), 'date');
1061     }
1062     if (isError(value)) {
1063       return formatError(value);
1064     }
1065   }
1067   var base = '', array = false, braces = ['{', '}'];
1069   // Make Array say that they are Array
1070   if (isArray(value)) {
1071     array = true;
1072     braces = ['[', ']'];
1073   }
1075   // Make functions say that they are functions
1076   if (isFunction(value)) {
1077     var n = value.name ? ': ' + value.name : '';
1078     base = ' [Function' + n + ']';
1079   }
1081   // Make RegExps say that they are RegExps
1082   if (isRegExp(value)) {
1083     base = ' ' + RegExp.prototype.toString.call(value);
1084   }
1086   // Make dates with properties first say the date
1087   if (isDate(value)) {
1088     base = ' ' + Date.prototype.toUTCString.call(value);
1089   }
1091   // Make error with message first say the error
1092   if (isError(value)) {
1093     base = ' ' + formatError(value);
1094   }
1096   if (keys.length === 0 && (!array || value.length == 0)) {
1097     return braces[0] + base + braces[1];
1098   }
1100   if (recurseTimes < 0) {
1101     if (isRegExp(value)) {
1102       return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
1103     } else {
1104       return ctx.stylize('[Object]', 'special');
1105     }
1106   }
1108   ctx.seen.push(value);
1110   var output;
1111   if (array) {
1112     output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
1113   } else {
1114     output = keys.map(function(key) {
1115       return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
1116     });
1117   }
1119   ctx.seen.pop();
1121   return reduceToSingleString(output, base, braces);
1125 function formatPrimitive(ctx, value) {
1126   if (isUndefined(value))
1127     return ctx.stylize('undefined', 'undefined');
1128   if (isString(value)) {
1129     var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
1130                                              .replace(/'/g, "\\'")
1131                                              .replace(/\\"/g, '"') + '\'';
1132     return ctx.stylize(simple, 'string');
1133   }
1134   if (isNumber(value))
1135     return ctx.stylize('' + value, 'number');
1136   if (isBoolean(value))
1137     return ctx.stylize('' + value, 'boolean');
1138   // For some reason typeof null is "object", so special case here.
1139   if (isNull(value))
1140     return ctx.stylize('null', 'null');
1144 function formatError(value) {
1145   return '[' + Error.prototype.toString.call(value) + ']';
1149 function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
1150   var output = [];
1151   for (var i = 0, l = value.length; i < l; ++i) {
1152     if (hasOwnProperty(value, String(i))) {
1153       output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
1154           String(i), true));
1155     } else {
1156       output.push('');
1157     }
1158   }
1159   keys.forEach(function(key) {
1160     if (!key.match(/^\d+$/)) {
1161       output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
1162           key, true));
1163     }
1164   });
1165   return output;
1169 function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
1170   var name, str, desc;
1171   desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
1172   if (desc.get) {
1173     if (desc.set) {
1174       str = ctx.stylize('[Getter/Setter]', 'special');
1175     } else {
1176       str = ctx.stylize('[Getter]', 'special');
1177     }
1178   } else {
1179     if (desc.set) {
1180       str = ctx.stylize('[Setter]', 'special');
1181     }
1182   }
1183   if (!hasOwnProperty(visibleKeys, key)) {
1184     name = '[' + key + ']';
1185   }
1186   if (!str) {
1187     if (ctx.seen.indexOf(desc.value) < 0) {
1188       if (isNull(recurseTimes)) {
1189         str = formatValue(ctx, desc.value, null);
1190       } else {
1191         str = formatValue(ctx, desc.value, recurseTimes - 1);
1192       }
1193       if (str.indexOf('\n') > -1) {
1194         if (array) {
1195           str = str.split('\n').map(function(line) {
1196             return '  ' + line;
1197           }).join('\n').substr(2);
1198         } else {
1199           str = '\n' + str.split('\n').map(function(line) {
1200             return '   ' + line;
1201           }).join('\n');
1202         }
1203       }
1204     } else {
1205       str = ctx.stylize('[Circular]', 'special');
1206     }
1207   }
1208   if (isUndefined(name)) {
1209     if (array && key.match(/^\d+$/)) {
1210       return str;
1211     }
1212     name = JSON.stringify('' + key);
1213     if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
1214       name = name.substr(1, name.length - 2);
1215       name = ctx.stylize(name, 'name');
1216     } else {
1217       name = name.replace(/'/g, "\\'")
1218                  .replace(/\\"/g, '"')
1219                  .replace(/(^"|"$)/g, "'");
1220       name = ctx.stylize(name, 'string');
1221     }
1222   }
1224   return name + ': ' + str;
1228 function reduceToSingleString(output, base, braces) {
1229   var numLinesEst = 0;
1230   var length = output.reduce(function(prev, cur) {
1231     numLinesEst++;
1232     if (cur.indexOf('\n') >= 0) numLinesEst++;
1233     return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
1234   }, 0);
1236   if (length > 60) {
1237     return braces[0] +
1238            (base === '' ? '' : base + '\n ') +
1239            ' ' +
1240            output.join(',\n  ') +
1241            ' ' +
1242            braces[1];
1243   }
1245   return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
1249 // NOTE: These type checking functions intentionally don't use `instanceof`
1250 // because it is fragile and can be easily faked with `Object.create()`.
1251 function isArray(ar) {
1252   return Array.isArray(ar);
1254 exports.isArray = isArray;
1256 function isBoolean(arg) {
1257   return typeof arg === 'boolean';
1259 exports.isBoolean = isBoolean;
1261 function isNull(arg) {
1262   return arg === null;
1264 exports.isNull = isNull;
1266 function isNullOrUndefined(arg) {
1267   return arg == null;
1269 exports.isNullOrUndefined = isNullOrUndefined;
1271 function isNumber(arg) {
1272   return typeof arg === 'number';
1274 exports.isNumber = isNumber;
1276 function isString(arg) {
1277   return typeof arg === 'string';
1279 exports.isString = isString;
1281 function isSymbol(arg) {
1282   return typeof arg === 'symbol';
1284 exports.isSymbol = isSymbol;
1286 function isUndefined(arg) {
1287   return arg === void 0;
1289 exports.isUndefined = isUndefined;
1291 function isRegExp(re) {
1292   return isObject(re) && objectToString(re) === '[object RegExp]';
1294 exports.isRegExp = isRegExp;
1296 function isObject(arg) {
1297   return typeof arg === 'object' && arg !== null;
1299 exports.isObject = isObject;
1301 function isDate(d) {
1302   return isObject(d) && objectToString(d) === '[object Date]';
1304 exports.isDate = isDate;
1306 function isError(e) {
1307   return isObject(e) &&
1308       (objectToString(e) === '[object Error]' || e instanceof Error);
1310 exports.isError = isError;
1312 function isFunction(arg) {
1313   return typeof arg === 'function';
1315 exports.isFunction = isFunction;
1317 function isPrimitive(arg) {
1318   return arg === null ||
1319          typeof arg === 'boolean' ||
1320          typeof arg === 'number' ||
1321          typeof arg === 'string' ||
1322          typeof arg === 'symbol' ||  // ES6 symbol
1323          typeof arg === 'undefined';
1325 exports.isPrimitive = isPrimitive;
1327 exports.isBuffer = require('./support/isBuffer');
1329 function objectToString(o) {
1330   return Object.prototype.toString.call(o);
1334 function pad(n) {
1335   return n < 10 ? '0' + n.toString(10) : n.toString(10);
1339 var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
1340               'Oct', 'Nov', 'Dec'];
1342 // 26 Feb 16:19:34
1343 function timestamp() {
1344   var d = new Date();
1345   var time = [pad(d.getHours()),
1346               pad(d.getMinutes()),
1347               pad(d.getSeconds())].join(':');
1348   return [d.getDate(), months[d.getMonth()], time].join(' ');
1352 // log is just a thin wrapper to console.log that prepends a timestamp
1353 exports.log = function() {
1354   console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
1359  * Inherit the prototype methods from one constructor into another.
1361  * The Function.prototype.inherits from lang.js rewritten as a standalone
1362  * function (not on Function.prototype). NOTE: If this file is to be loaded
1363  * during bootstrapping this function needs to be rewritten using some native
1364  * functions as prototype setup using normal JavaScript does not work as
1365  * expected during bootstrapping (see mirror.js in r114903).
1367  * @param {function} ctor Constructor function which needs to inherit the
1368  *     prototype.
1369  * @param {function} superCtor Constructor function to inherit prototype from.
1370  */
1371 exports.inherits = require('inherits');
1373 exports._extend = function(origin, add) {
1374   // Don't do anything if add isn't an object
1375   if (!add || !isObject(add)) return origin;
1377   var keys = Object.keys(add);
1378   var i = keys.length;
1379   while (i--) {
1380     origin[keys[i]] = add[keys[i]];
1381   }
1382   return origin;
1385 function hasOwnProperty(obj, prop) {
1386   return Object.prototype.hasOwnProperty.call(obj, prop);
1389 }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
1390 },{"./support/isBuffer":9,"_process":7,"inherits":8}],11:[function(require,module,exports){
1391 (function (global){
1392 /*global window, global*/
1393 var util = require("util")
1394 var assert = require("assert")
1395 var now = require("date-now")
1397 var slice = Array.prototype.slice
1398 var console
1399 var times = {}
1401 if (typeof global !== "undefined" && global.console) {
1402     console = global.console
1403 } else if (typeof window !== "undefined" && window.console) {
1404     console = window.console
1405 } else {
1406     console = {}
1409 var functions = [
1410     [log, "log"],
1411     [info, "info"],
1412     [warn, "warn"],
1413     [error, "error"],
1414     [time, "time"],
1415     [timeEnd, "timeEnd"],
1416     [trace, "trace"],
1417     [dir, "dir"],
1418     [consoleAssert, "assert"]
1421 for (var i = 0; i < functions.length; i++) {
1422     var tuple = functions[i]
1423     var f = tuple[0]
1424     var name = tuple[1]
1426     if (!console[name]) {
1427         console[name] = f
1428     }
1431 module.exports = console
1433 function log() {}
1435 function info() {
1436     console.log.apply(console, arguments)
1439 function warn() {
1440     console.log.apply(console, arguments)
1443 function error() {
1444     console.warn.apply(console, arguments)
1447 function time(label) {
1448     times[label] = now()
1451 function timeEnd(label) {
1452     var time = times[label]
1453     if (!time) {
1454         throw new Error("No such label: " + label)
1455     }
1457     var duration = now() - time
1458     console.log(label + ": " + duration + "ms")
1461 function trace() {
1462     var err = new Error()
1463     err.name = "Trace"
1464     err.message = util.format.apply(null, arguments)
1465     console.error(err.stack)
1468 function dir(object) {
1469     console.log(util.inspect(object) + "\n")
1472 function consoleAssert(expression) {
1473     if (!expression) {
1474         var arr = slice.call(arguments, 1)
1475         assert.ok(false, util.format.apply(null, arr))
1476     }
1479 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
1480 },{"assert":5,"date-now":12,"util":10}],12:[function(require,module,exports){
1481 module.exports = now
1483 function now() {
1484     return new Date().getTime()
1487 },{}],13:[function(require,module,exports){
1488 (function (global){
1490  * @license
1491  * Lodash <https://lodash.com/>
1492  * Copyright JS Foundation and other contributors <https://js.foundation/>
1493  * Released under MIT license <https://lodash.com/license>
1494  * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
1495  * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
1496  */
1497 ;(function() {
1499   /** Used as a safe reference for `undefined` in pre-ES5 environments. */
1500   var undefined;
1502   /** Used as the semantic version number. */
1503   var VERSION = '4.17.10';
1505   /** Used as the size to enable large array optimizations. */
1506   var LARGE_ARRAY_SIZE = 200;
1508   /** Error message constants. */
1509   var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
1510       FUNC_ERROR_TEXT = 'Expected a function';
1512   /** Used to stand-in for `undefined` hash values. */
1513   var HASH_UNDEFINED = '__lodash_hash_undefined__';
1515   /** Used as the maximum memoize cache size. */
1516   var MAX_MEMOIZE_SIZE = 500;
1518   /** Used as the internal argument placeholder. */
1519   var PLACEHOLDER = '__lodash_placeholder__';
1521   /** Used to compose bitmasks for cloning. */
1522   var CLONE_DEEP_FLAG = 1,
1523       CLONE_FLAT_FLAG = 2,
1524       CLONE_SYMBOLS_FLAG = 4;
1526   /** Used to compose bitmasks for value comparisons. */
1527   var COMPARE_PARTIAL_FLAG = 1,
1528       COMPARE_UNORDERED_FLAG = 2;
1530   /** Used to compose bitmasks for function metadata. */
1531   var WRAP_BIND_FLAG = 1,
1532       WRAP_BIND_KEY_FLAG = 2,
1533       WRAP_CURRY_BOUND_FLAG = 4,
1534       WRAP_CURRY_FLAG = 8,
1535       WRAP_CURRY_RIGHT_FLAG = 16,
1536       WRAP_PARTIAL_FLAG = 32,
1537       WRAP_PARTIAL_RIGHT_FLAG = 64,
1538       WRAP_ARY_FLAG = 128,
1539       WRAP_REARG_FLAG = 256,
1540       WRAP_FLIP_FLAG = 512;
1542   /** Used as default options for `_.truncate`. */
1543   var DEFAULT_TRUNC_LENGTH = 30,
1544       DEFAULT_TRUNC_OMISSION = '...';
1546   /** Used to detect hot functions by number of calls within a span of milliseconds. */
1547   var HOT_COUNT = 800,
1548       HOT_SPAN = 16;
1550   /** Used to indicate the type of lazy iteratees. */
1551   var LAZY_FILTER_FLAG = 1,
1552       LAZY_MAP_FLAG = 2,
1553       LAZY_WHILE_FLAG = 3;
1555   /** Used as references for various `Number` constants. */
1556   var INFINITY = 1 / 0,
1557       MAX_SAFE_INTEGER = 9007199254740991,
1558       MAX_INTEGER = 1.7976931348623157e+308,
1559       NAN = 0 / 0;
1561   /** Used as references for the maximum length and index of an array. */
1562   var MAX_ARRAY_LENGTH = 4294967295,
1563       MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
1564       HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
1566   /** Used to associate wrap methods with their bit flags. */
1567   var wrapFlags = [
1568     ['ary', WRAP_ARY_FLAG],
1569     ['bind', WRAP_BIND_FLAG],
1570     ['bindKey', WRAP_BIND_KEY_FLAG],
1571     ['curry', WRAP_CURRY_FLAG],
1572     ['curryRight', WRAP_CURRY_RIGHT_FLAG],
1573     ['flip', WRAP_FLIP_FLAG],
1574     ['partial', WRAP_PARTIAL_FLAG],
1575     ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
1576     ['rearg', WRAP_REARG_FLAG]
1577   ];
1579   /** `Object#toString` result references. */
1580   var argsTag = '[object Arguments]',
1581       arrayTag = '[object Array]',
1582       asyncTag = '[object AsyncFunction]',
1583       boolTag = '[object Boolean]',
1584       dateTag = '[object Date]',
1585       domExcTag = '[object DOMException]',
1586       errorTag = '[object Error]',
1587       funcTag = '[object Function]',
1588       genTag = '[object GeneratorFunction]',
1589       mapTag = '[object Map]',
1590       numberTag = '[object Number]',
1591       nullTag = '[object Null]',
1592       objectTag = '[object Object]',
1593       promiseTag = '[object Promise]',
1594       proxyTag = '[object Proxy]',
1595       regexpTag = '[object RegExp]',
1596       setTag = '[object Set]',
1597       stringTag = '[object String]',
1598       symbolTag = '[object Symbol]',
1599       undefinedTag = '[object Undefined]',
1600       weakMapTag = '[object WeakMap]',
1601       weakSetTag = '[object WeakSet]';
1603   var arrayBufferTag = '[object ArrayBuffer]',
1604       dataViewTag = '[object DataView]',
1605       float32Tag = '[object Float32Array]',
1606       float64Tag = '[object Float64Array]',
1607       int8Tag = '[object Int8Array]',
1608       int16Tag = '[object Int16Array]',
1609       int32Tag = '[object Int32Array]',
1610       uint8Tag = '[object Uint8Array]',
1611       uint8ClampedTag = '[object Uint8ClampedArray]',
1612       uint16Tag = '[object Uint16Array]',
1613       uint32Tag = '[object Uint32Array]';
1615   /** Used to match empty string literals in compiled template source. */
1616   var reEmptyStringLeading = /\b__p \+= '';/g,
1617       reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
1618       reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
1620   /** Used to match HTML entities and HTML characters. */
1621   var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
1622       reUnescapedHtml = /[&<>"']/g,
1623       reHasEscapedHtml = RegExp(reEscapedHtml.source),
1624       reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
1626   /** Used to match template delimiters. */
1627   var reEscape = /<%-([\s\S]+?)%>/g,
1628       reEvaluate = /<%([\s\S]+?)%>/g,
1629       reInterpolate = /<%=([\s\S]+?)%>/g;
1631   /** Used to match property names within property paths. */
1632   var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
1633       reIsPlainProp = /^\w*$/,
1634       rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
1636   /**
1637    * Used to match `RegExp`
1638    * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
1639    */
1640   var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
1641       reHasRegExpChar = RegExp(reRegExpChar.source);
1643   /** Used to match leading and trailing whitespace. */
1644   var reTrim = /^\s+|\s+$/g,
1645       reTrimStart = /^\s+/,
1646       reTrimEnd = /\s+$/;
1648   /** Used to match wrap detail comments. */
1649   var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
1650       reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
1651       reSplitDetails = /,? & /;
1653   /** Used to match words composed of alphanumeric characters. */
1654   var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
1656   /** Used to match backslashes in property paths. */
1657   var reEscapeChar = /\\(\\)?/g;
1659   /**
1660    * Used to match
1661    * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
1662    */
1663   var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
1665   /** Used to match `RegExp` flags from their coerced string values. */
1666   var reFlags = /\w*$/;
1668   /** Used to detect bad signed hexadecimal string values. */
1669   var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
1671   /** Used to detect binary string values. */
1672   var reIsBinary = /^0b[01]+$/i;
1674   /** Used to detect host constructors (Safari). */
1675   var reIsHostCtor = /^\[object .+?Constructor\]$/;
1677   /** Used to detect octal string values. */
1678   var reIsOctal = /^0o[0-7]+$/i;
1680   /** Used to detect unsigned integer values. */
1681   var reIsUint = /^(?:0|[1-9]\d*)$/;
1683   /** Used to match Latin Unicode letters (excluding mathematical operators). */
1684   var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
1686   /** Used to ensure capturing order of template delimiters. */
1687   var reNoMatch = /($^)/;
1689   /** Used to match unescaped characters in compiled string literals. */
1690   var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
1692   /** Used to compose unicode character classes. */
1693   var rsAstralRange = '\\ud800-\\udfff',
1694       rsComboMarksRange = '\\u0300-\\u036f',
1695       reComboHalfMarksRange = '\\ufe20-\\ufe2f',
1696       rsComboSymbolsRange = '\\u20d0-\\u20ff',
1697       rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
1698       rsDingbatRange = '\\u2700-\\u27bf',
1699       rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
1700       rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
1701       rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
1702       rsPunctuationRange = '\\u2000-\\u206f',
1703       rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
1704       rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
1705       rsVarRange = '\\ufe0e\\ufe0f',
1706       rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
1708   /** Used to compose unicode capture groups. */
1709   var rsApos = "['\u2019]",
1710       rsAstral = '[' + rsAstralRange + ']',
1711       rsBreak = '[' + rsBreakRange + ']',
1712       rsCombo = '[' + rsComboRange + ']',
1713       rsDigits = '\\d+',
1714       rsDingbat = '[' + rsDingbatRange + ']',
1715       rsLower = '[' + rsLowerRange + ']',
1716       rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
1717       rsFitz = '\\ud83c[\\udffb-\\udfff]',
1718       rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
1719       rsNonAstral = '[^' + rsAstralRange + ']',
1720       rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
1721       rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
1722       rsUpper = '[' + rsUpperRange + ']',
1723       rsZWJ = '\\u200d';
1725   /** Used to compose unicode regexes. */
1726   var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
1727       rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
1728       rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
1729       rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
1730       reOptMod = rsModifier + '?',
1731       rsOptVar = '[' + rsVarRange + ']?',
1732       rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
1733       rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])',
1734       rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])',
1735       rsSeq = rsOptVar + reOptMod + rsOptJoin,
1736       rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
1737       rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
1739   /** Used to match apostrophes. */
1740   var reApos = RegExp(rsApos, 'g');
1742   /**
1743    * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
1744    * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
1745    */
1746   var reComboMark = RegExp(rsCombo, 'g');
1748   /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
1749   var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
1751   /** Used to match complex or compound words. */
1752   var reUnicodeWord = RegExp([
1753     rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
1754     rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
1755     rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
1756     rsUpper + '+' + rsOptContrUpper,
1757     rsOrdUpper,
1758     rsOrdLower,
1759     rsDigits,
1760     rsEmoji
1761   ].join('|'), 'g');
1763   /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
1764   var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');
1766   /** Used to detect strings that need a more robust regexp to match words. */
1767   var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
1769   /** Used to assign default `context` object properties. */
1770   var contextProps = [
1771     'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
1772     'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
1773     'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
1774     'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
1775     '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
1776   ];
1778   /** Used to make template sourceURLs easier to identify. */
1779   var templateCounter = -1;
1781   /** Used to identify `toStringTag` values of typed arrays. */
1782   var typedArrayTags = {};
1783   typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
1784   typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
1785   typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
1786   typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
1787   typedArrayTags[uint32Tag] = true;
1788   typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
1789   typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
1790   typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
1791   typedArrayTags[errorTag] = typedArrayTags[funcTag] =
1792   typedArrayTags[mapTag] = typedArrayTags[numberTag] =
1793   typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
1794   typedArrayTags[setTag] = typedArrayTags[stringTag] =
1795   typedArrayTags[weakMapTag] = false;
1797   /** Used to identify `toStringTag` values supported by `_.clone`. */
1798   var cloneableTags = {};
1799   cloneableTags[argsTag] = cloneableTags[arrayTag] =
1800   cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
1801   cloneableTags[boolTag] = cloneableTags[dateTag] =
1802   cloneableTags[float32Tag] = cloneableTags[float64Tag] =
1803   cloneableTags[int8Tag] = cloneableTags[int16Tag] =
1804   cloneableTags[int32Tag] = cloneableTags[mapTag] =
1805   cloneableTags[numberTag] = cloneableTags[objectTag] =
1806   cloneableTags[regexpTag] = cloneableTags[setTag] =
1807   cloneableTags[stringTag] = cloneableTags[symbolTag] =
1808   cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
1809   cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
1810   cloneableTags[errorTag] = cloneableTags[funcTag] =
1811   cloneableTags[weakMapTag] = false;
1813   /** Used to map Latin Unicode letters to basic Latin letters. */
1814   var deburredLetters = {
1815     // Latin-1 Supplement block.
1816     '\xc0': 'A',  '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
1817     '\xe0': 'a',  '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
1818     '\xc7': 'C',  '\xe7': 'c',
1819     '\xd0': 'D',  '\xf0': 'd',
1820     '\xc8': 'E',  '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
1821     '\xe8': 'e',  '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
1822     '\xcc': 'I',  '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
1823     '\xec': 'i',  '\xed': 'i', '\xee': 'i', '\xef': 'i',
1824     '\xd1': 'N',  '\xf1': 'n',
1825     '\xd2': 'O',  '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
1826     '\xf2': 'o',  '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
1827     '\xd9': 'U',  '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
1828     '\xf9': 'u',  '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
1829     '\xdd': 'Y',  '\xfd': 'y', '\xff': 'y',
1830     '\xc6': 'Ae', '\xe6': 'ae',
1831     '\xde': 'Th', '\xfe': 'th',
1832     '\xdf': 'ss',
1833     // Latin Extended-A block.
1834     '\u0100': 'A',  '\u0102': 'A', '\u0104': 'A',
1835     '\u0101': 'a',  '\u0103': 'a', '\u0105': 'a',
1836     '\u0106': 'C',  '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
1837     '\u0107': 'c',  '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
1838     '\u010e': 'D',  '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
1839     '\u0112': 'E',  '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
1840     '\u0113': 'e',  '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
1841     '\u011c': 'G',  '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
1842     '\u011d': 'g',  '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
1843     '\u0124': 'H',  '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
1844     '\u0128': 'I',  '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
1845     '\u0129': 'i',  '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
1846     '\u0134': 'J',  '\u0135': 'j',
1847     '\u0136': 'K',  '\u0137': 'k', '\u0138': 'k',
1848     '\u0139': 'L',  '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
1849     '\u013a': 'l',  '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
1850     '\u0143': 'N',  '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
1851     '\u0144': 'n',  '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
1852     '\u014c': 'O',  '\u014e': 'O', '\u0150': 'O',
1853     '\u014d': 'o',  '\u014f': 'o', '\u0151': 'o',
1854     '\u0154': 'R',  '\u0156': 'R', '\u0158': 'R',
1855     '\u0155': 'r',  '\u0157': 'r', '\u0159': 'r',
1856     '\u015a': 'S',  '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
1857     '\u015b': 's',  '\u015d': 's', '\u015f': 's', '\u0161': 's',
1858     '\u0162': 'T',  '\u0164': 'T', '\u0166': 'T',
1859     '\u0163': 't',  '\u0165': 't', '\u0167': 't',
1860     '\u0168': 'U',  '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
1861     '\u0169': 'u',  '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
1862     '\u0174': 'W',  '\u0175': 'w',
1863     '\u0176': 'Y',  '\u0177': 'y', '\u0178': 'Y',
1864     '\u0179': 'Z',  '\u017b': 'Z', '\u017d': 'Z',
1865     '\u017a': 'z',  '\u017c': 'z', '\u017e': 'z',
1866     '\u0132': 'IJ', '\u0133': 'ij',
1867     '\u0152': 'Oe', '\u0153': 'oe',
1868     '\u0149': "'n", '\u017f': 's'
1869   };
1871   /** Used to map characters to HTML entities. */
1872   var htmlEscapes = {
1873     '&': '&amp;',
1874     '<': '&lt;',
1875     '>': '&gt;',
1876     '"': '&quot;',
1877     "'": '&#39;'
1878   };
1880   /** Used to map HTML entities to characters. */
1881   var htmlUnescapes = {
1882     '&amp;': '&',
1883     '&lt;': '<',
1884     '&gt;': '>',
1885     '&quot;': '"',
1886     '&#39;': "'"
1887   };
1889   /** Used to escape characters for inclusion in compiled string literals. */
1890   var stringEscapes = {
1891     '\\': '\\',
1892     "'": "'",
1893     '\n': 'n',
1894     '\r': 'r',
1895     '\u2028': 'u2028',
1896     '\u2029': 'u2029'
1897   };
1899   /** Built-in method references without a dependency on `root`. */
1900   var freeParseFloat = parseFloat,
1901       freeParseInt = parseInt;
1903   /** Detect free variable `global` from Node.js. */
1904   var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
1906   /** Detect free variable `self`. */
1907   var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
1909   /** Used as a reference to the global object. */
1910   var root = freeGlobal || freeSelf || Function('return this')();
1912   /** Detect free variable `exports`. */
1913   var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
1915   /** Detect free variable `module`. */
1916   var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
1918   /** Detect the popular CommonJS extension `module.exports`. */
1919   var moduleExports = freeModule && freeModule.exports === freeExports;
1921   /** Detect free variable `process` from Node.js. */
1922   var freeProcess = moduleExports && freeGlobal.process;
1924   /** Used to access faster Node.js helpers. */
1925   var nodeUtil = (function() {
1926     try {
1927       // Use `util.types` for Node.js 10+.
1928       var types = freeModule && freeModule.require && freeModule.require('util').types;
1930       if (types) {
1931         return types;
1932       }
1934       // Legacy `process.binding('util')` for Node.js < 10.
1935       return freeProcess && freeProcess.binding && freeProcess.binding('util');
1936     } catch (e) {}
1937   }());
1939   /* Node.js helper references. */
1940   var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
1941       nodeIsDate = nodeUtil && nodeUtil.isDate,
1942       nodeIsMap = nodeUtil && nodeUtil.isMap,
1943       nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
1944       nodeIsSet = nodeUtil && nodeUtil.isSet,
1945       nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
1947   /*--------------------------------------------------------------------------*/
1949   /**
1950    * A faster alternative to `Function#apply`, this function invokes `func`
1951    * with the `this` binding of `thisArg` and the arguments of `args`.
1952    *
1953    * @private
1954    * @param {Function} func The function to invoke.
1955    * @param {*} thisArg The `this` binding of `func`.
1956    * @param {Array} args The arguments to invoke `func` with.
1957    * @returns {*} Returns the result of `func`.
1958    */
1959   function apply(func, thisArg, args) {
1960     switch (args.length) {
1961       case 0: return func.call(thisArg);
1962       case 1: return func.call(thisArg, args[0]);
1963       case 2: return func.call(thisArg, args[0], args[1]);
1964       case 3: return func.call(thisArg, args[0], args[1], args[2]);
1965     }
1966     return func.apply(thisArg, args);
1967   }
1969   /**
1970    * A specialized version of `baseAggregator` for arrays.
1971    *
1972    * @private
1973    * @param {Array} [array] The array to iterate over.
1974    * @param {Function} setter The function to set `accumulator` values.
1975    * @param {Function} iteratee The iteratee to transform keys.
1976    * @param {Object} accumulator The initial aggregated object.
1977    * @returns {Function} Returns `accumulator`.
1978    */
1979   function arrayAggregator(array, setter, iteratee, accumulator) {
1980     var index = -1,
1981         length = array == null ? 0 : array.length;
1983     while (++index < length) {
1984       var value = array[index];
1985       setter(accumulator, value, iteratee(value), array);
1986     }
1987     return accumulator;
1988   }
1990   /**
1991    * A specialized version of `_.forEach` for arrays without support for
1992    * iteratee shorthands.
1993    *
1994    * @private
1995    * @param {Array} [array] The array to iterate over.
1996    * @param {Function} iteratee The function invoked per iteration.
1997    * @returns {Array} Returns `array`.
1998    */
1999   function arrayEach(array, iteratee) {
2000     var index = -1,
2001         length = array == null ? 0 : array.length;
2003     while (++index < length) {
2004       if (iteratee(array[index], index, array) === false) {
2005         break;
2006       }
2007     }
2008     return array;
2009   }
2011   /**
2012    * A specialized version of `_.forEachRight` for arrays without support for
2013    * iteratee shorthands.
2014    *
2015    * @private
2016    * @param {Array} [array] The array to iterate over.
2017    * @param {Function} iteratee The function invoked per iteration.
2018    * @returns {Array} Returns `array`.
2019    */
2020   function arrayEachRight(array, iteratee) {
2021     var length = array == null ? 0 : array.length;
2023     while (length--) {
2024       if (iteratee(array[length], length, array) === false) {
2025         break;
2026       }
2027     }
2028     return array;
2029   }
2031   /**
2032    * A specialized version of `_.every` for arrays without support for
2033    * iteratee shorthands.
2034    *
2035    * @private
2036    * @param {Array} [array] The array to iterate over.
2037    * @param {Function} predicate The function invoked per iteration.
2038    * @returns {boolean} Returns `true` if all elements pass the predicate check,
2039    *  else `false`.
2040    */
2041   function arrayEvery(array, predicate) {
2042     var index = -1,
2043         length = array == null ? 0 : array.length;
2045     while (++index < length) {
2046       if (!predicate(array[index], index, array)) {
2047         return false;
2048       }
2049     }
2050     return true;
2051   }
2053   /**
2054    * A specialized version of `_.filter` for arrays without support for
2055    * iteratee shorthands.
2056    *
2057    * @private
2058    * @param {Array} [array] The array to iterate over.
2059    * @param {Function} predicate The function invoked per iteration.
2060    * @returns {Array} Returns the new filtered array.
2061    */
2062   function arrayFilter(array, predicate) {
2063     var index = -1,
2064         length = array == null ? 0 : array.length,
2065         resIndex = 0,
2066         result = [];
2068     while (++index < length) {
2069       var value = array[index];
2070       if (predicate(value, index, array)) {
2071         result[resIndex++] = value;
2072       }
2073     }
2074     return result;
2075   }
2077   /**
2078    * A specialized version of `_.includes` for arrays without support for
2079    * specifying an index to search from.
2080    *
2081    * @private
2082    * @param {Array} [array] The array to inspect.
2083    * @param {*} target The value to search for.
2084    * @returns {boolean} Returns `true` if `target` is found, else `false`.
2085    */
2086   function arrayIncludes(array, value) {
2087     var length = array == null ? 0 : array.length;
2088     return !!length && baseIndexOf(array, value, 0) > -1;
2089   }
2091   /**
2092    * This function is like `arrayIncludes` except that it accepts a comparator.
2093    *
2094    * @private
2095    * @param {Array} [array] The array to inspect.
2096    * @param {*} target The value to search for.
2097    * @param {Function} comparator The comparator invoked per element.
2098    * @returns {boolean} Returns `true` if `target` is found, else `false`.
2099    */
2100   function arrayIncludesWith(array, value, comparator) {
2101     var index = -1,
2102         length = array == null ? 0 : array.length;
2104     while (++index < length) {
2105       if (comparator(value, array[index])) {
2106         return true;
2107       }
2108     }
2109     return false;
2110   }
2112   /**
2113    * A specialized version of `_.map` for arrays without support for iteratee
2114    * shorthands.
2115    *
2116    * @private
2117    * @param {Array} [array] The array to iterate over.
2118    * @param {Function} iteratee The function invoked per iteration.
2119    * @returns {Array} Returns the new mapped array.
2120    */
2121   function arrayMap(array, iteratee) {
2122     var index = -1,
2123         length = array == null ? 0 : array.length,
2124         result = Array(length);
2126     while (++index < length) {
2127       result[index] = iteratee(array[index], index, array);
2128     }
2129     return result;
2130   }
2132   /**
2133    * Appends the elements of `values` to `array`.
2134    *
2135    * @private
2136    * @param {Array} array The array to modify.
2137    * @param {Array} values The values to append.
2138    * @returns {Array} Returns `array`.
2139    */
2140   function arrayPush(array, values) {
2141     var index = -1,
2142         length = values.length,
2143         offset = array.length;
2145     while (++index < length) {
2146       array[offset + index] = values[index];
2147     }
2148     return array;
2149   }
2151   /**
2152    * A specialized version of `_.reduce` for arrays without support for
2153    * iteratee shorthands.
2154    *
2155    * @private
2156    * @param {Array} [array] The array to iterate over.
2157    * @param {Function} iteratee The function invoked per iteration.
2158    * @param {*} [accumulator] The initial value.
2159    * @param {boolean} [initAccum] Specify using the first element of `array` as
2160    *  the initial value.
2161    * @returns {*} Returns the accumulated value.
2162    */
2163   function arrayReduce(array, iteratee, accumulator, initAccum) {
2164     var index = -1,
2165         length = array == null ? 0 : array.length;
2167     if (initAccum && length) {
2168       accumulator = array[++index];
2169     }
2170     while (++index < length) {
2171       accumulator = iteratee(accumulator, array[index], index, array);
2172     }
2173     return accumulator;
2174   }
2176   /**
2177    * A specialized version of `_.reduceRight` for arrays without support for
2178    * iteratee shorthands.
2179    *
2180    * @private
2181    * @param {Array} [array] The array to iterate over.
2182    * @param {Function} iteratee The function invoked per iteration.
2183    * @param {*} [accumulator] The initial value.
2184    * @param {boolean} [initAccum] Specify using the last element of `array` as
2185    *  the initial value.
2186    * @returns {*} Returns the accumulated value.
2187    */
2188   function arrayReduceRight(array, iteratee, accumulator, initAccum) {
2189     var length = array == null ? 0 : array.length;
2190     if (initAccum && length) {
2191       accumulator = array[--length];
2192     }
2193     while (length--) {
2194       accumulator = iteratee(accumulator, array[length], length, array);
2195     }
2196     return accumulator;
2197   }
2199   /**
2200    * A specialized version of `_.some` for arrays without support for iteratee
2201    * shorthands.
2202    *
2203    * @private
2204    * @param {Array} [array] The array to iterate over.
2205    * @param {Function} predicate The function invoked per iteration.
2206    * @returns {boolean} Returns `true` if any element passes the predicate check,
2207    *  else `false`.
2208    */
2209   function arraySome(array, predicate) {
2210     var index = -1,
2211         length = array == null ? 0 : array.length;
2213     while (++index < length) {
2214       if (predicate(array[index], index, array)) {
2215         return true;
2216       }
2217     }
2218     return false;
2219   }
2221   /**
2222    * Gets the size of an ASCII `string`.
2223    *
2224    * @private
2225    * @param {string} string The string inspect.
2226    * @returns {number} Returns the string size.
2227    */
2228   var asciiSize = baseProperty('length');
2230   /**
2231    * Converts an ASCII `string` to an array.
2232    *
2233    * @private
2234    * @param {string} string The string to convert.
2235    * @returns {Array} Returns the converted array.
2236    */
2237   function asciiToArray(string) {
2238     return string.split('');
2239   }
2241   /**
2242    * Splits an ASCII `string` into an array of its words.
2243    *
2244    * @private
2245    * @param {string} The string to inspect.
2246    * @returns {Array} Returns the words of `string`.
2247    */
2248   function asciiWords(string) {
2249     return string.match(reAsciiWord) || [];
2250   }
2252   /**
2253    * The base implementation of methods like `_.findKey` and `_.findLastKey`,
2254    * without support for iteratee shorthands, which iterates over `collection`
2255    * using `eachFunc`.
2256    *
2257    * @private
2258    * @param {Array|Object} collection The collection to inspect.
2259    * @param {Function} predicate The function invoked per iteration.
2260    * @param {Function} eachFunc The function to iterate over `collection`.
2261    * @returns {*} Returns the found element or its key, else `undefined`.
2262    */
2263   function baseFindKey(collection, predicate, eachFunc) {
2264     var result;
2265     eachFunc(collection, function(value, key, collection) {
2266       if (predicate(value, key, collection)) {
2267         result = key;
2268         return false;
2269       }
2270     });
2271     return result;
2272   }
2274   /**
2275    * The base implementation of `_.findIndex` and `_.findLastIndex` without
2276    * support for iteratee shorthands.
2277    *
2278    * @private
2279    * @param {Array} array The array to inspect.
2280    * @param {Function} predicate The function invoked per iteration.
2281    * @param {number} fromIndex The index to search from.
2282    * @param {boolean} [fromRight] Specify iterating from right to left.
2283    * @returns {number} Returns the index of the matched value, else `-1`.
2284    */
2285   function baseFindIndex(array, predicate, fromIndex, fromRight) {
2286     var length = array.length,
2287         index = fromIndex + (fromRight ? 1 : -1);
2289     while ((fromRight ? index-- : ++index < length)) {
2290       if (predicate(array[index], index, array)) {
2291         return index;
2292       }
2293     }
2294     return -1;
2295   }
2297   /**
2298    * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
2299    *
2300    * @private
2301    * @param {Array} array The array to inspect.
2302    * @param {*} value The value to search for.
2303    * @param {number} fromIndex The index to search from.
2304    * @returns {number} Returns the index of the matched value, else `-1`.
2305    */
2306   function baseIndexOf(array, value, fromIndex) {
2307     return value === value
2308       ? strictIndexOf(array, value, fromIndex)
2309       : baseFindIndex(array, baseIsNaN, fromIndex);
2310   }
2312   /**
2313    * This function is like `baseIndexOf` except that it accepts a comparator.
2314    *
2315    * @private
2316    * @param {Array} array The array to inspect.
2317    * @param {*} value The value to search for.
2318    * @param {number} fromIndex The index to search from.
2319    * @param {Function} comparator The comparator invoked per element.
2320    * @returns {number} Returns the index of the matched value, else `-1`.
2321    */
2322   function baseIndexOfWith(array, value, fromIndex, comparator) {
2323     var index = fromIndex - 1,
2324         length = array.length;
2326     while (++index < length) {
2327       if (comparator(array[index], value)) {
2328         return index;
2329       }
2330     }
2331     return -1;
2332   }
2334   /**
2335    * The base implementation of `_.isNaN` without support for number objects.
2336    *
2337    * @private
2338    * @param {*} value The value to check.
2339    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
2340    */
2341   function baseIsNaN(value) {
2342     return value !== value;
2343   }
2345   /**
2346    * The base implementation of `_.mean` and `_.meanBy` without support for
2347    * iteratee shorthands.
2348    *
2349    * @private
2350    * @param {Array} array The array to iterate over.
2351    * @param {Function} iteratee The function invoked per iteration.
2352    * @returns {number} Returns the mean.
2353    */
2354   function baseMean(array, iteratee) {
2355     var length = array == null ? 0 : array.length;
2356     return length ? (baseSum(array, iteratee) / length) : NAN;
2357   }
2359   /**
2360    * The base implementation of `_.property` without support for deep paths.
2361    *
2362    * @private
2363    * @param {string} key The key of the property to get.
2364    * @returns {Function} Returns the new accessor function.
2365    */
2366   function baseProperty(key) {
2367     return function(object) {
2368       return object == null ? undefined : object[key];
2369     };
2370   }
2372   /**
2373    * The base implementation of `_.propertyOf` without support for deep paths.
2374    *
2375    * @private
2376    * @param {Object} object The object to query.
2377    * @returns {Function} Returns the new accessor function.
2378    */
2379   function basePropertyOf(object) {
2380     return function(key) {
2381       return object == null ? undefined : object[key];
2382     };
2383   }
2385   /**
2386    * The base implementation of `_.reduce` and `_.reduceRight`, without support
2387    * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
2388    *
2389    * @private
2390    * @param {Array|Object} collection The collection to iterate over.
2391    * @param {Function} iteratee The function invoked per iteration.
2392    * @param {*} accumulator The initial value.
2393    * @param {boolean} initAccum Specify using the first or last element of
2394    *  `collection` as the initial value.
2395    * @param {Function} eachFunc The function to iterate over `collection`.
2396    * @returns {*} Returns the accumulated value.
2397    */
2398   function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
2399     eachFunc(collection, function(value, index, collection) {
2400       accumulator = initAccum
2401         ? (initAccum = false, value)
2402         : iteratee(accumulator, value, index, collection);
2403     });
2404     return accumulator;
2405   }
2407   /**
2408    * The base implementation of `_.sortBy` which uses `comparer` to define the
2409    * sort order of `array` and replaces criteria objects with their corresponding
2410    * values.
2411    *
2412    * @private
2413    * @param {Array} array The array to sort.
2414    * @param {Function} comparer The function to define sort order.
2415    * @returns {Array} Returns `array`.
2416    */
2417   function baseSortBy(array, comparer) {
2418     var length = array.length;
2420     array.sort(comparer);
2421     while (length--) {
2422       array[length] = array[length].value;
2423     }
2424     return array;
2425   }
2427   /**
2428    * The base implementation of `_.sum` and `_.sumBy` without support for
2429    * iteratee shorthands.
2430    *
2431    * @private
2432    * @param {Array} array The array to iterate over.
2433    * @param {Function} iteratee The function invoked per iteration.
2434    * @returns {number} Returns the sum.
2435    */
2436   function baseSum(array, iteratee) {
2437     var result,
2438         index = -1,
2439         length = array.length;
2441     while (++index < length) {
2442       var current = iteratee(array[index]);
2443       if (current !== undefined) {
2444         result = result === undefined ? current : (result + current);
2445       }
2446     }
2447     return result;
2448   }
2450   /**
2451    * The base implementation of `_.times` without support for iteratee shorthands
2452    * or max array length checks.
2453    *
2454    * @private
2455    * @param {number} n The number of times to invoke `iteratee`.
2456    * @param {Function} iteratee The function invoked per iteration.
2457    * @returns {Array} Returns the array of results.
2458    */
2459   function baseTimes(n, iteratee) {
2460     var index = -1,
2461         result = Array(n);
2463     while (++index < n) {
2464       result[index] = iteratee(index);
2465     }
2466     return result;
2467   }
2469   /**
2470    * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
2471    * of key-value pairs for `object` corresponding to the property names of `props`.
2472    *
2473    * @private
2474    * @param {Object} object The object to query.
2475    * @param {Array} props The property names to get values for.
2476    * @returns {Object} Returns the key-value pairs.
2477    */
2478   function baseToPairs(object, props) {
2479     return arrayMap(props, function(key) {
2480       return [key, object[key]];
2481     });
2482   }
2484   /**
2485    * The base implementation of `_.unary` without support for storing metadata.
2486    *
2487    * @private
2488    * @param {Function} func The function to cap arguments for.
2489    * @returns {Function} Returns the new capped function.
2490    */
2491   function baseUnary(func) {
2492     return function(value) {
2493       return func(value);
2494     };
2495   }
2497   /**
2498    * The base implementation of `_.values` and `_.valuesIn` which creates an
2499    * array of `object` property values corresponding to the property names
2500    * of `props`.
2501    *
2502    * @private
2503    * @param {Object} object The object to query.
2504    * @param {Array} props The property names to get values for.
2505    * @returns {Object} Returns the array of property values.
2506    */
2507   function baseValues(object, props) {
2508     return arrayMap(props, function(key) {
2509       return object[key];
2510     });
2511   }
2513   /**
2514    * Checks if a `cache` value for `key` exists.
2515    *
2516    * @private
2517    * @param {Object} cache The cache to query.
2518    * @param {string} key The key of the entry to check.
2519    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2520    */
2521   function cacheHas(cache, key) {
2522     return cache.has(key);
2523   }
2525   /**
2526    * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
2527    * that is not found in the character symbols.
2528    *
2529    * @private
2530    * @param {Array} strSymbols The string symbols to inspect.
2531    * @param {Array} chrSymbols The character symbols to find.
2532    * @returns {number} Returns the index of the first unmatched string symbol.
2533    */
2534   function charsStartIndex(strSymbols, chrSymbols) {
2535     var index = -1,
2536         length = strSymbols.length;
2538     while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
2539     return index;
2540   }
2542   /**
2543    * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
2544    * that is not found in the character symbols.
2545    *
2546    * @private
2547    * @param {Array} strSymbols The string symbols to inspect.
2548    * @param {Array} chrSymbols The character symbols to find.
2549    * @returns {number} Returns the index of the last unmatched string symbol.
2550    */
2551   function charsEndIndex(strSymbols, chrSymbols) {
2552     var index = strSymbols.length;
2554     while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
2555     return index;
2556   }
2558   /**
2559    * Gets the number of `placeholder` occurrences in `array`.
2560    *
2561    * @private
2562    * @param {Array} array The array to inspect.
2563    * @param {*} placeholder The placeholder to search for.
2564    * @returns {number} Returns the placeholder count.
2565    */
2566   function countHolders(array, placeholder) {
2567     var length = array.length,
2568         result = 0;
2570     while (length--) {
2571       if (array[length] === placeholder) {
2572         ++result;
2573       }
2574     }
2575     return result;
2576   }
2578   /**
2579    * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
2580    * letters to basic Latin letters.
2581    *
2582    * @private
2583    * @param {string} letter The matched letter to deburr.
2584    * @returns {string} Returns the deburred letter.
2585    */
2586   var deburrLetter = basePropertyOf(deburredLetters);
2588   /**
2589    * Used by `_.escape` to convert characters to HTML entities.
2590    *
2591    * @private
2592    * @param {string} chr The matched character to escape.
2593    * @returns {string} Returns the escaped character.
2594    */
2595   var escapeHtmlChar = basePropertyOf(htmlEscapes);
2597   /**
2598    * Used by `_.template` to escape characters for inclusion in compiled string literals.
2599    *
2600    * @private
2601    * @param {string} chr The matched character to escape.
2602    * @returns {string} Returns the escaped character.
2603    */
2604   function escapeStringChar(chr) {
2605     return '\\' + stringEscapes[chr];
2606   }
2608   /**
2609    * Gets the value at `key` of `object`.
2610    *
2611    * @private
2612    * @param {Object} [object] The object to query.
2613    * @param {string} key The key of the property to get.
2614    * @returns {*} Returns the property value.
2615    */
2616   function getValue(object, key) {
2617     return object == null ? undefined : object[key];
2618   }
2620   /**
2621    * Checks if `string` contains Unicode symbols.
2622    *
2623    * @private
2624    * @param {string} string The string to inspect.
2625    * @returns {boolean} Returns `true` if a symbol is found, else `false`.
2626    */
2627   function hasUnicode(string) {
2628     return reHasUnicode.test(string);
2629   }
2631   /**
2632    * Checks if `string` contains a word composed of Unicode symbols.
2633    *
2634    * @private
2635    * @param {string} string The string to inspect.
2636    * @returns {boolean} Returns `true` if a word is found, else `false`.
2637    */
2638   function hasUnicodeWord(string) {
2639     return reHasUnicodeWord.test(string);
2640   }
2642   /**
2643    * Converts `iterator` to an array.
2644    *
2645    * @private
2646    * @param {Object} iterator The iterator to convert.
2647    * @returns {Array} Returns the converted array.
2648    */
2649   function iteratorToArray(iterator) {
2650     var data,
2651         result = [];
2653     while (!(data = iterator.next()).done) {
2654       result.push(data.value);
2655     }
2656     return result;
2657   }
2659   /**
2660    * Converts `map` to its key-value pairs.
2661    *
2662    * @private
2663    * @param {Object} map The map to convert.
2664    * @returns {Array} Returns the key-value pairs.
2665    */
2666   function mapToArray(map) {
2667     var index = -1,
2668         result = Array(map.size);
2670     map.forEach(function(value, key) {
2671       result[++index] = [key, value];
2672     });
2673     return result;
2674   }
2676   /**
2677    * Creates a unary function that invokes `func` with its argument transformed.
2678    *
2679    * @private
2680    * @param {Function} func The function to wrap.
2681    * @param {Function} transform The argument transform.
2682    * @returns {Function} Returns the new function.
2683    */
2684   function overArg(func, transform) {
2685     return function(arg) {
2686       return func(transform(arg));
2687     };
2688   }
2690   /**
2691    * Replaces all `placeholder` elements in `array` with an internal placeholder
2692    * and returns an array of their indexes.
2693    *
2694    * @private
2695    * @param {Array} array The array to modify.
2696    * @param {*} placeholder The placeholder to replace.
2697    * @returns {Array} Returns the new array of placeholder indexes.
2698    */
2699   function replaceHolders(array, placeholder) {
2700     var index = -1,
2701         length = array.length,
2702         resIndex = 0,
2703         result = [];
2705     while (++index < length) {
2706       var value = array[index];
2707       if (value === placeholder || value === PLACEHOLDER) {
2708         array[index] = PLACEHOLDER;
2709         result[resIndex++] = index;
2710       }
2711     }
2712     return result;
2713   }
2715   /**
2716    * Gets the value at `key`, unless `key` is "__proto__".
2717    *
2718    * @private
2719    * @param {Object} object The object to query.
2720    * @param {string} key The key of the property to get.
2721    * @returns {*} Returns the property value.
2722    */
2723   function safeGet(object, key) {
2724     return key == '__proto__'
2725       ? undefined
2726       : object[key];
2727   }
2729   /**
2730    * Converts `set` to an array of its values.
2731    *
2732    * @private
2733    * @param {Object} set The set to convert.
2734    * @returns {Array} Returns the values.
2735    */
2736   function setToArray(set) {
2737     var index = -1,
2738         result = Array(set.size);
2740     set.forEach(function(value) {
2741       result[++index] = value;
2742     });
2743     return result;
2744   }
2746   /**
2747    * Converts `set` to its value-value pairs.
2748    *
2749    * @private
2750    * @param {Object} set The set to convert.
2751    * @returns {Array} Returns the value-value pairs.
2752    */
2753   function setToPairs(set) {
2754     var index = -1,
2755         result = Array(set.size);
2757     set.forEach(function(value) {
2758       result[++index] = [value, value];
2759     });
2760     return result;
2761   }
2763   /**
2764    * A specialized version of `_.indexOf` which performs strict equality
2765    * comparisons of values, i.e. `===`.
2766    *
2767    * @private
2768    * @param {Array} array The array to inspect.
2769    * @param {*} value The value to search for.
2770    * @param {number} fromIndex The index to search from.
2771    * @returns {number} Returns the index of the matched value, else `-1`.
2772    */
2773   function strictIndexOf(array, value, fromIndex) {
2774     var index = fromIndex - 1,
2775         length = array.length;
2777     while (++index < length) {
2778       if (array[index] === value) {
2779         return index;
2780       }
2781     }
2782     return -1;
2783   }
2785   /**
2786    * A specialized version of `_.lastIndexOf` which performs strict equality
2787    * comparisons of values, i.e. `===`.
2788    *
2789    * @private
2790    * @param {Array} array The array to inspect.
2791    * @param {*} value The value to search for.
2792    * @param {number} fromIndex The index to search from.
2793    * @returns {number} Returns the index of the matched value, else `-1`.
2794    */
2795   function strictLastIndexOf(array, value, fromIndex) {
2796     var index = fromIndex + 1;
2797     while (index--) {
2798       if (array[index] === value) {
2799         return index;
2800       }
2801     }
2802     return index;
2803   }
2805   /**
2806    * Gets the number of symbols in `string`.
2807    *
2808    * @private
2809    * @param {string} string The string to inspect.
2810    * @returns {number} Returns the string size.
2811    */
2812   function stringSize(string) {
2813     return hasUnicode(string)
2814       ? unicodeSize(string)
2815       : asciiSize(string);
2816   }
2818   /**
2819    * Converts `string` to an array.
2820    *
2821    * @private
2822    * @param {string} string The string to convert.
2823    * @returns {Array} Returns the converted array.
2824    */
2825   function stringToArray(string) {
2826     return hasUnicode(string)
2827       ? unicodeToArray(string)
2828       : asciiToArray(string);
2829   }
2831   /**
2832    * Used by `_.unescape` to convert HTML entities to characters.
2833    *
2834    * @private
2835    * @param {string} chr The matched character to unescape.
2836    * @returns {string} Returns the unescaped character.
2837    */
2838   var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
2840   /**
2841    * Gets the size of a Unicode `string`.
2842    *
2843    * @private
2844    * @param {string} string The string inspect.
2845    * @returns {number} Returns the string size.
2846    */
2847   function unicodeSize(string) {
2848     var result = reUnicode.lastIndex = 0;
2849     while (reUnicode.test(string)) {
2850       ++result;
2851     }
2852     return result;
2853   }
2855   /**
2856    * Converts a Unicode `string` to an array.
2857    *
2858    * @private
2859    * @param {string} string The string to convert.
2860    * @returns {Array} Returns the converted array.
2861    */
2862   function unicodeToArray(string) {
2863     return string.match(reUnicode) || [];
2864   }
2866   /**
2867    * Splits a Unicode `string` into an array of its words.
2868    *
2869    * @private
2870    * @param {string} The string to inspect.
2871    * @returns {Array} Returns the words of `string`.
2872    */
2873   function unicodeWords(string) {
2874     return string.match(reUnicodeWord) || [];
2875   }
2877   /*--------------------------------------------------------------------------*/
2879   /**
2880    * Create a new pristine `lodash` function using the `context` object.
2881    *
2882    * @static
2883    * @memberOf _
2884    * @since 1.1.0
2885    * @category Util
2886    * @param {Object} [context=root] The context object.
2887    * @returns {Function} Returns a new `lodash` function.
2888    * @example
2889    *
2890    * _.mixin({ 'foo': _.constant('foo') });
2891    *
2892    * var lodash = _.runInContext();
2893    * lodash.mixin({ 'bar': lodash.constant('bar') });
2894    *
2895    * _.isFunction(_.foo);
2896    * // => true
2897    * _.isFunction(_.bar);
2898    * // => false
2899    *
2900    * lodash.isFunction(lodash.foo);
2901    * // => false
2902    * lodash.isFunction(lodash.bar);
2903    * // => true
2904    *
2905    * // Create a suped-up `defer` in Node.js.
2906    * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
2907    */
2908   var runInContext = (function runInContext(context) {
2909     context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));
2911     /** Built-in constructor references. */
2912     var Array = context.Array,
2913         Date = context.Date,
2914         Error = context.Error,
2915         Function = context.Function,
2916         Math = context.Math,
2917         Object = context.Object,
2918         RegExp = context.RegExp,
2919         String = context.String,
2920         TypeError = context.TypeError;
2922     /** Used for built-in method references. */
2923     var arrayProto = Array.prototype,
2924         funcProto = Function.prototype,
2925         objectProto = Object.prototype;
2927     /** Used to detect overreaching core-js shims. */
2928     var coreJsData = context['__core-js_shared__'];
2930     /** Used to resolve the decompiled source of functions. */
2931     var funcToString = funcProto.toString;
2933     /** Used to check objects for own properties. */
2934     var hasOwnProperty = objectProto.hasOwnProperty;
2936     /** Used to generate unique IDs. */
2937     var idCounter = 0;
2939     /** Used to detect methods masquerading as native. */
2940     var maskSrcKey = (function() {
2941       var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
2942       return uid ? ('Symbol(src)_1.' + uid) : '';
2943     }());
2945     /**
2946      * Used to resolve the
2947      * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
2948      * of values.
2949      */
2950     var nativeObjectToString = objectProto.toString;
2952     /** Used to infer the `Object` constructor. */
2953     var objectCtorString = funcToString.call(Object);
2955     /** Used to restore the original `_` reference in `_.noConflict`. */
2956     var oldDash = root._;
2958     /** Used to detect if a method is native. */
2959     var reIsNative = RegExp('^' +
2960       funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
2961       .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
2962     );
2964     /** Built-in value references. */
2965     var Buffer = moduleExports ? context.Buffer : undefined,
2966         Symbol = context.Symbol,
2967         Uint8Array = context.Uint8Array,
2968         allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,
2969         getPrototype = overArg(Object.getPrototypeOf, Object),
2970         objectCreate = Object.create,
2971         propertyIsEnumerable = objectProto.propertyIsEnumerable,
2972         splice = arrayProto.splice,
2973         spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,
2974         symIterator = Symbol ? Symbol.iterator : undefined,
2975         symToStringTag = Symbol ? Symbol.toStringTag : undefined;
2977     var defineProperty = (function() {
2978       try {
2979         var func = getNative(Object, 'defineProperty');
2980         func({}, '', {});
2981         return func;
2982       } catch (e) {}
2983     }());
2985     /** Mocked built-ins. */
2986     var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
2987         ctxNow = Date && Date.now !== root.Date.now && Date.now,
2988         ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
2990     /* Built-in method references for those with the same name as other `lodash` methods. */
2991     var nativeCeil = Math.ceil,
2992         nativeFloor = Math.floor,
2993         nativeGetSymbols = Object.getOwnPropertySymbols,
2994         nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
2995         nativeIsFinite = context.isFinite,
2996         nativeJoin = arrayProto.join,
2997         nativeKeys = overArg(Object.keys, Object),
2998         nativeMax = Math.max,
2999         nativeMin = Math.min,
3000         nativeNow = Date.now,
3001         nativeParseInt = context.parseInt,
3002         nativeRandom = Math.random,
3003         nativeReverse = arrayProto.reverse;
3005     /* Built-in method references that are verified to be native. */
3006     var DataView = getNative(context, 'DataView'),
3007         Map = getNative(context, 'Map'),
3008         Promise = getNative(context, 'Promise'),
3009         Set = getNative(context, 'Set'),
3010         WeakMap = getNative(context, 'WeakMap'),
3011         nativeCreate = getNative(Object, 'create');
3013     /** Used to store function metadata. */
3014     var metaMap = WeakMap && new WeakMap;
3016     /** Used to lookup unminified function names. */
3017     var realNames = {};
3019     /** Used to detect maps, sets, and weakmaps. */
3020     var dataViewCtorString = toSource(DataView),
3021         mapCtorString = toSource(Map),
3022         promiseCtorString = toSource(Promise),
3023         setCtorString = toSource(Set),
3024         weakMapCtorString = toSource(WeakMap);
3026     /** Used to convert symbols to primitives and strings. */
3027     var symbolProto = Symbol ? Symbol.prototype : undefined,
3028         symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
3029         symbolToString = symbolProto ? symbolProto.toString : undefined;
3031     /*------------------------------------------------------------------------*/
3033     /**
3034      * Creates a `lodash` object which wraps `value` to enable implicit method
3035      * chain sequences. Methods that operate on and return arrays, collections,
3036      * and functions can be chained together. Methods that retrieve a single value
3037      * or may return a primitive value will automatically end the chain sequence
3038      * and return the unwrapped value. Otherwise, the value must be unwrapped
3039      * with `_#value`.
3040      *
3041      * Explicit chain sequences, which must be unwrapped with `_#value`, may be
3042      * enabled using `_.chain`.
3043      *
3044      * The execution of chained methods is lazy, that is, it's deferred until
3045      * `_#value` is implicitly or explicitly called.
3046      *
3047      * Lazy evaluation allows several methods to support shortcut fusion.
3048      * Shortcut fusion is an optimization to merge iteratee calls; this avoids
3049      * the creation of intermediate arrays and can greatly reduce the number of
3050      * iteratee executions. Sections of a chain sequence qualify for shortcut
3051      * fusion if the section is applied to an array and iteratees accept only
3052      * one argument. The heuristic for whether a section qualifies for shortcut
3053      * fusion is subject to change.
3054      *
3055      * Chaining is supported in custom builds as long as the `_#value` method is
3056      * directly or indirectly included in the build.
3057      *
3058      * In addition to lodash methods, wrappers have `Array` and `String` methods.
3059      *
3060      * The wrapper `Array` methods are:
3061      * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
3062      *
3063      * The wrapper `String` methods are:
3064      * `replace` and `split`
3065      *
3066      * The wrapper methods that support shortcut fusion are:
3067      * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
3068      * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
3069      * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
3070      *
3071      * The chainable wrapper methods are:
3072      * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
3073      * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
3074      * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
3075      * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
3076      * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
3077      * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
3078      * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
3079      * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
3080      * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
3081      * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
3082      * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
3083      * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
3084      * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
3085      * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
3086      * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
3087      * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
3088      * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
3089      * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
3090      * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
3091      * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
3092      * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
3093      * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
3094      * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
3095      * `zipObject`, `zipObjectDeep`, and `zipWith`
3096      *
3097      * The wrapper methods that are **not** chainable by default are:
3098      * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
3099      * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
3100      * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
3101      * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
3102      * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
3103      * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
3104      * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
3105      * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
3106      * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
3107      * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
3108      * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
3109      * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
3110      * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
3111      * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
3112      * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
3113      * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
3114      * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
3115      * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
3116      * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
3117      * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
3118      * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
3119      * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
3120      * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
3121      * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
3122      * `upperFirst`, `value`, and `words`
3123      *
3124      * @name _
3125      * @constructor
3126      * @category Seq
3127      * @param {*} value The value to wrap in a `lodash` instance.
3128      * @returns {Object} Returns the new `lodash` wrapper instance.
3129      * @example
3130      *
3131      * function square(n) {
3132      *   return n * n;
3133      * }
3134      *
3135      * var wrapped = _([1, 2, 3]);
3136      *
3137      * // Returns an unwrapped value.
3138      * wrapped.reduce(_.add);
3139      * // => 6
3140      *
3141      * // Returns a wrapped value.
3142      * var squares = wrapped.map(square);
3143      *
3144      * _.isArray(squares);
3145      * // => false
3146      *
3147      * _.isArray(squares.value());
3148      * // => true
3149      */
3150     function lodash(value) {
3151       if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
3152         if (value instanceof LodashWrapper) {
3153           return value;
3154         }
3155         if (hasOwnProperty.call(value, '__wrapped__')) {
3156           return wrapperClone(value);
3157         }
3158       }
3159       return new LodashWrapper(value);
3160     }
3162     /**
3163      * The base implementation of `_.create` without support for assigning
3164      * properties to the created object.
3165      *
3166      * @private
3167      * @param {Object} proto The object to inherit from.
3168      * @returns {Object} Returns the new object.
3169      */
3170     var baseCreate = (function() {
3171       function object() {}
3172       return function(proto) {
3173         if (!isObject(proto)) {
3174           return {};
3175         }
3176         if (objectCreate) {
3177           return objectCreate(proto);
3178         }
3179         object.prototype = proto;
3180         var result = new object;
3181         object.prototype = undefined;
3182         return result;
3183       };
3184     }());
3186     /**
3187      * The function whose prototype chain sequence wrappers inherit from.
3188      *
3189      * @private
3190      */
3191     function baseLodash() {
3192       // No operation performed.
3193     }
3195     /**
3196      * The base constructor for creating `lodash` wrapper objects.
3197      *
3198      * @private
3199      * @param {*} value The value to wrap.
3200      * @param {boolean} [chainAll] Enable explicit method chain sequences.
3201      */
3202     function LodashWrapper(value, chainAll) {
3203       this.__wrapped__ = value;
3204       this.__actions__ = [];
3205       this.__chain__ = !!chainAll;
3206       this.__index__ = 0;
3207       this.__values__ = undefined;
3208     }
3210     /**
3211      * By default, the template delimiters used by lodash are like those in
3212      * embedded Ruby (ERB) as well as ES2015 template strings. Change the
3213      * following template settings to use alternative delimiters.
3214      *
3215      * @static
3216      * @memberOf _
3217      * @type {Object}
3218      */
3219     lodash.templateSettings = {
3221       /**
3222        * Used to detect `data` property values to be HTML-escaped.
3223        *
3224        * @memberOf _.templateSettings
3225        * @type {RegExp}
3226        */
3227       'escape': reEscape,
3229       /**
3230        * Used to detect code to be evaluated.
3231        *
3232        * @memberOf _.templateSettings
3233        * @type {RegExp}
3234        */
3235       'evaluate': reEvaluate,
3237       /**
3238        * Used to detect `data` property values to inject.
3239        *
3240        * @memberOf _.templateSettings
3241        * @type {RegExp}
3242        */
3243       'interpolate': reInterpolate,
3245       /**
3246        * Used to reference the data object in the template text.
3247        *
3248        * @memberOf _.templateSettings
3249        * @type {string}
3250        */
3251       'variable': '',
3253       /**
3254        * Used to import variables into the compiled template.
3255        *
3256        * @memberOf _.templateSettings
3257        * @type {Object}
3258        */
3259       'imports': {
3261         /**
3262          * A reference to the `lodash` function.
3263          *
3264          * @memberOf _.templateSettings.imports
3265          * @type {Function}
3266          */
3267         '_': lodash
3268       }
3269     };
3271     // Ensure wrappers are instances of `baseLodash`.
3272     lodash.prototype = baseLodash.prototype;
3273     lodash.prototype.constructor = lodash;
3275     LodashWrapper.prototype = baseCreate(baseLodash.prototype);
3276     LodashWrapper.prototype.constructor = LodashWrapper;
3278     /*------------------------------------------------------------------------*/
3280     /**
3281      * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
3282      *
3283      * @private
3284      * @constructor
3285      * @param {*} value The value to wrap.
3286      */
3287     function LazyWrapper(value) {
3288       this.__wrapped__ = value;
3289       this.__actions__ = [];
3290       this.__dir__ = 1;
3291       this.__filtered__ = false;
3292       this.__iteratees__ = [];
3293       this.__takeCount__ = MAX_ARRAY_LENGTH;
3294       this.__views__ = [];
3295     }
3297     /**
3298      * Creates a clone of the lazy wrapper object.
3299      *
3300      * @private
3301      * @name clone
3302      * @memberOf LazyWrapper
3303      * @returns {Object} Returns the cloned `LazyWrapper` object.
3304      */
3305     function lazyClone() {
3306       var result = new LazyWrapper(this.__wrapped__);
3307       result.__actions__ = copyArray(this.__actions__);
3308       result.__dir__ = this.__dir__;
3309       result.__filtered__ = this.__filtered__;
3310       result.__iteratees__ = copyArray(this.__iteratees__);
3311       result.__takeCount__ = this.__takeCount__;
3312       result.__views__ = copyArray(this.__views__);
3313       return result;
3314     }
3316     /**
3317      * Reverses the direction of lazy iteration.
3318      *
3319      * @private
3320      * @name reverse
3321      * @memberOf LazyWrapper
3322      * @returns {Object} Returns the new reversed `LazyWrapper` object.
3323      */
3324     function lazyReverse() {
3325       if (this.__filtered__) {
3326         var result = new LazyWrapper(this);
3327         result.__dir__ = -1;
3328         result.__filtered__ = true;
3329       } else {
3330         result = this.clone();
3331         result.__dir__ *= -1;
3332       }
3333       return result;
3334     }
3336     /**
3337      * Extracts the unwrapped value from its lazy wrapper.
3338      *
3339      * @private
3340      * @name value
3341      * @memberOf LazyWrapper
3342      * @returns {*} Returns the unwrapped value.
3343      */
3344     function lazyValue() {
3345       var array = this.__wrapped__.value(),
3346           dir = this.__dir__,
3347           isArr = isArray(array),
3348           isRight = dir < 0,
3349           arrLength = isArr ? array.length : 0,
3350           view = getView(0, arrLength, this.__views__),
3351           start = view.start,
3352           end = view.end,
3353           length = end - start,
3354           index = isRight ? end : (start - 1),
3355           iteratees = this.__iteratees__,
3356           iterLength = iteratees.length,
3357           resIndex = 0,
3358           takeCount = nativeMin(length, this.__takeCount__);
3360       if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
3361         return baseWrapperValue(array, this.__actions__);
3362       }
3363       var result = [];
3365       outer:
3366       while (length-- && resIndex < takeCount) {
3367         index += dir;
3369         var iterIndex = -1,
3370             value = array[index];
3372         while (++iterIndex < iterLength) {
3373           var data = iteratees[iterIndex],
3374               iteratee = data.iteratee,
3375               type = data.type,
3376               computed = iteratee(value);
3378           if (type == LAZY_MAP_FLAG) {
3379             value = computed;
3380           } else if (!computed) {
3381             if (type == LAZY_FILTER_FLAG) {
3382               continue outer;
3383             } else {
3384               break outer;
3385             }
3386           }
3387         }
3388         result[resIndex++] = value;
3389       }
3390       return result;
3391     }
3393     // Ensure `LazyWrapper` is an instance of `baseLodash`.
3394     LazyWrapper.prototype = baseCreate(baseLodash.prototype);
3395     LazyWrapper.prototype.constructor = LazyWrapper;
3397     /*------------------------------------------------------------------------*/
3399     /**
3400      * Creates a hash object.
3401      *
3402      * @private
3403      * @constructor
3404      * @param {Array} [entries] The key-value pairs to cache.
3405      */
3406     function Hash(entries) {
3407       var index = -1,
3408           length = entries == null ? 0 : entries.length;
3410       this.clear();
3411       while (++index < length) {
3412         var entry = entries[index];
3413         this.set(entry[0], entry[1]);
3414       }
3415     }
3417     /**
3418      * Removes all key-value entries from the hash.
3419      *
3420      * @private
3421      * @name clear
3422      * @memberOf Hash
3423      */
3424     function hashClear() {
3425       this.__data__ = nativeCreate ? nativeCreate(null) : {};
3426       this.size = 0;
3427     }
3429     /**
3430      * Removes `key` and its value from the hash.
3431      *
3432      * @private
3433      * @name delete
3434      * @memberOf Hash
3435      * @param {Object} hash The hash to modify.
3436      * @param {string} key The key of the value to remove.
3437      * @returns {boolean} Returns `true` if the entry was removed, else `false`.
3438      */
3439     function hashDelete(key) {
3440       var result = this.has(key) && delete this.__data__[key];
3441       this.size -= result ? 1 : 0;
3442       return result;
3443     }
3445     /**
3446      * Gets the hash value for `key`.
3447      *
3448      * @private
3449      * @name get
3450      * @memberOf Hash
3451      * @param {string} key The key of the value to get.
3452      * @returns {*} Returns the entry value.
3453      */
3454     function hashGet(key) {
3455       var data = this.__data__;
3456       if (nativeCreate) {
3457         var result = data[key];
3458         return result === HASH_UNDEFINED ? undefined : result;
3459       }
3460       return hasOwnProperty.call(data, key) ? data[key] : undefined;
3461     }
3463     /**
3464      * Checks if a hash value for `key` exists.
3465      *
3466      * @private
3467      * @name has
3468      * @memberOf Hash
3469      * @param {string} key The key of the entry to check.
3470      * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
3471      */
3472     function hashHas(key) {
3473       var data = this.__data__;
3474       return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
3475     }
3477     /**
3478      * Sets the hash `key` to `value`.
3479      *
3480      * @private
3481      * @name set
3482      * @memberOf Hash
3483      * @param {string} key The key of the value to set.
3484      * @param {*} value The value to set.
3485      * @returns {Object} Returns the hash instance.
3486      */
3487     function hashSet(key, value) {
3488       var data = this.__data__;
3489       this.size += this.has(key) ? 0 : 1;
3490       data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
3491       return this;
3492     }
3494     // Add methods to `Hash`.
3495     Hash.prototype.clear = hashClear;
3496     Hash.prototype['delete'] = hashDelete;
3497     Hash.prototype.get = hashGet;
3498     Hash.prototype.has = hashHas;
3499     Hash.prototype.set = hashSet;
3501     /*------------------------------------------------------------------------*/
3503     /**
3504      * Creates an list cache object.
3505      *
3506      * @private
3507      * @constructor
3508      * @param {Array} [entries] The key-value pairs to cache.
3509      */
3510     function ListCache(entries) {
3511       var index = -1,
3512           length = entries == null ? 0 : entries.length;
3514       this.clear();
3515       while (++index < length) {
3516         var entry = entries[index];
3517         this.set(entry[0], entry[1]);
3518       }
3519     }
3521     /**
3522      * Removes all key-value entries from the list cache.
3523      *
3524      * @private
3525      * @name clear
3526      * @memberOf ListCache
3527      */
3528     function listCacheClear() {
3529       this.__data__ = [];
3530       this.size = 0;
3531     }
3533     /**
3534      * Removes `key` and its value from the list cache.
3535      *
3536      * @private
3537      * @name delete
3538      * @memberOf ListCache
3539      * @param {string} key The key of the value to remove.
3540      * @returns {boolean} Returns `true` if the entry was removed, else `false`.
3541      */
3542     function listCacheDelete(key) {
3543       var data = this.__data__,
3544           index = assocIndexOf(data, key);
3546       if (index < 0) {
3547         return false;
3548       }
3549       var lastIndex = data.length - 1;
3550       if (index == lastIndex) {
3551         data.pop();
3552       } else {
3553         splice.call(data, index, 1);
3554       }
3555       --this.size;
3556       return true;
3557     }
3559     /**
3560      * Gets the list cache value for `key`.
3561      *
3562      * @private
3563      * @name get
3564      * @memberOf ListCache
3565      * @param {string} key The key of the value to get.
3566      * @returns {*} Returns the entry value.
3567      */
3568     function listCacheGet(key) {
3569       var data = this.__data__,
3570           index = assocIndexOf(data, key);
3572       return index < 0 ? undefined : data[index][1];
3573     }
3575     /**
3576      * Checks if a list cache value for `key` exists.
3577      *
3578      * @private
3579      * @name has
3580      * @memberOf ListCache
3581      * @param {string} key The key of the entry to check.
3582      * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
3583      */
3584     function listCacheHas(key) {
3585       return assocIndexOf(this.__data__, key) > -1;
3586     }
3588     /**
3589      * Sets the list cache `key` to `value`.
3590      *
3591      * @private
3592      * @name set
3593      * @memberOf ListCache
3594      * @param {string} key The key of the value to set.
3595      * @param {*} value The value to set.
3596      * @returns {Object} Returns the list cache instance.
3597      */
3598     function listCacheSet(key, value) {
3599       var data = this.__data__,
3600           index = assocIndexOf(data, key);
3602       if (index < 0) {
3603         ++this.size;
3604         data.push([key, value]);
3605       } else {
3606         data[index][1] = value;
3607       }
3608       return this;
3609     }
3611     // Add methods to `ListCache`.
3612     ListCache.prototype.clear = listCacheClear;
3613     ListCache.prototype['delete'] = listCacheDelete;
3614     ListCache.prototype.get = listCacheGet;
3615     ListCache.prototype.has = listCacheHas;
3616     ListCache.prototype.set = listCacheSet;
3618     /*------------------------------------------------------------------------*/
3620     /**
3621      * Creates a map cache object to store key-value pairs.
3622      *
3623      * @private
3624      * @constructor
3625      * @param {Array} [entries] The key-value pairs to cache.
3626      */
3627     function MapCache(entries) {
3628       var index = -1,
3629           length = entries == null ? 0 : entries.length;
3631       this.clear();
3632       while (++index < length) {
3633         var entry = entries[index];
3634         this.set(entry[0], entry[1]);
3635       }
3636     }
3638     /**
3639      * Removes all key-value entries from the map.
3640      *
3641      * @private
3642      * @name clear
3643      * @memberOf MapCache
3644      */
3645     function mapCacheClear() {
3646       this.size = 0;
3647       this.__data__ = {
3648         'hash': new Hash,
3649         'map': new (Map || ListCache),
3650         'string': new Hash
3651       };
3652     }
3654     /**
3655      * Removes `key` and its value from the map.
3656      *
3657      * @private
3658      * @name delete
3659      * @memberOf MapCache
3660      * @param {string} key The key of the value to remove.
3661      * @returns {boolean} Returns `true` if the entry was removed, else `false`.
3662      */
3663     function mapCacheDelete(key) {
3664       var result = getMapData(this, key)['delete'](key);
3665       this.size -= result ? 1 : 0;
3666       return result;
3667     }
3669     /**
3670      * Gets the map value for `key`.
3671      *
3672      * @private
3673      * @name get
3674      * @memberOf MapCache
3675      * @param {string} key The key of the value to get.
3676      * @returns {*} Returns the entry value.
3677      */
3678     function mapCacheGet(key) {
3679       return getMapData(this, key).get(key);
3680     }
3682     /**
3683      * Checks if a map value for `key` exists.
3684      *
3685      * @private
3686      * @name has
3687      * @memberOf MapCache
3688      * @param {string} key The key of the entry to check.
3689      * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
3690      */
3691     function mapCacheHas(key) {
3692       return getMapData(this, key).has(key);
3693     }
3695     /**
3696      * Sets the map `key` to `value`.
3697      *
3698      * @private
3699      * @name set
3700      * @memberOf MapCache
3701      * @param {string} key The key of the value to set.
3702      * @param {*} value The value to set.
3703      * @returns {Object} Returns the map cache instance.
3704      */
3705     function mapCacheSet(key, value) {
3706       var data = getMapData(this, key),
3707           size = data.size;
3709       data.set(key, value);
3710       this.size += data.size == size ? 0 : 1;
3711       return this;
3712     }
3714     // Add methods to `MapCache`.
3715     MapCache.prototype.clear = mapCacheClear;
3716     MapCache.prototype['delete'] = mapCacheDelete;
3717     MapCache.prototype.get = mapCacheGet;
3718     MapCache.prototype.has = mapCacheHas;
3719     MapCache.prototype.set = mapCacheSet;
3721     /*------------------------------------------------------------------------*/
3723     /**
3724      *
3725      * Creates an array cache object to store unique values.
3726      *
3727      * @private
3728      * @constructor
3729      * @param {Array} [values] The values to cache.
3730      */
3731     function SetCache(values) {
3732       var index = -1,
3733           length = values == null ? 0 : values.length;
3735       this.__data__ = new MapCache;
3736       while (++index < length) {
3737         this.add(values[index]);
3738       }
3739     }
3741     /**
3742      * Adds `value` to the array cache.
3743      *
3744      * @private
3745      * @name add
3746      * @memberOf SetCache
3747      * @alias push
3748      * @param {*} value The value to cache.
3749      * @returns {Object} Returns the cache instance.
3750      */
3751     function setCacheAdd(value) {
3752       this.__data__.set(value, HASH_UNDEFINED);
3753       return this;
3754     }
3756     /**
3757      * Checks if `value` is in the array cache.
3758      *
3759      * @private
3760      * @name has
3761      * @memberOf SetCache
3762      * @param {*} value The value to search for.
3763      * @returns {number} Returns `true` if `value` is found, else `false`.
3764      */
3765     function setCacheHas(value) {
3766       return this.__data__.has(value);
3767     }
3769     // Add methods to `SetCache`.
3770     SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
3771     SetCache.prototype.has = setCacheHas;
3773     /*------------------------------------------------------------------------*/
3775     /**
3776      * Creates a stack cache object to store key-value pairs.
3777      *
3778      * @private
3779      * @constructor
3780      * @param {Array} [entries] The key-value pairs to cache.
3781      */
3782     function Stack(entries) {
3783       var data = this.__data__ = new ListCache(entries);
3784       this.size = data.size;
3785     }
3787     /**
3788      * Removes all key-value entries from the stack.
3789      *
3790      * @private
3791      * @name clear
3792      * @memberOf Stack
3793      */
3794     function stackClear() {
3795       this.__data__ = new ListCache;
3796       this.size = 0;
3797     }
3799     /**
3800      * Removes `key` and its value from the stack.
3801      *
3802      * @private
3803      * @name delete
3804      * @memberOf Stack
3805      * @param {string} key The key of the value to remove.
3806      * @returns {boolean} Returns `true` if the entry was removed, else `false`.
3807      */
3808     function stackDelete(key) {
3809       var data = this.__data__,
3810           result = data['delete'](key);
3812       this.size = data.size;
3813       return result;
3814     }
3816     /**
3817      * Gets the stack value for `key`.
3818      *
3819      * @private
3820      * @name get
3821      * @memberOf Stack
3822      * @param {string} key The key of the value to get.
3823      * @returns {*} Returns the entry value.
3824      */
3825     function stackGet(key) {
3826       return this.__data__.get(key);
3827     }
3829     /**
3830      * Checks if a stack value for `key` exists.
3831      *
3832      * @private
3833      * @name has
3834      * @memberOf Stack
3835      * @param {string} key The key of the entry to check.
3836      * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
3837      */
3838     function stackHas(key) {
3839       return this.__data__.has(key);
3840     }
3842     /**
3843      * Sets the stack `key` to `value`.
3844      *
3845      * @private
3846      * @name set
3847      * @memberOf Stack
3848      * @param {string} key The key of the value to set.
3849      * @param {*} value The value to set.
3850      * @returns {Object} Returns the stack cache instance.
3851      */
3852     function stackSet(key, value) {
3853       var data = this.__data__;
3854       if (data instanceof ListCache) {
3855         var pairs = data.__data__;
3856         if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
3857           pairs.push([key, value]);
3858           this.size = ++data.size;
3859           return this;
3860         }
3861         data = this.__data__ = new MapCache(pairs);
3862       }
3863       data.set(key, value);
3864       this.size = data.size;
3865       return this;
3866     }
3868     // Add methods to `Stack`.
3869     Stack.prototype.clear = stackClear;
3870     Stack.prototype['delete'] = stackDelete;
3871     Stack.prototype.get = stackGet;
3872     Stack.prototype.has = stackHas;
3873     Stack.prototype.set = stackSet;
3875     /*------------------------------------------------------------------------*/
3877     /**
3878      * Creates an array of the enumerable property names of the array-like `value`.
3879      *
3880      * @private
3881      * @param {*} value The value to query.
3882      * @param {boolean} inherited Specify returning inherited property names.
3883      * @returns {Array} Returns the array of property names.
3884      */
3885     function arrayLikeKeys(value, inherited) {
3886       var isArr = isArray(value),
3887           isArg = !isArr && isArguments(value),
3888           isBuff = !isArr && !isArg && isBuffer(value),
3889           isType = !isArr && !isArg && !isBuff && isTypedArray(value),
3890           skipIndexes = isArr || isArg || isBuff || isType,
3891           result = skipIndexes ? baseTimes(value.length, String) : [],
3892           length = result.length;
3894       for (var key in value) {
3895         if ((inherited || hasOwnProperty.call(value, key)) &&
3896             !(skipIndexes && (
3897                // Safari 9 has enumerable `arguments.length` in strict mode.
3898                key == 'length' ||
3899                // Node.js 0.10 has enumerable non-index properties on buffers.
3900                (isBuff && (key == 'offset' || key == 'parent')) ||
3901                // PhantomJS 2 has enumerable non-index properties on typed arrays.
3902                (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
3903                // Skip index properties.
3904                isIndex(key, length)
3905             ))) {
3906           result.push(key);
3907         }
3908       }
3909       return result;
3910     }
3912     /**
3913      * A specialized version of `_.sample` for arrays.
3914      *
3915      * @private
3916      * @param {Array} array The array to sample.
3917      * @returns {*} Returns the random element.
3918      */
3919     function arraySample(array) {
3920       var length = array.length;
3921       return length ? array[baseRandom(0, length - 1)] : undefined;
3922     }
3924     /**
3925      * A specialized version of `_.sampleSize` for arrays.
3926      *
3927      * @private
3928      * @param {Array} array The array to sample.
3929      * @param {number} n The number of elements to sample.
3930      * @returns {Array} Returns the random elements.
3931      */
3932     function arraySampleSize(array, n) {
3933       return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
3934     }
3936     /**
3937      * A specialized version of `_.shuffle` for arrays.
3938      *
3939      * @private
3940      * @param {Array} array The array to shuffle.
3941      * @returns {Array} Returns the new shuffled array.
3942      */
3943     function arrayShuffle(array) {
3944       return shuffleSelf(copyArray(array));
3945     }
3947     /**
3948      * This function is like `assignValue` except that it doesn't assign
3949      * `undefined` values.
3950      *
3951      * @private
3952      * @param {Object} object The object to modify.
3953      * @param {string} key The key of the property to assign.
3954      * @param {*} value The value to assign.
3955      */
3956     function assignMergeValue(object, key, value) {
3957       if ((value !== undefined && !eq(object[key], value)) ||
3958           (value === undefined && !(key in object))) {
3959         baseAssignValue(object, key, value);
3960       }
3961     }
3963     /**
3964      * Assigns `value` to `key` of `object` if the existing value is not equivalent
3965      * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
3966      * for equality comparisons.
3967      *
3968      * @private
3969      * @param {Object} object The object to modify.
3970      * @param {string} key The key of the property to assign.
3971      * @param {*} value The value to assign.
3972      */
3973     function assignValue(object, key, value) {
3974       var objValue = object[key];
3975       if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
3976           (value === undefined && !(key in object))) {
3977         baseAssignValue(object, key, value);
3978       }
3979     }
3981     /**
3982      * Gets the index at which the `key` is found in `array` of key-value pairs.
3983      *
3984      * @private
3985      * @param {Array} array The array to inspect.
3986      * @param {*} key The key to search for.
3987      * @returns {number} Returns the index of the matched value, else `-1`.
3988      */
3989     function assocIndexOf(array, key) {
3990       var length = array.length;
3991       while (length--) {
3992         if (eq(array[length][0], key)) {
3993           return length;
3994         }
3995       }
3996       return -1;
3997     }
3999     /**
4000      * Aggregates elements of `collection` on `accumulator` with keys transformed
4001      * by `iteratee` and values set by `setter`.
4002      *
4003      * @private
4004      * @param {Array|Object} collection The collection to iterate over.
4005      * @param {Function} setter The function to set `accumulator` values.
4006      * @param {Function} iteratee The iteratee to transform keys.
4007      * @param {Object} accumulator The initial aggregated object.
4008      * @returns {Function} Returns `accumulator`.
4009      */
4010     function baseAggregator(collection, setter, iteratee, accumulator) {
4011       baseEach(collection, function(value, key, collection) {
4012         setter(accumulator, value, iteratee(value), collection);
4013       });
4014       return accumulator;
4015     }
4017     /**
4018      * The base implementation of `_.assign` without support for multiple sources
4019      * or `customizer` functions.
4020      *
4021      * @private
4022      * @param {Object} object The destination object.
4023      * @param {Object} source The source object.
4024      * @returns {Object} Returns `object`.
4025      */
4026     function baseAssign(object, source) {
4027       return object && copyObject(source, keys(source), object);
4028     }
4030     /**
4031      * The base implementation of `_.assignIn` without support for multiple sources
4032      * or `customizer` functions.
4033      *
4034      * @private
4035      * @param {Object} object The destination object.
4036      * @param {Object} source The source object.
4037      * @returns {Object} Returns `object`.
4038      */
4039     function baseAssignIn(object, source) {
4040       return object && copyObject(source, keysIn(source), object);
4041     }
4043     /**
4044      * The base implementation of `assignValue` and `assignMergeValue` without
4045      * value checks.
4046      *
4047      * @private
4048      * @param {Object} object The object to modify.
4049      * @param {string} key The key of the property to assign.
4050      * @param {*} value The value to assign.
4051      */
4052     function baseAssignValue(object, key, value) {
4053       if (key == '__proto__' && defineProperty) {
4054         defineProperty(object, key, {
4055           'configurable': true,
4056           'enumerable': true,
4057           'value': value,
4058           'writable': true
4059         });
4060       } else {
4061         object[key] = value;
4062       }
4063     }
4065     /**
4066      * The base implementation of `_.at` without support for individual paths.
4067      *
4068      * @private
4069      * @param {Object} object The object to iterate over.
4070      * @param {string[]} paths The property paths to pick.
4071      * @returns {Array} Returns the picked elements.
4072      */
4073     function baseAt(object, paths) {
4074       var index = -1,
4075           length = paths.length,
4076           result = Array(length),
4077           skip = object == null;
4079       while (++index < length) {
4080         result[index] = skip ? undefined : get(object, paths[index]);
4081       }
4082       return result;
4083     }
4085     /**
4086      * The base implementation of `_.clamp` which doesn't coerce arguments.
4087      *
4088      * @private
4089      * @param {number} number The number to clamp.
4090      * @param {number} [lower] The lower bound.
4091      * @param {number} upper The upper bound.
4092      * @returns {number} Returns the clamped number.
4093      */
4094     function baseClamp(number, lower, upper) {
4095       if (number === number) {
4096         if (upper !== undefined) {
4097           number = number <= upper ? number : upper;
4098         }
4099         if (lower !== undefined) {
4100           number = number >= lower ? number : lower;
4101         }
4102       }
4103       return number;
4104     }
4106     /**
4107      * The base implementation of `_.clone` and `_.cloneDeep` which tracks
4108      * traversed objects.
4109      *
4110      * @private
4111      * @param {*} value The value to clone.
4112      * @param {boolean} bitmask The bitmask flags.
4113      *  1 - Deep clone
4114      *  2 - Flatten inherited properties
4115      *  4 - Clone symbols
4116      * @param {Function} [customizer] The function to customize cloning.
4117      * @param {string} [key] The key of `value`.
4118      * @param {Object} [object] The parent object of `value`.
4119      * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
4120      * @returns {*} Returns the cloned value.
4121      */
4122     function baseClone(value, bitmask, customizer, key, object, stack) {
4123       var result,
4124           isDeep = bitmask & CLONE_DEEP_FLAG,
4125           isFlat = bitmask & CLONE_FLAT_FLAG,
4126           isFull = bitmask & CLONE_SYMBOLS_FLAG;
4128       if (customizer) {
4129         result = object ? customizer(value, key, object, stack) : customizer(value);
4130       }
4131       if (result !== undefined) {
4132         return result;
4133       }
4134       if (!isObject(value)) {
4135         return value;
4136       }
4137       var isArr = isArray(value);
4138       if (isArr) {
4139         result = initCloneArray(value);
4140         if (!isDeep) {
4141           return copyArray(value, result);
4142         }
4143       } else {
4144         var tag = getTag(value),
4145             isFunc = tag == funcTag || tag == genTag;
4147         if (isBuffer(value)) {
4148           return cloneBuffer(value, isDeep);
4149         }
4150         if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
4151           result = (isFlat || isFunc) ? {} : initCloneObject(value);
4152           if (!isDeep) {
4153             return isFlat
4154               ? copySymbolsIn(value, baseAssignIn(result, value))
4155               : copySymbols(value, baseAssign(result, value));
4156           }
4157         } else {
4158           if (!cloneableTags[tag]) {
4159             return object ? value : {};
4160           }
4161           result = initCloneByTag(value, tag, isDeep);
4162         }
4163       }
4164       // Check for circular references and return its corresponding clone.
4165       stack || (stack = new Stack);
4166       var stacked = stack.get(value);
4167       if (stacked) {
4168         return stacked;
4169       }
4170       stack.set(value, result);
4172       if (isSet(value)) {
4173         value.forEach(function(subValue) {
4174           result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
4175         });
4177         return result;
4178       }
4180       if (isMap(value)) {
4181         value.forEach(function(subValue, key) {
4182           result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
4183         });
4185         return result;
4186       }
4188       var keysFunc = isFull
4189         ? (isFlat ? getAllKeysIn : getAllKeys)
4190         : (isFlat ? keysIn : keys);
4192       var props = isArr ? undefined : keysFunc(value);
4193       arrayEach(props || value, function(subValue, key) {
4194         if (props) {
4195           key = subValue;
4196           subValue = value[key];
4197         }
4198         // Recursively populate clone (susceptible to call stack limits).
4199         assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
4200       });
4201       return result;
4202     }
4204     /**
4205      * The base implementation of `_.conforms` which doesn't clone `source`.
4206      *
4207      * @private
4208      * @param {Object} source The object of property predicates to conform to.
4209      * @returns {Function} Returns the new spec function.
4210      */
4211     function baseConforms(source) {
4212       var props = keys(source);
4213       return function(object) {
4214         return baseConformsTo(object, source, props);
4215       };
4216     }
4218     /**
4219      * The base implementation of `_.conformsTo` which accepts `props` to check.
4220      *
4221      * @private
4222      * @param {Object} object The object to inspect.
4223      * @param {Object} source The object of property predicates to conform to.
4224      * @returns {boolean} Returns `true` if `object` conforms, else `false`.
4225      */
4226     function baseConformsTo(object, source, props) {
4227       var length = props.length;
4228       if (object == null) {
4229         return !length;
4230       }
4231       object = Object(object);
4232       while (length--) {
4233         var key = props[length],
4234             predicate = source[key],
4235             value = object[key];
4237         if ((value === undefined && !(key in object)) || !predicate(value)) {
4238           return false;
4239         }
4240       }
4241       return true;
4242     }
4244     /**
4245      * The base implementation of `_.delay` and `_.defer` which accepts `args`
4246      * to provide to `func`.
4247      *
4248      * @private
4249      * @param {Function} func The function to delay.
4250      * @param {number} wait The number of milliseconds to delay invocation.
4251      * @param {Array} args The arguments to provide to `func`.
4252      * @returns {number|Object} Returns the timer id or timeout object.
4253      */
4254     function baseDelay(func, wait, args) {
4255       if (typeof func != 'function') {
4256         throw new TypeError(FUNC_ERROR_TEXT);
4257       }
4258       return setTimeout(function() { func.apply(undefined, args); }, wait);
4259     }
4261     /**
4262      * The base implementation of methods like `_.difference` without support
4263      * for excluding multiple arrays or iteratee shorthands.
4264      *
4265      * @private
4266      * @param {Array} array The array to inspect.
4267      * @param {Array} values The values to exclude.
4268      * @param {Function} [iteratee] The iteratee invoked per element.
4269      * @param {Function} [comparator] The comparator invoked per element.
4270      * @returns {Array} Returns the new array of filtered values.
4271      */
4272     function baseDifference(array, values, iteratee, comparator) {
4273       var index = -1,
4274           includes = arrayIncludes,
4275           isCommon = true,
4276           length = array.length,
4277           result = [],
4278           valuesLength = values.length;
4280       if (!length) {
4281         return result;
4282       }
4283       if (iteratee) {
4284         values = arrayMap(values, baseUnary(iteratee));
4285       }
4286       if (comparator) {
4287         includes = arrayIncludesWith;
4288         isCommon = false;
4289       }
4290       else if (values.length >= LARGE_ARRAY_SIZE) {
4291         includes = cacheHas;
4292         isCommon = false;
4293         values = new SetCache(values);
4294       }
4295       outer:
4296       while (++index < length) {
4297         var value = array[index],
4298             computed = iteratee == null ? value : iteratee(value);
4300         value = (comparator || value !== 0) ? value : 0;
4301         if (isCommon && computed === computed) {
4302           var valuesIndex = valuesLength;
4303           while (valuesIndex--) {
4304             if (values[valuesIndex] === computed) {
4305               continue outer;
4306             }
4307           }
4308           result.push(value);
4309         }
4310         else if (!includes(values, computed, comparator)) {
4311           result.push(value);
4312         }
4313       }
4314       return result;
4315     }
4317     /**
4318      * The base implementation of `_.forEach` without support for iteratee shorthands.
4319      *
4320      * @private
4321      * @param {Array|Object} collection The collection to iterate over.
4322      * @param {Function} iteratee The function invoked per iteration.
4323      * @returns {Array|Object} Returns `collection`.
4324      */
4325     var baseEach = createBaseEach(baseForOwn);
4327     /**
4328      * The base implementation of `_.forEachRight` without support for iteratee shorthands.
4329      *
4330      * @private
4331      * @param {Array|Object} collection The collection to iterate over.
4332      * @param {Function} iteratee The function invoked per iteration.
4333      * @returns {Array|Object} Returns `collection`.
4334      */
4335     var baseEachRight = createBaseEach(baseForOwnRight, true);
4337     /**
4338      * The base implementation of `_.every` without support for iteratee shorthands.
4339      *
4340      * @private
4341      * @param {Array|Object} collection The collection to iterate over.
4342      * @param {Function} predicate The function invoked per iteration.
4343      * @returns {boolean} Returns `true` if all elements pass the predicate check,
4344      *  else `false`
4345      */
4346     function baseEvery(collection, predicate) {
4347       var result = true;
4348       baseEach(collection, function(value, index, collection) {
4349         result = !!predicate(value, index, collection);
4350         return result;
4351       });
4352       return result;
4353     }
4355     /**
4356      * The base implementation of methods like `_.max` and `_.min` which accepts a
4357      * `comparator` to determine the extremum value.
4358      *
4359      * @private
4360      * @param {Array} array The array to iterate over.
4361      * @param {Function} iteratee The iteratee invoked per iteration.
4362      * @param {Function} comparator The comparator used to compare values.
4363      * @returns {*} Returns the extremum value.
4364      */
4365     function baseExtremum(array, iteratee, comparator) {
4366       var index = -1,
4367           length = array.length;
4369       while (++index < length) {
4370         var value = array[index],
4371             current = iteratee(value);
4373         if (current != null && (computed === undefined
4374               ? (current === current && !isSymbol(current))
4375               : comparator(current, computed)
4376             )) {
4377           var computed = current,
4378               result = value;
4379         }
4380       }
4381       return result;
4382     }
4384     /**
4385      * The base implementation of `_.fill` without an iteratee call guard.
4386      *
4387      * @private
4388      * @param {Array} array The array to fill.
4389      * @param {*} value The value to fill `array` with.
4390      * @param {number} [start=0] The start position.
4391      * @param {number} [end=array.length] The end position.
4392      * @returns {Array} Returns `array`.
4393      */
4394     function baseFill(array, value, start, end) {
4395       var length = array.length;
4397       start = toInteger(start);
4398       if (start < 0) {
4399         start = -start > length ? 0 : (length + start);
4400       }
4401       end = (end === undefined || end > length) ? length : toInteger(end);
4402       if (end < 0) {
4403         end += length;
4404       }
4405       end = start > end ? 0 : toLength(end);
4406       while (start < end) {
4407         array[start++] = value;
4408       }
4409       return array;
4410     }
4412     /**
4413      * The base implementation of `_.filter` without support for iteratee shorthands.
4414      *
4415      * @private
4416      * @param {Array|Object} collection The collection to iterate over.
4417      * @param {Function} predicate The function invoked per iteration.
4418      * @returns {Array} Returns the new filtered array.
4419      */
4420     function baseFilter(collection, predicate) {
4421       var result = [];
4422       baseEach(collection, function(value, index, collection) {
4423         if (predicate(value, index, collection)) {
4424           result.push(value);
4425         }
4426       });
4427       return result;
4428     }
4430     /**
4431      * The base implementation of `_.flatten` with support for restricting flattening.
4432      *
4433      * @private
4434      * @param {Array} array The array to flatten.
4435      * @param {number} depth The maximum recursion depth.
4436      * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
4437      * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
4438      * @param {Array} [result=[]] The initial result value.
4439      * @returns {Array} Returns the new flattened array.
4440      */
4441     function baseFlatten(array, depth, predicate, isStrict, result) {
4442       var index = -1,
4443           length = array.length;
4445       predicate || (predicate = isFlattenable);
4446       result || (result = []);
4448       while (++index < length) {
4449         var value = array[index];
4450         if (depth > 0 && predicate(value)) {
4451           if (depth > 1) {
4452             // Recursively flatten arrays (susceptible to call stack limits).
4453             baseFlatten(value, depth - 1, predicate, isStrict, result);
4454           } else {
4455             arrayPush(result, value);
4456           }
4457         } else if (!isStrict) {
4458           result[result.length] = value;
4459         }
4460       }
4461       return result;
4462     }
4464     /**
4465      * The base implementation of `baseForOwn` which iterates over `object`
4466      * properties returned by `keysFunc` and invokes `iteratee` for each property.
4467      * Iteratee functions may exit iteration early by explicitly returning `false`.
4468      *
4469      * @private
4470      * @param {Object} object The object to iterate over.
4471      * @param {Function} iteratee The function invoked per iteration.
4472      * @param {Function} keysFunc The function to get the keys of `object`.
4473      * @returns {Object} Returns `object`.
4474      */
4475     var baseFor = createBaseFor();
4477     /**
4478      * This function is like `baseFor` except that it iterates over properties
4479      * in the opposite order.
4480      *
4481      * @private
4482      * @param {Object} object The object to iterate over.
4483      * @param {Function} iteratee The function invoked per iteration.
4484      * @param {Function} keysFunc The function to get the keys of `object`.
4485      * @returns {Object} Returns `object`.
4486      */
4487     var baseForRight = createBaseFor(true);
4489     /**
4490      * The base implementation of `_.forOwn` without support for iteratee shorthands.
4491      *
4492      * @private
4493      * @param {Object} object The object to iterate over.
4494      * @param {Function} iteratee The function invoked per iteration.
4495      * @returns {Object} Returns `object`.
4496      */
4497     function baseForOwn(object, iteratee) {
4498       return object && baseFor(object, iteratee, keys);
4499     }
4501     /**
4502      * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
4503      *
4504      * @private
4505      * @param {Object} object The object to iterate over.
4506      * @param {Function} iteratee The function invoked per iteration.
4507      * @returns {Object} Returns `object`.
4508      */
4509     function baseForOwnRight(object, iteratee) {
4510       return object && baseForRight(object, iteratee, keys);
4511     }
4513     /**
4514      * The base implementation of `_.functions` which creates an array of
4515      * `object` function property names filtered from `props`.
4516      *
4517      * @private
4518      * @param {Object} object The object to inspect.
4519      * @param {Array} props The property names to filter.
4520      * @returns {Array} Returns the function names.
4521      */
4522     function baseFunctions(object, props) {
4523       return arrayFilter(props, function(key) {
4524         return isFunction(object[key]);
4525       });
4526     }
4528     /**
4529      * The base implementation of `_.get` without support for default values.
4530      *
4531      * @private
4532      * @param {Object} object The object to query.
4533      * @param {Array|string} path The path of the property to get.
4534      * @returns {*} Returns the resolved value.
4535      */
4536     function baseGet(object, path) {
4537       path = castPath(path, object);
4539       var index = 0,
4540           length = path.length;
4542       while (object != null && index < length) {
4543         object = object[toKey(path[index++])];
4544       }
4545       return (index && index == length) ? object : undefined;
4546     }
4548     /**
4549      * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
4550      * `keysFunc` and `symbolsFunc` to get the enumerable property names and
4551      * symbols of `object`.
4552      *
4553      * @private
4554      * @param {Object} object The object to query.
4555      * @param {Function} keysFunc The function to get the keys of `object`.
4556      * @param {Function} symbolsFunc The function to get the symbols of `object`.
4557      * @returns {Array} Returns the array of property names and symbols.
4558      */
4559     function baseGetAllKeys(object, keysFunc, symbolsFunc) {
4560       var result = keysFunc(object);
4561       return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
4562     }
4564     /**
4565      * The base implementation of `getTag` without fallbacks for buggy environments.
4566      *
4567      * @private
4568      * @param {*} value The value to query.
4569      * @returns {string} Returns the `toStringTag`.
4570      */
4571     function baseGetTag(value) {
4572       if (value == null) {
4573         return value === undefined ? undefinedTag : nullTag;
4574       }
4575       return (symToStringTag && symToStringTag in Object(value))
4576         ? getRawTag(value)
4577         : objectToString(value);
4578     }
4580     /**
4581      * The base implementation of `_.gt` which doesn't coerce arguments.
4582      *
4583      * @private
4584      * @param {*} value The value to compare.
4585      * @param {*} other The other value to compare.
4586      * @returns {boolean} Returns `true` if `value` is greater than `other`,
4587      *  else `false`.
4588      */
4589     function baseGt(value, other) {
4590       return value > other;
4591     }
4593     /**
4594      * The base implementation of `_.has` without support for deep paths.
4595      *
4596      * @private
4597      * @param {Object} [object] The object to query.
4598      * @param {Array|string} key The key to check.
4599      * @returns {boolean} Returns `true` if `key` exists, else `false`.
4600      */
4601     function baseHas(object, key) {
4602       return object != null && hasOwnProperty.call(object, key);
4603     }
4605     /**
4606      * The base implementation of `_.hasIn` without support for deep paths.
4607      *
4608      * @private
4609      * @param {Object} [object] The object to query.
4610      * @param {Array|string} key The key to check.
4611      * @returns {boolean} Returns `true` if `key` exists, else `false`.
4612      */
4613     function baseHasIn(object, key) {
4614       return object != null && key in Object(object);
4615     }
4617     /**
4618      * The base implementation of `_.inRange` which doesn't coerce arguments.
4619      *
4620      * @private
4621      * @param {number} number The number to check.
4622      * @param {number} start The start of the range.
4623      * @param {number} end The end of the range.
4624      * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
4625      */
4626     function baseInRange(number, start, end) {
4627       return number >= nativeMin(start, end) && number < nativeMax(start, end);
4628     }
4630     /**
4631      * The base implementation of methods like `_.intersection`, without support
4632      * for iteratee shorthands, that accepts an array of arrays to inspect.
4633      *
4634      * @private
4635      * @param {Array} arrays The arrays to inspect.
4636      * @param {Function} [iteratee] The iteratee invoked per element.
4637      * @param {Function} [comparator] The comparator invoked per element.
4638      * @returns {Array} Returns the new array of shared values.
4639      */
4640     function baseIntersection(arrays, iteratee, comparator) {
4641       var includes = comparator ? arrayIncludesWith : arrayIncludes,
4642           length = arrays[0].length,
4643           othLength = arrays.length,
4644           othIndex = othLength,
4645           caches = Array(othLength),
4646           maxLength = Infinity,
4647           result = [];
4649       while (othIndex--) {
4650         var array = arrays[othIndex];
4651         if (othIndex && iteratee) {
4652           array = arrayMap(array, baseUnary(iteratee));
4653         }
4654         maxLength = nativeMin(array.length, maxLength);
4655         caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
4656           ? new SetCache(othIndex && array)
4657           : undefined;
4658       }
4659       array = arrays[0];
4661       var index = -1,
4662           seen = caches[0];
4664       outer:
4665       while (++index < length && result.length < maxLength) {
4666         var value = array[index],
4667             computed = iteratee ? iteratee(value) : value;
4669         value = (comparator || value !== 0) ? value : 0;
4670         if (!(seen
4671               ? cacheHas(seen, computed)
4672               : includes(result, computed, comparator)
4673             )) {
4674           othIndex = othLength;
4675           while (--othIndex) {
4676             var cache = caches[othIndex];
4677             if (!(cache
4678                   ? cacheHas(cache, computed)
4679                   : includes(arrays[othIndex], computed, comparator))
4680                 ) {
4681               continue outer;
4682             }
4683           }
4684           if (seen) {
4685             seen.push(computed);
4686           }
4687           result.push(value);
4688         }
4689       }
4690       return result;
4691     }
4693     /**
4694      * The base implementation of `_.invert` and `_.invertBy` which inverts
4695      * `object` with values transformed by `iteratee` and set by `setter`.
4696      *
4697      * @private
4698      * @param {Object} object The object to iterate over.
4699      * @param {Function} setter The function to set `accumulator` values.
4700      * @param {Function} iteratee The iteratee to transform values.
4701      * @param {Object} accumulator The initial inverted object.
4702      * @returns {Function} Returns `accumulator`.
4703      */
4704     function baseInverter(object, setter, iteratee, accumulator) {
4705       baseForOwn(object, function(value, key, object) {
4706         setter(accumulator, iteratee(value), key, object);
4707       });
4708       return accumulator;
4709     }
4711     /**
4712      * The base implementation of `_.invoke` without support for individual
4713      * method arguments.
4714      *
4715      * @private
4716      * @param {Object} object The object to query.
4717      * @param {Array|string} path The path of the method to invoke.
4718      * @param {Array} args The arguments to invoke the method with.
4719      * @returns {*} Returns the result of the invoked method.
4720      */
4721     function baseInvoke(object, path, args) {
4722       path = castPath(path, object);
4723       object = parent(object, path);
4724       var func = object == null ? object : object[toKey(last(path))];
4725       return func == null ? undefined : apply(func, object, args);
4726     }
4728     /**
4729      * The base implementation of `_.isArguments`.
4730      *
4731      * @private
4732      * @param {*} value The value to check.
4733      * @returns {boolean} Returns `true` if `value` is an `arguments` object,
4734      */
4735     function baseIsArguments(value) {
4736       return isObjectLike(value) && baseGetTag(value) == argsTag;
4737     }
4739     /**
4740      * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
4741      *
4742      * @private
4743      * @param {*} value The value to check.
4744      * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
4745      */
4746     function baseIsArrayBuffer(value) {
4747       return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
4748     }
4750     /**
4751      * The base implementation of `_.isDate` without Node.js optimizations.
4752      *
4753      * @private
4754      * @param {*} value The value to check.
4755      * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
4756      */
4757     function baseIsDate(value) {
4758       return isObjectLike(value) && baseGetTag(value) == dateTag;
4759     }
4761     /**
4762      * The base implementation of `_.isEqual` which supports partial comparisons
4763      * and tracks traversed objects.
4764      *
4765      * @private
4766      * @param {*} value The value to compare.
4767      * @param {*} other The other value to compare.
4768      * @param {boolean} bitmask The bitmask flags.
4769      *  1 - Unordered comparison
4770      *  2 - Partial comparison
4771      * @param {Function} [customizer] The function to customize comparisons.
4772      * @param {Object} [stack] Tracks traversed `value` and `other` objects.
4773      * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
4774      */
4775     function baseIsEqual(value, other, bitmask, customizer, stack) {
4776       if (value === other) {
4777         return true;
4778       }
4779       if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
4780         return value !== value && other !== other;
4781       }
4782       return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
4783     }
4785     /**
4786      * A specialized version of `baseIsEqual` for arrays and objects which performs
4787      * deep comparisons and tracks traversed objects enabling objects with circular
4788      * references to be compared.
4789      *
4790      * @private
4791      * @param {Object} object The object to compare.
4792      * @param {Object} other The other object to compare.
4793      * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
4794      * @param {Function} customizer The function to customize comparisons.
4795      * @param {Function} equalFunc The function to determine equivalents of values.
4796      * @param {Object} [stack] Tracks traversed `object` and `other` objects.
4797      * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
4798      */
4799     function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
4800       var objIsArr = isArray(object),
4801           othIsArr = isArray(other),
4802           objTag = objIsArr ? arrayTag : getTag(object),
4803           othTag = othIsArr ? arrayTag : getTag(other);
4805       objTag = objTag == argsTag ? objectTag : objTag;
4806       othTag = othTag == argsTag ? objectTag : othTag;
4808       var objIsObj = objTag == objectTag,
4809           othIsObj = othTag == objectTag,
4810           isSameTag = objTag == othTag;
4812       if (isSameTag && isBuffer(object)) {
4813         if (!isBuffer(other)) {
4814           return false;
4815         }
4816         objIsArr = true;
4817         objIsObj = false;
4818       }
4819       if (isSameTag && !objIsObj) {
4820         stack || (stack = new Stack);
4821         return (objIsArr || isTypedArray(object))
4822           ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
4823           : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
4824       }
4825       if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
4826         var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
4827             othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
4829         if (objIsWrapped || othIsWrapped) {
4830           var objUnwrapped = objIsWrapped ? object.value() : object,
4831               othUnwrapped = othIsWrapped ? other.value() : other;
4833           stack || (stack = new Stack);
4834           return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
4835         }
4836       }
4837       if (!isSameTag) {
4838         return false;
4839       }
4840       stack || (stack = new Stack);
4841       return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
4842     }
4844     /**
4845      * The base implementation of `_.isMap` without Node.js optimizations.
4846      *
4847      * @private
4848      * @param {*} value The value to check.
4849      * @returns {boolean} Returns `true` if `value` is a map, else `false`.
4850      */
4851     function baseIsMap(value) {
4852       return isObjectLike(value) && getTag(value) == mapTag;
4853     }
4855     /**
4856      * The base implementation of `_.isMatch` without support for iteratee shorthands.
4857      *
4858      * @private
4859      * @param {Object} object The object to inspect.
4860      * @param {Object} source The object of property values to match.
4861      * @param {Array} matchData The property names, values, and compare flags to match.
4862      * @param {Function} [customizer] The function to customize comparisons.
4863      * @returns {boolean} Returns `true` if `object` is a match, else `false`.
4864      */
4865     function baseIsMatch(object, source, matchData, customizer) {
4866       var index = matchData.length,
4867           length = index,
4868           noCustomizer = !customizer;
4870       if (object == null) {
4871         return !length;
4872       }
4873       object = Object(object);
4874       while (index--) {
4875         var data = matchData[index];
4876         if ((noCustomizer && data[2])
4877               ? data[1] !== object[data[0]]
4878               : !(data[0] in object)
4879             ) {
4880           return false;
4881         }
4882       }
4883       while (++index < length) {
4884         data = matchData[index];
4885         var key = data[0],
4886             objValue = object[key],
4887             srcValue = data[1];
4889         if (noCustomizer && data[2]) {
4890           if (objValue === undefined && !(key in object)) {
4891             return false;
4892           }
4893         } else {
4894           var stack = new Stack;
4895           if (customizer) {
4896             var result = customizer(objValue, srcValue, key, object, source, stack);
4897           }
4898           if (!(result === undefined
4899                 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
4900                 : result
4901               )) {
4902             return false;
4903           }
4904         }
4905       }
4906       return true;
4907     }
4909     /**
4910      * The base implementation of `_.isNative` without bad shim checks.
4911      *
4912      * @private
4913      * @param {*} value The value to check.
4914      * @returns {boolean} Returns `true` if `value` is a native function,
4915      *  else `false`.
4916      */
4917     function baseIsNative(value) {
4918       if (!isObject(value) || isMasked(value)) {
4919         return false;
4920       }
4921       var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
4922       return pattern.test(toSource(value));
4923     }
4925     /**
4926      * The base implementation of `_.isRegExp` without Node.js optimizations.
4927      *
4928      * @private
4929      * @param {*} value The value to check.
4930      * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
4931      */
4932     function baseIsRegExp(value) {
4933       return isObjectLike(value) && baseGetTag(value) == regexpTag;
4934     }
4936     /**
4937      * The base implementation of `_.isSet` without Node.js optimizations.
4938      *
4939      * @private
4940      * @param {*} value The value to check.
4941      * @returns {boolean} Returns `true` if `value` is a set, else `false`.
4942      */
4943     function baseIsSet(value) {
4944       return isObjectLike(value) && getTag(value) == setTag;
4945     }
4947     /**
4948      * The base implementation of `_.isTypedArray` without Node.js optimizations.
4949      *
4950      * @private
4951      * @param {*} value The value to check.
4952      * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
4953      */
4954     function baseIsTypedArray(value) {
4955       return isObjectLike(value) &&
4956         isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
4957     }
4959     /**
4960      * The base implementation of `_.iteratee`.
4961      *
4962      * @private
4963      * @param {*} [value=_.identity] The value to convert to an iteratee.
4964      * @returns {Function} Returns the iteratee.
4965      */
4966     function baseIteratee(value) {
4967       // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
4968       // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
4969       if (typeof value == 'function') {
4970         return value;
4971       }
4972       if (value == null) {
4973         return identity;
4974       }
4975       if (typeof value == 'object') {
4976         return isArray(value)
4977           ? baseMatchesProperty(value[0], value[1])
4978           : baseMatches(value);
4979       }
4980       return property(value);
4981     }
4983     /**
4984      * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
4985      *
4986      * @private
4987      * @param {Object} object The object to query.
4988      * @returns {Array} Returns the array of property names.
4989      */
4990     function baseKeys(object) {
4991       if (!isPrototype(object)) {
4992         return nativeKeys(object);
4993       }
4994       var result = [];
4995       for (var key in Object(object)) {
4996         if (hasOwnProperty.call(object, key) && key != 'constructor') {
4997           result.push(key);
4998         }
4999       }
5000       return result;
5001     }
5003     /**
5004      * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
5005      *
5006      * @private
5007      * @param {Object} object The object to query.
5008      * @returns {Array} Returns the array of property names.
5009      */
5010     function baseKeysIn(object) {
5011       if (!isObject(object)) {
5012         return nativeKeysIn(object);
5013       }
5014       var isProto = isPrototype(object),
5015           result = [];
5017       for (var key in object) {
5018         if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
5019           result.push(key);
5020         }
5021       }
5022       return result;
5023     }
5025     /**
5026      * The base implementation of `_.lt` which doesn't coerce arguments.
5027      *
5028      * @private
5029      * @param {*} value The value to compare.
5030      * @param {*} other The other value to compare.
5031      * @returns {boolean} Returns `true` if `value` is less than `other`,
5032      *  else `false`.
5033      */
5034     function baseLt(value, other) {
5035       return value < other;
5036     }
5038     /**
5039      * The base implementation of `_.map` without support for iteratee shorthands.
5040      *
5041      * @private
5042      * @param {Array|Object} collection The collection to iterate over.
5043      * @param {Function} iteratee The function invoked per iteration.
5044      * @returns {Array} Returns the new mapped array.
5045      */
5046     function baseMap(collection, iteratee) {
5047       var index = -1,
5048           result = isArrayLike(collection) ? Array(collection.length) : [];
5050       baseEach(collection, function(value, key, collection) {
5051         result[++index] = iteratee(value, key, collection);
5052       });
5053       return result;
5054     }
5056     /**
5057      * The base implementation of `_.matches` which doesn't clone `source`.
5058      *
5059      * @private
5060      * @param {Object} source The object of property values to match.
5061      * @returns {Function} Returns the new spec function.
5062      */
5063     function baseMatches(source) {
5064       var matchData = getMatchData(source);
5065       if (matchData.length == 1 && matchData[0][2]) {
5066         return matchesStrictComparable(matchData[0][0], matchData[0][1]);
5067       }
5068       return function(object) {
5069         return object === source || baseIsMatch(object, source, matchData);
5070       };
5071     }
5073     /**
5074      * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
5075      *
5076      * @private
5077      * @param {string} path The path of the property to get.
5078      * @param {*} srcValue The value to match.
5079      * @returns {Function} Returns the new spec function.
5080      */
5081     function baseMatchesProperty(path, srcValue) {
5082       if (isKey(path) && isStrictComparable(srcValue)) {
5083         return matchesStrictComparable(toKey(path), srcValue);
5084       }
5085       return function(object) {
5086         var objValue = get(object, path);
5087         return (objValue === undefined && objValue === srcValue)
5088           ? hasIn(object, path)
5089           : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
5090       };
5091     }
5093     /**
5094      * The base implementation of `_.merge` without support for multiple sources.
5095      *
5096      * @private
5097      * @param {Object} object The destination object.
5098      * @param {Object} source The source object.
5099      * @param {number} srcIndex The index of `source`.
5100      * @param {Function} [customizer] The function to customize merged values.
5101      * @param {Object} [stack] Tracks traversed source values and their merged
5102      *  counterparts.
5103      */
5104     function baseMerge(object, source, srcIndex, customizer, stack) {
5105       if (object === source) {
5106         return;
5107       }
5108       baseFor(source, function(srcValue, key) {
5109         if (isObject(srcValue)) {
5110           stack || (stack = new Stack);
5111           baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
5112         }
5113         else {
5114           var newValue = customizer
5115             ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)
5116             : undefined;
5118           if (newValue === undefined) {
5119             newValue = srcValue;
5120           }
5121           assignMergeValue(object, key, newValue);
5122         }
5123       }, keysIn);
5124     }
5126     /**
5127      * A specialized version of `baseMerge` for arrays and objects which performs
5128      * deep merges and tracks traversed objects enabling objects with circular
5129      * references to be merged.
5130      *
5131      * @private
5132      * @param {Object} object The destination object.
5133      * @param {Object} source The source object.
5134      * @param {string} key The key of the value to merge.
5135      * @param {number} srcIndex The index of `source`.
5136      * @param {Function} mergeFunc The function to merge values.
5137      * @param {Function} [customizer] The function to customize assigned values.
5138      * @param {Object} [stack] Tracks traversed source values and their merged
5139      *  counterparts.
5140      */
5141     function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
5142       var objValue = safeGet(object, key),
5143           srcValue = safeGet(source, key),
5144           stacked = stack.get(srcValue);
5146       if (stacked) {
5147         assignMergeValue(object, key, stacked);
5148         return;
5149       }
5150       var newValue = customizer
5151         ? customizer(objValue, srcValue, (key + ''), object, source, stack)
5152         : undefined;
5154       var isCommon = newValue === undefined;
5156       if (isCommon) {
5157         var isArr = isArray(srcValue),
5158             isBuff = !isArr && isBuffer(srcValue),
5159             isTyped = !isArr && !isBuff && isTypedArray(srcValue);
5161         newValue = srcValue;
5162         if (isArr || isBuff || isTyped) {
5163           if (isArray(objValue)) {
5164             newValue = objValue;
5165           }
5166           else if (isArrayLikeObject(objValue)) {
5167             newValue = copyArray(objValue);
5168           }
5169           else if (isBuff) {
5170             isCommon = false;
5171             newValue = cloneBuffer(srcValue, true);
5172           }
5173           else if (isTyped) {
5174             isCommon = false;
5175             newValue = cloneTypedArray(srcValue, true);
5176           }
5177           else {
5178             newValue = [];
5179           }
5180         }
5181         else if (isPlainObject(srcValue) || isArguments(srcValue)) {
5182           newValue = objValue;
5183           if (isArguments(objValue)) {
5184             newValue = toPlainObject(objValue);
5185           }
5186           else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {
5187             newValue = initCloneObject(srcValue);
5188           }
5189         }
5190         else {
5191           isCommon = false;
5192         }
5193       }
5194       if (isCommon) {
5195         // Recursively merge objects and arrays (susceptible to call stack limits).
5196         stack.set(srcValue, newValue);
5197         mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
5198         stack['delete'](srcValue);
5199       }
5200       assignMergeValue(object, key, newValue);
5201     }
5203     /**
5204      * The base implementation of `_.nth` which doesn't coerce arguments.
5205      *
5206      * @private
5207      * @param {Array} array The array to query.
5208      * @param {number} n The index of the element to return.
5209      * @returns {*} Returns the nth element of `array`.
5210      */
5211     function baseNth(array, n) {
5212       var length = array.length;
5213       if (!length) {
5214         return;
5215       }
5216       n += n < 0 ? length : 0;
5217       return isIndex(n, length) ? array[n] : undefined;
5218     }
5220     /**
5221      * The base implementation of `_.orderBy` without param guards.
5222      *
5223      * @private
5224      * @param {Array|Object} collection The collection to iterate over.
5225      * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
5226      * @param {string[]} orders The sort orders of `iteratees`.
5227      * @returns {Array} Returns the new sorted array.
5228      */
5229     function baseOrderBy(collection, iteratees, orders) {
5230       var index = -1;
5231       iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));
5233       var result = baseMap(collection, function(value, key, collection) {
5234         var criteria = arrayMap(iteratees, function(iteratee) {
5235           return iteratee(value);
5236         });
5237         return { 'criteria': criteria, 'index': ++index, 'value': value };
5238       });
5240       return baseSortBy(result, function(object, other) {
5241         return compareMultiple(object, other, orders);
5242       });
5243     }
5245     /**
5246      * The base implementation of `_.pick` without support for individual
5247      * property identifiers.
5248      *
5249      * @private
5250      * @param {Object} object The source object.
5251      * @param {string[]} paths The property paths to pick.
5252      * @returns {Object} Returns the new object.
5253      */
5254     function basePick(object, paths) {
5255       return basePickBy(object, paths, function(value, path) {
5256         return hasIn(object, path);
5257       });
5258     }
5260     /**
5261      * The base implementation of  `_.pickBy` without support for iteratee shorthands.
5262      *
5263      * @private
5264      * @param {Object} object The source object.
5265      * @param {string[]} paths The property paths to pick.
5266      * @param {Function} predicate The function invoked per property.
5267      * @returns {Object} Returns the new object.
5268      */
5269     function basePickBy(object, paths, predicate) {
5270       var index = -1,
5271           length = paths.length,
5272           result = {};
5274       while (++index < length) {
5275         var path = paths[index],
5276             value = baseGet(object, path);
5278         if (predicate(value, path)) {
5279           baseSet(result, castPath(path, object), value);
5280         }
5281       }
5282       return result;
5283     }
5285     /**
5286      * A specialized version of `baseProperty` which supports deep paths.
5287      *
5288      * @private
5289      * @param {Array|string} path The path of the property to get.
5290      * @returns {Function} Returns the new accessor function.
5291      */
5292     function basePropertyDeep(path) {
5293       return function(object) {
5294         return baseGet(object, path);
5295       };
5296     }
5298     /**
5299      * The base implementation of `_.pullAllBy` without support for iteratee
5300      * shorthands.
5301      *
5302      * @private
5303      * @param {Array} array The array to modify.
5304      * @param {Array} values The values to remove.
5305      * @param {Function} [iteratee] The iteratee invoked per element.
5306      * @param {Function} [comparator] The comparator invoked per element.
5307      * @returns {Array} Returns `array`.
5308      */
5309     function basePullAll(array, values, iteratee, comparator) {
5310       var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
5311           index = -1,
5312           length = values.length,
5313           seen = array;
5315       if (array === values) {
5316         values = copyArray(values);
5317       }
5318       if (iteratee) {
5319         seen = arrayMap(array, baseUnary(iteratee));
5320       }
5321       while (++index < length) {
5322         var fromIndex = 0,
5323             value = values[index],
5324             computed = iteratee ? iteratee(value) : value;
5326         while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
5327           if (seen !== array) {
5328             splice.call(seen, fromIndex, 1);
5329           }
5330           splice.call(array, fromIndex, 1);
5331         }
5332       }
5333       return array;
5334     }
5336     /**
5337      * The base implementation of `_.pullAt` without support for individual
5338      * indexes or capturing the removed elements.
5339      *
5340      * @private
5341      * @param {Array} array The array to modify.
5342      * @param {number[]} indexes The indexes of elements to remove.
5343      * @returns {Array} Returns `array`.
5344      */
5345     function basePullAt(array, indexes) {
5346       var length = array ? indexes.length : 0,
5347           lastIndex = length - 1;
5349       while (length--) {
5350         var index = indexes[length];
5351         if (length == lastIndex || index !== previous) {
5352           var previous = index;
5353           if (isIndex(index)) {
5354             splice.call(array, index, 1);
5355           } else {
5356             baseUnset(array, index);
5357           }
5358         }
5359       }
5360       return array;
5361     }
5363     /**
5364      * The base implementation of `_.random` without support for returning
5365      * floating-point numbers.
5366      *
5367      * @private
5368      * @param {number} lower The lower bound.
5369      * @param {number} upper The upper bound.
5370      * @returns {number} Returns the random number.
5371      */
5372     function baseRandom(lower, upper) {
5373       return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
5374     }
5376     /**
5377      * The base implementation of `_.range` and `_.rangeRight` which doesn't
5378      * coerce arguments.
5379      *
5380      * @private
5381      * @param {number} start The start of the range.
5382      * @param {number} end The end of the range.
5383      * @param {number} step The value to increment or decrement by.
5384      * @param {boolean} [fromRight] Specify iterating from right to left.
5385      * @returns {Array} Returns the range of numbers.
5386      */
5387     function baseRange(start, end, step, fromRight) {
5388       var index = -1,
5389           length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
5390           result = Array(length);
5392       while (length--) {
5393         result[fromRight ? length : ++index] = start;
5394         start += step;
5395       }
5396       return result;
5397     }
5399     /**
5400      * The base implementation of `_.repeat` which doesn't coerce arguments.
5401      *
5402      * @private
5403      * @param {string} string The string to repeat.
5404      * @param {number} n The number of times to repeat the string.
5405      * @returns {string} Returns the repeated string.
5406      */
5407     function baseRepeat(string, n) {
5408       var result = '';
5409       if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
5410         return result;
5411       }
5412       // Leverage the exponentiation by squaring algorithm for a faster repeat.
5413       // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
5414       do {
5415         if (n % 2) {
5416           result += string;
5417         }
5418         n = nativeFloor(n / 2);
5419         if (n) {
5420           string += string;
5421         }
5422       } while (n);
5424       return result;
5425     }
5427     /**
5428      * The base implementation of `_.rest` which doesn't validate or coerce arguments.
5429      *
5430      * @private
5431      * @param {Function} func The function to apply a rest parameter to.
5432      * @param {number} [start=func.length-1] The start position of the rest parameter.
5433      * @returns {Function} Returns the new function.
5434      */
5435     function baseRest(func, start) {
5436       return setToString(overRest(func, start, identity), func + '');
5437     }
5439     /**
5440      * The base implementation of `_.sample`.
5441      *
5442      * @private
5443      * @param {Array|Object} collection The collection to sample.
5444      * @returns {*} Returns the random element.
5445      */
5446     function baseSample(collection) {
5447       return arraySample(values(collection));
5448     }
5450     /**
5451      * The base implementation of `_.sampleSize` without param guards.
5452      *
5453      * @private
5454      * @param {Array|Object} collection The collection to sample.
5455      * @param {number} n The number of elements to sample.
5456      * @returns {Array} Returns the random elements.
5457      */
5458     function baseSampleSize(collection, n) {
5459       var array = values(collection);
5460       return shuffleSelf(array, baseClamp(n, 0, array.length));
5461     }
5463     /**
5464      * The base implementation of `_.set`.
5465      *
5466      * @private
5467      * @param {Object} object The object to modify.
5468      * @param {Array|string} path The path of the property to set.
5469      * @param {*} value The value to set.
5470      * @param {Function} [customizer] The function to customize path creation.
5471      * @returns {Object} Returns `object`.
5472      */
5473     function baseSet(object, path, value, customizer) {
5474       if (!isObject(object)) {
5475         return object;
5476       }
5477       path = castPath(path, object);
5479       var index = -1,
5480           length = path.length,
5481           lastIndex = length - 1,
5482           nested = object;
5484       while (nested != null && ++index < length) {
5485         var key = toKey(path[index]),
5486             newValue = value;
5488         if (index != lastIndex) {
5489           var objValue = nested[key];
5490           newValue = customizer ? customizer(objValue, key, nested) : undefined;
5491           if (newValue === undefined) {
5492             newValue = isObject(objValue)
5493               ? objValue
5494               : (isIndex(path[index + 1]) ? [] : {});
5495           }
5496         }
5497         assignValue(nested, key, newValue);
5498         nested = nested[key];
5499       }
5500       return object;
5501     }
5503     /**
5504      * The base implementation of `setData` without support for hot loop shorting.
5505      *
5506      * @private
5507      * @param {Function} func The function to associate metadata with.
5508      * @param {*} data The metadata.
5509      * @returns {Function} Returns `func`.
5510      */
5511     var baseSetData = !metaMap ? identity : function(func, data) {
5512       metaMap.set(func, data);
5513       return func;
5514     };
5516     /**
5517      * The base implementation of `setToString` without support for hot loop shorting.
5518      *
5519      * @private
5520      * @param {Function} func The function to modify.
5521      * @param {Function} string The `toString` result.
5522      * @returns {Function} Returns `func`.
5523      */
5524     var baseSetToString = !defineProperty ? identity : function(func, string) {
5525       return defineProperty(func, 'toString', {
5526         'configurable': true,
5527         'enumerable': false,
5528         'value': constant(string),
5529         'writable': true
5530       });
5531     };
5533     /**
5534      * The base implementation of `_.shuffle`.
5535      *
5536      * @private
5537      * @param {Array|Object} collection The collection to shuffle.
5538      * @returns {Array} Returns the new shuffled array.
5539      */
5540     function baseShuffle(collection) {
5541       return shuffleSelf(values(collection));
5542     }
5544     /**
5545      * The base implementation of `_.slice` without an iteratee call guard.
5546      *
5547      * @private
5548      * @param {Array} array The array to slice.
5549      * @param {number} [start=0] The start position.
5550      * @param {number} [end=array.length] The end position.
5551      * @returns {Array} Returns the slice of `array`.
5552      */
5553     function baseSlice(array, start, end) {
5554       var index = -1,
5555           length = array.length;
5557       if (start < 0) {
5558         start = -start > length ? 0 : (length + start);
5559       }
5560       end = end > length ? length : end;
5561       if (end < 0) {
5562         end += length;
5563       }
5564       length = start > end ? 0 : ((end - start) >>> 0);
5565       start >>>= 0;
5567       var result = Array(length);
5568       while (++index < length) {
5569         result[index] = array[index + start];
5570       }
5571       return result;
5572     }
5574     /**
5575      * The base implementation of `_.some` without support for iteratee shorthands.
5576      *
5577      * @private
5578      * @param {Array|Object} collection The collection to iterate over.
5579      * @param {Function} predicate The function invoked per iteration.
5580      * @returns {boolean} Returns `true` if any element passes the predicate check,
5581      *  else `false`.
5582      */
5583     function baseSome(collection, predicate) {
5584       var result;
5586       baseEach(collection, function(value, index, collection) {
5587         result = predicate(value, index, collection);
5588         return !result;
5589       });
5590       return !!result;
5591     }
5593     /**
5594      * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
5595      * performs a binary search of `array` to determine the index at which `value`
5596      * should be inserted into `array` in order to maintain its sort order.
5597      *
5598      * @private
5599      * @param {Array} array The sorted array to inspect.
5600      * @param {*} value The value to evaluate.
5601      * @param {boolean} [retHighest] Specify returning the highest qualified index.
5602      * @returns {number} Returns the index at which `value` should be inserted
5603      *  into `array`.
5604      */
5605     function baseSortedIndex(array, value, retHighest) {
5606       var low = 0,
5607           high = array == null ? low : array.length;
5609       if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
5610         while (low < high) {
5611           var mid = (low + high) >>> 1,
5612               computed = array[mid];
5614           if (computed !== null && !isSymbol(computed) &&
5615               (retHighest ? (computed <= value) : (computed < value))) {
5616             low = mid + 1;
5617           } else {
5618             high = mid;
5619           }
5620         }
5621         return high;
5622       }
5623       return baseSortedIndexBy(array, value, identity, retHighest);
5624     }
5626     /**
5627      * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
5628      * which invokes `iteratee` for `value` and each element of `array` to compute
5629      * their sort ranking. The iteratee is invoked with one argument; (value).
5630      *
5631      * @private
5632      * @param {Array} array The sorted array to inspect.
5633      * @param {*} value The value to evaluate.
5634      * @param {Function} iteratee The iteratee invoked per element.
5635      * @param {boolean} [retHighest] Specify returning the highest qualified index.
5636      * @returns {number} Returns the index at which `value` should be inserted
5637      *  into `array`.
5638      */
5639     function baseSortedIndexBy(array, value, iteratee, retHighest) {
5640       value = iteratee(value);
5642       var low = 0,
5643           high = array == null ? 0 : array.length,
5644           valIsNaN = value !== value,
5645           valIsNull = value === null,
5646           valIsSymbol = isSymbol(value),
5647           valIsUndefined = value === undefined;
5649       while (low < high) {
5650         var mid = nativeFloor((low + high) / 2),
5651             computed = iteratee(array[mid]),
5652             othIsDefined = computed !== undefined,
5653             othIsNull = computed === null,
5654             othIsReflexive = computed === computed,
5655             othIsSymbol = isSymbol(computed);
5657         if (valIsNaN) {
5658           var setLow = retHighest || othIsReflexive;
5659         } else if (valIsUndefined) {
5660           setLow = othIsReflexive && (retHighest || othIsDefined);
5661         } else if (valIsNull) {
5662           setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
5663         } else if (valIsSymbol) {
5664           setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
5665         } else if (othIsNull || othIsSymbol) {
5666           setLow = false;
5667         } else {
5668           setLow = retHighest ? (computed <= value) : (computed < value);
5669         }
5670         if (setLow) {
5671           low = mid + 1;
5672         } else {
5673           high = mid;
5674         }
5675       }
5676       return nativeMin(high, MAX_ARRAY_INDEX);
5677     }
5679     /**
5680      * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
5681      * support for iteratee shorthands.
5682      *
5683      * @private
5684      * @param {Array} array The array to inspect.
5685      * @param {Function} [iteratee] The iteratee invoked per element.
5686      * @returns {Array} Returns the new duplicate free array.
5687      */
5688     function baseSortedUniq(array, iteratee) {
5689       var index = -1,
5690           length = array.length,
5691           resIndex = 0,
5692           result = [];
5694       while (++index < length) {
5695         var value = array[index],
5696             computed = iteratee ? iteratee(value) : value;
5698         if (!index || !eq(computed, seen)) {
5699           var seen = computed;
5700           result[resIndex++] = value === 0 ? 0 : value;
5701         }
5702       }
5703       return result;
5704     }
5706     /**
5707      * The base implementation of `_.toNumber` which doesn't ensure correct
5708      * conversions of binary, hexadecimal, or octal string values.
5709      *
5710      * @private
5711      * @param {*} value The value to process.
5712      * @returns {number} Returns the number.
5713      */
5714     function baseToNumber(value) {
5715       if (typeof value == 'number') {
5716         return value;
5717       }
5718       if (isSymbol(value)) {
5719         return NAN;
5720       }
5721       return +value;
5722     }
5724     /**
5725      * The base implementation of `_.toString` which doesn't convert nullish
5726      * values to empty strings.
5727      *
5728      * @private
5729      * @param {*} value The value to process.
5730      * @returns {string} Returns the string.
5731      */
5732     function baseToString(value) {
5733       // Exit early for strings to avoid a performance hit in some environments.
5734       if (typeof value == 'string') {
5735         return value;
5736       }
5737       if (isArray(value)) {
5738         // Recursively convert values (susceptible to call stack limits).
5739         return arrayMap(value, baseToString) + '';
5740       }
5741       if (isSymbol(value)) {
5742         return symbolToString ? symbolToString.call(value) : '';
5743       }
5744       var result = (value + '');
5745       return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
5746     }
5748     /**
5749      * The base implementation of `_.uniqBy` without support for iteratee shorthands.
5750      *
5751      * @private
5752      * @param {Array} array The array to inspect.
5753      * @param {Function} [iteratee] The iteratee invoked per element.
5754      * @param {Function} [comparator] The comparator invoked per element.
5755      * @returns {Array} Returns the new duplicate free array.
5756      */
5757     function baseUniq(array, iteratee, comparator) {
5758       var index = -1,
5759           includes = arrayIncludes,
5760           length = array.length,
5761           isCommon = true,
5762           result = [],
5763           seen = result;
5765       if (comparator) {
5766         isCommon = false;
5767         includes = arrayIncludesWith;
5768       }
5769       else if (length >= LARGE_ARRAY_SIZE) {
5770         var set = iteratee ? null : createSet(array);
5771         if (set) {
5772           return setToArray(set);
5773         }
5774         isCommon = false;
5775         includes = cacheHas;
5776         seen = new SetCache;
5777       }
5778       else {
5779         seen = iteratee ? [] : result;
5780       }
5781       outer:
5782       while (++index < length) {
5783         var value = array[index],
5784             computed = iteratee ? iteratee(value) : value;
5786         value = (comparator || value !== 0) ? value : 0;
5787         if (isCommon && computed === computed) {
5788           var seenIndex = seen.length;
5789           while (seenIndex--) {
5790             if (seen[seenIndex] === computed) {
5791               continue outer;
5792             }
5793           }
5794           if (iteratee) {
5795             seen.push(computed);
5796           }
5797           result.push(value);
5798         }
5799         else if (!includes(seen, computed, comparator)) {
5800           if (seen !== result) {
5801             seen.push(computed);
5802           }
5803           result.push(value);
5804         }
5805       }
5806       return result;
5807     }
5809     /**
5810      * The base implementation of `_.unset`.
5811      *
5812      * @private
5813      * @param {Object} object The object to modify.
5814      * @param {Array|string} path The property path to unset.
5815      * @returns {boolean} Returns `true` if the property is deleted, else `false`.
5816      */
5817     function baseUnset(object, path) {
5818       path = castPath(path, object);
5819       object = parent(object, path);
5820       return object == null || delete object[toKey(last(path))];
5821     }
5823     /**
5824      * The base implementation of `_.update`.
5825      *
5826      * @private
5827      * @param {Object} object The object to modify.
5828      * @param {Array|string} path The path of the property to update.
5829      * @param {Function} updater The function to produce the updated value.
5830      * @param {Function} [customizer] The function to customize path creation.
5831      * @returns {Object} Returns `object`.
5832      */
5833     function baseUpdate(object, path, updater, customizer) {
5834       return baseSet(object, path, updater(baseGet(object, path)), customizer);
5835     }
5837     /**
5838      * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
5839      * without support for iteratee shorthands.
5840      *
5841      * @private
5842      * @param {Array} array The array to query.
5843      * @param {Function} predicate The function invoked per iteration.
5844      * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
5845      * @param {boolean} [fromRight] Specify iterating from right to left.
5846      * @returns {Array} Returns the slice of `array`.
5847      */
5848     function baseWhile(array, predicate, isDrop, fromRight) {
5849       var length = array.length,
5850           index = fromRight ? length : -1;
5852       while ((fromRight ? index-- : ++index < length) &&
5853         predicate(array[index], index, array)) {}
5855       return isDrop
5856         ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
5857         : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
5858     }
5860     /**
5861      * The base implementation of `wrapperValue` which returns the result of
5862      * performing a sequence of actions on the unwrapped `value`, where each
5863      * successive action is supplied the return value of the previous.
5864      *
5865      * @private
5866      * @param {*} value The unwrapped value.
5867      * @param {Array} actions Actions to perform to resolve the unwrapped value.
5868      * @returns {*} Returns the resolved value.
5869      */
5870     function baseWrapperValue(value, actions) {
5871       var result = value;
5872       if (result instanceof LazyWrapper) {
5873         result = result.value();
5874       }
5875       return arrayReduce(actions, function(result, action) {
5876         return action.func.apply(action.thisArg, arrayPush([result], action.args));
5877       }, result);
5878     }
5880     /**
5881      * The base implementation of methods like `_.xor`, without support for
5882      * iteratee shorthands, that accepts an array of arrays to inspect.
5883      *
5884      * @private
5885      * @param {Array} arrays The arrays to inspect.
5886      * @param {Function} [iteratee] The iteratee invoked per element.
5887      * @param {Function} [comparator] The comparator invoked per element.
5888      * @returns {Array} Returns the new array of values.
5889      */
5890     function baseXor(arrays, iteratee, comparator) {
5891       var length = arrays.length;
5892       if (length < 2) {
5893         return length ? baseUniq(arrays[0]) : [];
5894       }
5895       var index = -1,
5896           result = Array(length);
5898       while (++index < length) {
5899         var array = arrays[index],
5900             othIndex = -1;
5902         while (++othIndex < length) {
5903           if (othIndex != index) {
5904             result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
5905           }
5906         }
5907       }
5908       return baseUniq(baseFlatten(result, 1), iteratee, comparator);
5909     }
5911     /**
5912      * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
5913      *
5914      * @private
5915      * @param {Array} props The property identifiers.
5916      * @param {Array} values The property values.
5917      * @param {Function} assignFunc The function to assign values.
5918      * @returns {Object} Returns the new object.
5919      */
5920     function baseZipObject(props, values, assignFunc) {
5921       var index = -1,
5922           length = props.length,
5923           valsLength = values.length,
5924           result = {};
5926       while (++index < length) {
5927         var value = index < valsLength ? values[index] : undefined;
5928         assignFunc(result, props[index], value);
5929       }
5930       return result;
5931     }
5933     /**
5934      * Casts `value` to an empty array if it's not an array like object.
5935      *
5936      * @private
5937      * @param {*} value The value to inspect.
5938      * @returns {Array|Object} Returns the cast array-like object.
5939      */
5940     function castArrayLikeObject(value) {
5941       return isArrayLikeObject(value) ? value : [];
5942     }
5944     /**
5945      * Casts `value` to `identity` if it's not a function.
5946      *
5947      * @private
5948      * @param {*} value The value to inspect.
5949      * @returns {Function} Returns cast function.
5950      */
5951     function castFunction(value) {
5952       return typeof value == 'function' ? value : identity;
5953     }
5955     /**
5956      * Casts `value` to a path array if it's not one.
5957      *
5958      * @private
5959      * @param {*} value The value to inspect.
5960      * @param {Object} [object] The object to query keys on.
5961      * @returns {Array} Returns the cast property path array.
5962      */
5963     function castPath(value, object) {
5964       if (isArray(value)) {
5965         return value;
5966       }
5967       return isKey(value, object) ? [value] : stringToPath(toString(value));
5968     }
5970     /**
5971      * A `baseRest` alias which can be replaced with `identity` by module
5972      * replacement plugins.
5973      *
5974      * @private
5975      * @type {Function}
5976      * @param {Function} func The function to apply a rest parameter to.
5977      * @returns {Function} Returns the new function.
5978      */
5979     var castRest = baseRest;
5981     /**
5982      * Casts `array` to a slice if it's needed.
5983      *
5984      * @private
5985      * @param {Array} array The array to inspect.
5986      * @param {number} start The start position.
5987      * @param {number} [end=array.length] The end position.
5988      * @returns {Array} Returns the cast slice.
5989      */
5990     function castSlice(array, start, end) {
5991       var length = array.length;
5992       end = end === undefined ? length : end;
5993       return (!start && end >= length) ? array : baseSlice(array, start, end);
5994     }
5996     /**
5997      * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
5998      *
5999      * @private
6000      * @param {number|Object} id The timer id or timeout object of the timer to clear.
6001      */
6002     var clearTimeout = ctxClearTimeout || function(id) {
6003       return root.clearTimeout(id);
6004     };
6006     /**
6007      * Creates a clone of  `buffer`.
6008      *
6009      * @private
6010      * @param {Buffer} buffer The buffer to clone.
6011      * @param {boolean} [isDeep] Specify a deep clone.
6012      * @returns {Buffer} Returns the cloned buffer.
6013      */
6014     function cloneBuffer(buffer, isDeep) {
6015       if (isDeep) {
6016         return buffer.slice();
6017       }
6018       var length = buffer.length,
6019           result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
6021       buffer.copy(result);
6022       return result;
6023     }
6025     /**
6026      * Creates a clone of `arrayBuffer`.
6027      *
6028      * @private
6029      * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
6030      * @returns {ArrayBuffer} Returns the cloned array buffer.
6031      */
6032     function cloneArrayBuffer(arrayBuffer) {
6033       var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
6034       new Uint8Array(result).set(new Uint8Array(arrayBuffer));
6035       return result;
6036     }
6038     /**
6039      * Creates a clone of `dataView`.
6040      *
6041      * @private
6042      * @param {Object} dataView The data view to clone.
6043      * @param {boolean} [isDeep] Specify a deep clone.
6044      * @returns {Object} Returns the cloned data view.
6045      */
6046     function cloneDataView(dataView, isDeep) {
6047       var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
6048       return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
6049     }
6051     /**
6052      * Creates a clone of `regexp`.
6053      *
6054      * @private
6055      * @param {Object} regexp The regexp to clone.
6056      * @returns {Object} Returns the cloned regexp.
6057      */
6058     function cloneRegExp(regexp) {
6059       var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
6060       result.lastIndex = regexp.lastIndex;
6061       return result;
6062     }
6064     /**
6065      * Creates a clone of the `symbol` object.
6066      *
6067      * @private
6068      * @param {Object} symbol The symbol object to clone.
6069      * @returns {Object} Returns the cloned symbol object.
6070      */
6071     function cloneSymbol(symbol) {
6072       return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
6073     }
6075     /**
6076      * Creates a clone of `typedArray`.
6077      *
6078      * @private
6079      * @param {Object} typedArray The typed array to clone.
6080      * @param {boolean} [isDeep] Specify a deep clone.
6081      * @returns {Object} Returns the cloned typed array.
6082      */
6083     function cloneTypedArray(typedArray, isDeep) {
6084       var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
6085       return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
6086     }
6088     /**
6089      * Compares values to sort them in ascending order.
6090      *
6091      * @private
6092      * @param {*} value The value to compare.
6093      * @param {*} other The other value to compare.
6094      * @returns {number} Returns the sort order indicator for `value`.
6095      */
6096     function compareAscending(value, other) {
6097       if (value !== other) {
6098         var valIsDefined = value !== undefined,
6099             valIsNull = value === null,
6100             valIsReflexive = value === value,
6101             valIsSymbol = isSymbol(value);
6103         var othIsDefined = other !== undefined,
6104             othIsNull = other === null,
6105             othIsReflexive = other === other,
6106             othIsSymbol = isSymbol(other);
6108         if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
6109             (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
6110             (valIsNull && othIsDefined && othIsReflexive) ||
6111             (!valIsDefined && othIsReflexive) ||
6112             !valIsReflexive) {
6113           return 1;
6114         }
6115         if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
6116             (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
6117             (othIsNull && valIsDefined && valIsReflexive) ||
6118             (!othIsDefined && valIsReflexive) ||
6119             !othIsReflexive) {
6120           return -1;
6121         }
6122       }
6123       return 0;
6124     }
6126     /**
6127      * Used by `_.orderBy` to compare multiple properties of a value to another
6128      * and stable sort them.
6129      *
6130      * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
6131      * specify an order of "desc" for descending or "asc" for ascending sort order
6132      * of corresponding values.
6133      *
6134      * @private
6135      * @param {Object} object The object to compare.
6136      * @param {Object} other The other object to compare.
6137      * @param {boolean[]|string[]} orders The order to sort by for each property.
6138      * @returns {number} Returns the sort order indicator for `object`.
6139      */
6140     function compareMultiple(object, other, orders) {
6141       var index = -1,
6142           objCriteria = object.criteria,
6143           othCriteria = other.criteria,
6144           length = objCriteria.length,
6145           ordersLength = orders.length;
6147       while (++index < length) {
6148         var result = compareAscending(objCriteria[index], othCriteria[index]);
6149         if (result) {
6150           if (index >= ordersLength) {
6151             return result;
6152           }
6153           var order = orders[index];
6154           return result * (order == 'desc' ? -1 : 1);
6155         }
6156       }
6157       // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
6158       // that causes it, under certain circumstances, to provide the same value for
6159       // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
6160       // for more details.
6161       //
6162       // This also ensures a stable sort in V8 and other engines.
6163       // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
6164       return object.index - other.index;
6165     }
6167     /**
6168      * Creates an array that is the composition of partially applied arguments,
6169      * placeholders, and provided arguments into a single array of arguments.
6170      *
6171      * @private
6172      * @param {Array} args The provided arguments.
6173      * @param {Array} partials The arguments to prepend to those provided.
6174      * @param {Array} holders The `partials` placeholder indexes.
6175      * @params {boolean} [isCurried] Specify composing for a curried function.
6176      * @returns {Array} Returns the new array of composed arguments.
6177      */
6178     function composeArgs(args, partials, holders, isCurried) {
6179       var argsIndex = -1,
6180           argsLength = args.length,
6181           holdersLength = holders.length,
6182           leftIndex = -1,
6183           leftLength = partials.length,
6184           rangeLength = nativeMax(argsLength - holdersLength, 0),
6185           result = Array(leftLength + rangeLength),
6186           isUncurried = !isCurried;
6188       while (++leftIndex < leftLength) {
6189         result[leftIndex] = partials[leftIndex];
6190       }
6191       while (++argsIndex < holdersLength) {
6192         if (isUncurried || argsIndex < argsLength) {
6193           result[holders[argsIndex]] = args[argsIndex];
6194         }
6195       }
6196       while (rangeLength--) {
6197         result[leftIndex++] = args[argsIndex++];
6198       }
6199       return result;
6200     }
6202     /**
6203      * This function is like `composeArgs` except that the arguments composition
6204      * is tailored for `_.partialRight`.
6205      *
6206      * @private
6207      * @param {Array} args The provided arguments.
6208      * @param {Array} partials The arguments to append to those provided.
6209      * @param {Array} holders The `partials` placeholder indexes.
6210      * @params {boolean} [isCurried] Specify composing for a curried function.
6211      * @returns {Array} Returns the new array of composed arguments.
6212      */
6213     function composeArgsRight(args, partials, holders, isCurried) {
6214       var argsIndex = -1,
6215           argsLength = args.length,
6216           holdersIndex = -1,
6217           holdersLength = holders.length,
6218           rightIndex = -1,
6219           rightLength = partials.length,
6220           rangeLength = nativeMax(argsLength - holdersLength, 0),
6221           result = Array(rangeLength + rightLength),
6222           isUncurried = !isCurried;
6224       while (++argsIndex < rangeLength) {
6225         result[argsIndex] = args[argsIndex];
6226       }
6227       var offset = argsIndex;
6228       while (++rightIndex < rightLength) {
6229         result[offset + rightIndex] = partials[rightIndex];
6230       }
6231       while (++holdersIndex < holdersLength) {
6232         if (isUncurried || argsIndex < argsLength) {
6233           result[offset + holders[holdersIndex]] = args[argsIndex++];
6234         }
6235       }
6236       return result;
6237     }
6239     /**
6240      * Copies the values of `source` to `array`.
6241      *
6242      * @private
6243      * @param {Array} source The array to copy values from.
6244      * @param {Array} [array=[]] The array to copy values to.
6245      * @returns {Array} Returns `array`.
6246      */
6247     function copyArray(source, array) {
6248       var index = -1,
6249           length = source.length;
6251       array || (array = Array(length));
6252       while (++index < length) {
6253         array[index] = source[index];
6254       }
6255       return array;
6256     }
6258     /**
6259      * Copies properties of `source` to `object`.
6260      *
6261      * @private
6262      * @param {Object} source The object to copy properties from.
6263      * @param {Array} props The property identifiers to copy.
6264      * @param {Object} [object={}] The object to copy properties to.
6265      * @param {Function} [customizer] The function to customize copied values.
6266      * @returns {Object} Returns `object`.
6267      */
6268     function copyObject(source, props, object, customizer) {
6269       var isNew = !object;
6270       object || (object = {});
6272       var index = -1,
6273           length = props.length;
6275       while (++index < length) {
6276         var key = props[index];
6278         var newValue = customizer
6279           ? customizer(object[key], source[key], key, object, source)
6280           : undefined;
6282         if (newValue === undefined) {
6283           newValue = source[key];
6284         }
6285         if (isNew) {
6286           baseAssignValue(object, key, newValue);
6287         } else {
6288           assignValue(object, key, newValue);
6289         }
6290       }
6291       return object;
6292     }
6294     /**
6295      * Copies own symbols of `source` to `object`.
6296      *
6297      * @private
6298      * @param {Object} source The object to copy symbols from.
6299      * @param {Object} [object={}] The object to copy symbols to.
6300      * @returns {Object} Returns `object`.
6301      */
6302     function copySymbols(source, object) {
6303       return copyObject(source, getSymbols(source), object);
6304     }
6306     /**
6307      * Copies own and inherited symbols of `source` to `object`.
6308      *
6309      * @private
6310      * @param {Object} source The object to copy symbols from.
6311      * @param {Object} [object={}] The object to copy symbols to.
6312      * @returns {Object} Returns `object`.
6313      */
6314     function copySymbolsIn(source, object) {
6315       return copyObject(source, getSymbolsIn(source), object);
6316     }
6318     /**
6319      * Creates a function like `_.groupBy`.
6320      *
6321      * @private
6322      * @param {Function} setter The function to set accumulator values.
6323      * @param {Function} [initializer] The accumulator object initializer.
6324      * @returns {Function} Returns the new aggregator function.
6325      */
6326     function createAggregator(setter, initializer) {
6327       return function(collection, iteratee) {
6328         var func = isArray(collection) ? arrayAggregator : baseAggregator,
6329             accumulator = initializer ? initializer() : {};
6331         return func(collection, setter, getIteratee(iteratee, 2), accumulator);
6332       };
6333     }
6335     /**
6336      * Creates a function like `_.assign`.
6337      *
6338      * @private
6339      * @param {Function} assigner The function to assign values.
6340      * @returns {Function} Returns the new assigner function.
6341      */
6342     function createAssigner(assigner) {
6343       return baseRest(function(object, sources) {
6344         var index = -1,
6345             length = sources.length,
6346             customizer = length > 1 ? sources[length - 1] : undefined,
6347             guard = length > 2 ? sources[2] : undefined;
6349         customizer = (assigner.length > 3 && typeof customizer == 'function')
6350           ? (length--, customizer)
6351           : undefined;
6353         if (guard && isIterateeCall(sources[0], sources[1], guard)) {
6354           customizer = length < 3 ? undefined : customizer;
6355           length = 1;
6356         }
6357         object = Object(object);
6358         while (++index < length) {
6359           var source = sources[index];
6360           if (source) {
6361             assigner(object, source, index, customizer);
6362           }
6363         }
6364         return object;
6365       });
6366     }
6368     /**
6369      * Creates a `baseEach` or `baseEachRight` function.
6370      *
6371      * @private
6372      * @param {Function} eachFunc The function to iterate over a collection.
6373      * @param {boolean} [fromRight] Specify iterating from right to left.
6374      * @returns {Function} Returns the new base function.
6375      */
6376     function createBaseEach(eachFunc, fromRight) {
6377       return function(collection, iteratee) {
6378         if (collection == null) {
6379           return collection;
6380         }
6381         if (!isArrayLike(collection)) {
6382           return eachFunc(collection, iteratee);
6383         }
6384         var length = collection.length,
6385             index = fromRight ? length : -1,
6386             iterable = Object(collection);
6388         while ((fromRight ? index-- : ++index < length)) {
6389           if (iteratee(iterable[index], index, iterable) === false) {
6390             break;
6391           }
6392         }
6393         return collection;
6394       };
6395     }
6397     /**
6398      * Creates a base function for methods like `_.forIn` and `_.forOwn`.
6399      *
6400      * @private
6401      * @param {boolean} [fromRight] Specify iterating from right to left.
6402      * @returns {Function} Returns the new base function.
6403      */
6404     function createBaseFor(fromRight) {
6405       return function(object, iteratee, keysFunc) {
6406         var index = -1,
6407             iterable = Object(object),
6408             props = keysFunc(object),
6409             length = props.length;
6411         while (length--) {
6412           var key = props[fromRight ? length : ++index];
6413           if (iteratee(iterable[key], key, iterable) === false) {
6414             break;
6415           }
6416         }
6417         return object;
6418       };
6419     }
6421     /**
6422      * Creates a function that wraps `func` to invoke it with the optional `this`
6423      * binding of `thisArg`.
6424      *
6425      * @private
6426      * @param {Function} func The function to wrap.
6427      * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6428      * @param {*} [thisArg] The `this` binding of `func`.
6429      * @returns {Function} Returns the new wrapped function.
6430      */
6431     function createBind(func, bitmask, thisArg) {
6432       var isBind = bitmask & WRAP_BIND_FLAG,
6433           Ctor = createCtor(func);
6435       function wrapper() {
6436         var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
6437         return fn.apply(isBind ? thisArg : this, arguments);
6438       }
6439       return wrapper;
6440     }
6442     /**
6443      * Creates a function like `_.lowerFirst`.
6444      *
6445      * @private
6446      * @param {string} methodName The name of the `String` case method to use.
6447      * @returns {Function} Returns the new case function.
6448      */
6449     function createCaseFirst(methodName) {
6450       return function(string) {
6451         string = toString(string);
6453         var strSymbols = hasUnicode(string)
6454           ? stringToArray(string)
6455           : undefined;
6457         var chr = strSymbols
6458           ? strSymbols[0]
6459           : string.charAt(0);
6461         var trailing = strSymbols
6462           ? castSlice(strSymbols, 1).join('')
6463           : string.slice(1);
6465         return chr[methodName]() + trailing;
6466       };
6467     }
6469     /**
6470      * Creates a function like `_.camelCase`.
6471      *
6472      * @private
6473      * @param {Function} callback The function to combine each word.
6474      * @returns {Function} Returns the new compounder function.
6475      */
6476     function createCompounder(callback) {
6477       return function(string) {
6478         return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
6479       };
6480     }
6482     /**
6483      * Creates a function that produces an instance of `Ctor` regardless of
6484      * whether it was invoked as part of a `new` expression or by `call` or `apply`.
6485      *
6486      * @private
6487      * @param {Function} Ctor The constructor to wrap.
6488      * @returns {Function} Returns the new wrapped function.
6489      */
6490     function createCtor(Ctor) {
6491       return function() {
6492         // Use a `switch` statement to work with class constructors. See
6493         // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
6494         // for more details.
6495         var args = arguments;
6496         switch (args.length) {
6497           case 0: return new Ctor;
6498           case 1: return new Ctor(args[0]);
6499           case 2: return new Ctor(args[0], args[1]);
6500           case 3: return new Ctor(args[0], args[1], args[2]);
6501           case 4: return new Ctor(args[0], args[1], args[2], args[3]);
6502           case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
6503           case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
6504           case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
6505         }
6506         var thisBinding = baseCreate(Ctor.prototype),
6507             result = Ctor.apply(thisBinding, args);
6509         // Mimic the constructor's `return` behavior.
6510         // See https://es5.github.io/#x13.2.2 for more details.
6511         return isObject(result) ? result : thisBinding;
6512       };
6513     }
6515     /**
6516      * Creates a function that wraps `func` to enable currying.
6517      *
6518      * @private
6519      * @param {Function} func The function to wrap.
6520      * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6521      * @param {number} arity The arity of `func`.
6522      * @returns {Function} Returns the new wrapped function.
6523      */
6524     function createCurry(func, bitmask, arity) {
6525       var Ctor = createCtor(func);
6527       function wrapper() {
6528         var length = arguments.length,
6529             args = Array(length),
6530             index = length,
6531             placeholder = getHolder(wrapper);
6533         while (index--) {
6534           args[index] = arguments[index];
6535         }
6536         var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
6537           ? []
6538           : replaceHolders(args, placeholder);
6540         length -= holders.length;
6541         if (length < arity) {
6542           return createRecurry(
6543             func, bitmask, createHybrid, wrapper.placeholder, undefined,
6544             args, holders, undefined, undefined, arity - length);
6545         }
6546         var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
6547         return apply(fn, this, args);
6548       }
6549       return wrapper;
6550     }
6552     /**
6553      * Creates a `_.find` or `_.findLast` function.
6554      *
6555      * @private
6556      * @param {Function} findIndexFunc The function to find the collection index.
6557      * @returns {Function} Returns the new find function.
6558      */
6559     function createFind(findIndexFunc) {
6560       return function(collection, predicate, fromIndex) {
6561         var iterable = Object(collection);
6562         if (!isArrayLike(collection)) {
6563           var iteratee = getIteratee(predicate, 3);
6564           collection = keys(collection);
6565           predicate = function(key) { return iteratee(iterable[key], key, iterable); };
6566         }
6567         var index = findIndexFunc(collection, predicate, fromIndex);
6568         return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
6569       };
6570     }
6572     /**
6573      * Creates a `_.flow` or `_.flowRight` function.
6574      *
6575      * @private
6576      * @param {boolean} [fromRight] Specify iterating from right to left.
6577      * @returns {Function} Returns the new flow function.
6578      */
6579     function createFlow(fromRight) {
6580       return flatRest(function(funcs) {
6581         var length = funcs.length,
6582             index = length,
6583             prereq = LodashWrapper.prototype.thru;
6585         if (fromRight) {
6586           funcs.reverse();
6587         }
6588         while (index--) {
6589           var func = funcs[index];
6590           if (typeof func != 'function') {
6591             throw new TypeError(FUNC_ERROR_TEXT);
6592           }
6593           if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
6594             var wrapper = new LodashWrapper([], true);
6595           }
6596         }
6597         index = wrapper ? index : length;
6598         while (++index < length) {
6599           func = funcs[index];
6601           var funcName = getFuncName(func),
6602               data = funcName == 'wrapper' ? getData(func) : undefined;
6604           if (data && isLaziable(data[0]) &&
6605                 data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
6606                 !data[4].length && data[9] == 1
6607               ) {
6608             wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
6609           } else {
6610             wrapper = (func.length == 1 && isLaziable(func))
6611               ? wrapper[funcName]()
6612               : wrapper.thru(func);
6613           }
6614         }
6615         return function() {
6616           var args = arguments,
6617               value = args[0];
6619           if (wrapper && args.length == 1 && isArray(value)) {
6620             return wrapper.plant(value).value();
6621           }
6622           var index = 0,
6623               result = length ? funcs[index].apply(this, args) : value;
6625           while (++index < length) {
6626             result = funcs[index].call(this, result);
6627           }
6628           return result;
6629         };
6630       });
6631     }
6633     /**
6634      * Creates a function that wraps `func` to invoke it with optional `this`
6635      * binding of `thisArg`, partial application, and currying.
6636      *
6637      * @private
6638      * @param {Function|string} func The function or method name to wrap.
6639      * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6640      * @param {*} [thisArg] The `this` binding of `func`.
6641      * @param {Array} [partials] The arguments to prepend to those provided to
6642      *  the new function.
6643      * @param {Array} [holders] The `partials` placeholder indexes.
6644      * @param {Array} [partialsRight] The arguments to append to those provided
6645      *  to the new function.
6646      * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
6647      * @param {Array} [argPos] The argument positions of the new function.
6648      * @param {number} [ary] The arity cap of `func`.
6649      * @param {number} [arity] The arity of `func`.
6650      * @returns {Function} Returns the new wrapped function.
6651      */
6652     function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
6653       var isAry = bitmask & WRAP_ARY_FLAG,
6654           isBind = bitmask & WRAP_BIND_FLAG,
6655           isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
6656           isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
6657           isFlip = bitmask & WRAP_FLIP_FLAG,
6658           Ctor = isBindKey ? undefined : createCtor(func);
6660       function wrapper() {
6661         var length = arguments.length,
6662             args = Array(length),
6663             index = length;
6665         while (index--) {
6666           args[index] = arguments[index];
6667         }
6668         if (isCurried) {
6669           var placeholder = getHolder(wrapper),
6670               holdersCount = countHolders(args, placeholder);
6671         }
6672         if (partials) {
6673           args = composeArgs(args, partials, holders, isCurried);
6674         }
6675         if (partialsRight) {
6676           args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
6677         }
6678         length -= holdersCount;
6679         if (isCurried && length < arity) {
6680           var newHolders = replaceHolders(args, placeholder);
6681           return createRecurry(
6682             func, bitmask, createHybrid, wrapper.placeholder, thisArg,
6683             args, newHolders, argPos, ary, arity - length
6684           );
6685         }
6686         var thisBinding = isBind ? thisArg : this,
6687             fn = isBindKey ? thisBinding[func] : func;
6689         length = args.length;
6690         if (argPos) {
6691           args = reorder(args, argPos);
6692         } else if (isFlip && length > 1) {
6693           args.reverse();
6694         }
6695         if (isAry && ary < length) {
6696           args.length = ary;
6697         }
6698         if (this && this !== root && this instanceof wrapper) {
6699           fn = Ctor || createCtor(fn);
6700         }
6701         return fn.apply(thisBinding, args);
6702       }
6703       return wrapper;
6704     }
6706     /**
6707      * Creates a function like `_.invertBy`.
6708      *
6709      * @private
6710      * @param {Function} setter The function to set accumulator values.
6711      * @param {Function} toIteratee The function to resolve iteratees.
6712      * @returns {Function} Returns the new inverter function.
6713      */
6714     function createInverter(setter, toIteratee) {
6715       return function(object, iteratee) {
6716         return baseInverter(object, setter, toIteratee(iteratee), {});
6717       };
6718     }
6720     /**
6721      * Creates a function that performs a mathematical operation on two values.
6722      *
6723      * @private
6724      * @param {Function} operator The function to perform the operation.
6725      * @param {number} [defaultValue] The value used for `undefined` arguments.
6726      * @returns {Function} Returns the new mathematical operation function.
6727      */
6728     function createMathOperation(operator, defaultValue) {
6729       return function(value, other) {
6730         var result;
6731         if (value === undefined && other === undefined) {
6732           return defaultValue;
6733         }
6734         if (value !== undefined) {
6735           result = value;
6736         }
6737         if (other !== undefined) {
6738           if (result === undefined) {
6739             return other;
6740           }
6741           if (typeof value == 'string' || typeof other == 'string') {
6742             value = baseToString(value);
6743             other = baseToString(other);
6744           } else {
6745             value = baseToNumber(value);
6746             other = baseToNumber(other);
6747           }
6748           result = operator(value, other);
6749         }
6750         return result;
6751       };
6752     }
6754     /**
6755      * Creates a function like `_.over`.
6756      *
6757      * @private
6758      * @param {Function} arrayFunc The function to iterate over iteratees.
6759      * @returns {Function} Returns the new over function.
6760      */
6761     function createOver(arrayFunc) {
6762       return flatRest(function(iteratees) {
6763         iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
6764         return baseRest(function(args) {
6765           var thisArg = this;
6766           return arrayFunc(iteratees, function(iteratee) {
6767             return apply(iteratee, thisArg, args);
6768           });
6769         });
6770       });
6771     }
6773     /**
6774      * Creates the padding for `string` based on `length`. The `chars` string
6775      * is truncated if the number of characters exceeds `length`.
6776      *
6777      * @private
6778      * @param {number} length The padding length.
6779      * @param {string} [chars=' '] The string used as padding.
6780      * @returns {string} Returns the padding for `string`.
6781      */
6782     function createPadding(length, chars) {
6783       chars = chars === undefined ? ' ' : baseToString(chars);
6785       var charsLength = chars.length;
6786       if (charsLength < 2) {
6787         return charsLength ? baseRepeat(chars, length) : chars;
6788       }
6789       var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
6790       return hasUnicode(chars)
6791         ? castSlice(stringToArray(result), 0, length).join('')
6792         : result.slice(0, length);
6793     }
6795     /**
6796      * Creates a function that wraps `func` to invoke it with the `this` binding
6797      * of `thisArg` and `partials` prepended to the arguments it receives.
6798      *
6799      * @private
6800      * @param {Function} func The function to wrap.
6801      * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6802      * @param {*} thisArg The `this` binding of `func`.
6803      * @param {Array} partials The arguments to prepend to those provided to
6804      *  the new function.
6805      * @returns {Function} Returns the new wrapped function.
6806      */
6807     function createPartial(func, bitmask, thisArg, partials) {
6808       var isBind = bitmask & WRAP_BIND_FLAG,
6809           Ctor = createCtor(func);
6811       function wrapper() {
6812         var argsIndex = -1,
6813             argsLength = arguments.length,
6814             leftIndex = -1,
6815             leftLength = partials.length,
6816             args = Array(leftLength + argsLength),
6817             fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
6819         while (++leftIndex < leftLength) {
6820           args[leftIndex] = partials[leftIndex];
6821         }
6822         while (argsLength--) {
6823           args[leftIndex++] = arguments[++argsIndex];
6824         }
6825         return apply(fn, isBind ? thisArg : this, args);
6826       }
6827       return wrapper;
6828     }
6830     /**
6831      * Creates a `_.range` or `_.rangeRight` function.
6832      *
6833      * @private
6834      * @param {boolean} [fromRight] Specify iterating from right to left.
6835      * @returns {Function} Returns the new range function.
6836      */
6837     function createRange(fromRight) {
6838       return function(start, end, step) {
6839         if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
6840           end = step = undefined;
6841         }
6842         // Ensure the sign of `-0` is preserved.
6843         start = toFinite(start);
6844         if (end === undefined) {
6845           end = start;
6846           start = 0;
6847         } else {
6848           end = toFinite(end);
6849         }
6850         step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
6851         return baseRange(start, end, step, fromRight);
6852       };
6853     }
6855     /**
6856      * Creates a function that performs a relational operation on two values.
6857      *
6858      * @private
6859      * @param {Function} operator The function to perform the operation.
6860      * @returns {Function} Returns the new relational operation function.
6861      */
6862     function createRelationalOperation(operator) {
6863       return function(value, other) {
6864         if (!(typeof value == 'string' && typeof other == 'string')) {
6865           value = toNumber(value);
6866           other = toNumber(other);
6867         }
6868         return operator(value, other);
6869       };
6870     }
6872     /**
6873      * Creates a function that wraps `func` to continue currying.
6874      *
6875      * @private
6876      * @param {Function} func The function to wrap.
6877      * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6878      * @param {Function} wrapFunc The function to create the `func` wrapper.
6879      * @param {*} placeholder The placeholder value.
6880      * @param {*} [thisArg] The `this` binding of `func`.
6881      * @param {Array} [partials] The arguments to prepend to those provided to
6882      *  the new function.
6883      * @param {Array} [holders] The `partials` placeholder indexes.
6884      * @param {Array} [argPos] The argument positions of the new function.
6885      * @param {number} [ary] The arity cap of `func`.
6886      * @param {number} [arity] The arity of `func`.
6887      * @returns {Function} Returns the new wrapped function.
6888      */
6889     function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
6890       var isCurry = bitmask & WRAP_CURRY_FLAG,
6891           newHolders = isCurry ? holders : undefined,
6892           newHoldersRight = isCurry ? undefined : holders,
6893           newPartials = isCurry ? partials : undefined,
6894           newPartialsRight = isCurry ? undefined : partials;
6896       bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
6897       bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
6899       if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
6900         bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
6901       }
6902       var newData = [
6903         func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
6904         newHoldersRight, argPos, ary, arity
6905       ];
6907       var result = wrapFunc.apply(undefined, newData);
6908       if (isLaziable(func)) {
6909         setData(result, newData);
6910       }
6911       result.placeholder = placeholder;
6912       return setWrapToString(result, func, bitmask);
6913     }
6915     /**
6916      * Creates a function like `_.round`.
6917      *
6918      * @private
6919      * @param {string} methodName The name of the `Math` method to use when rounding.
6920      * @returns {Function} Returns the new round function.
6921      */
6922     function createRound(methodName) {
6923       var func = Math[methodName];
6924       return function(number, precision) {
6925         number = toNumber(number);
6926         precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
6927         if (precision) {
6928           // Shift with exponential notation to avoid floating-point issues.
6929           // See [MDN](https://mdn.io/round#Examples) for more details.
6930           var pair = (toString(number) + 'e').split('e'),
6931               value = func(pair[0] + 'e' + (+pair[1] + precision));
6933           pair = (toString(value) + 'e').split('e');
6934           return +(pair[0] + 'e' + (+pair[1] - precision));
6935         }
6936         return func(number);
6937       };
6938     }
6940     /**
6941      * Creates a set object of `values`.
6942      *
6943      * @private
6944      * @param {Array} values The values to add to the set.
6945      * @returns {Object} Returns the new set.
6946      */
6947     var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
6948       return new Set(values);
6949     };
6951     /**
6952      * Creates a `_.toPairs` or `_.toPairsIn` function.
6953      *
6954      * @private
6955      * @param {Function} keysFunc The function to get the keys of a given object.
6956      * @returns {Function} Returns the new pairs function.
6957      */
6958     function createToPairs(keysFunc) {
6959       return function(object) {
6960         var tag = getTag(object);
6961         if (tag == mapTag) {
6962           return mapToArray(object);
6963         }
6964         if (tag == setTag) {
6965           return setToPairs(object);
6966         }
6967         return baseToPairs(object, keysFunc(object));
6968       };
6969     }
6971     /**
6972      * Creates a function that either curries or invokes `func` with optional
6973      * `this` binding and partially applied arguments.
6974      *
6975      * @private
6976      * @param {Function|string} func The function or method name to wrap.
6977      * @param {number} bitmask The bitmask flags.
6978      *    1 - `_.bind`
6979      *    2 - `_.bindKey`
6980      *    4 - `_.curry` or `_.curryRight` of a bound function
6981      *    8 - `_.curry`
6982      *   16 - `_.curryRight`
6983      *   32 - `_.partial`
6984      *   64 - `_.partialRight`
6985      *  128 - `_.rearg`
6986      *  256 - `_.ary`
6987      *  512 - `_.flip`
6988      * @param {*} [thisArg] The `this` binding of `func`.
6989      * @param {Array} [partials] The arguments to be partially applied.
6990      * @param {Array} [holders] The `partials` placeholder indexes.
6991      * @param {Array} [argPos] The argument positions of the new function.
6992      * @param {number} [ary] The arity cap of `func`.
6993      * @param {number} [arity] The arity of `func`.
6994      * @returns {Function} Returns the new wrapped function.
6995      */
6996     function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
6997       var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
6998       if (!isBindKey && typeof func != 'function') {
6999         throw new TypeError(FUNC_ERROR_TEXT);
7000       }
7001       var length = partials ? partials.length : 0;
7002       if (!length) {
7003         bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
7004         partials = holders = undefined;
7005       }
7006       ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
7007       arity = arity === undefined ? arity : toInteger(arity);
7008       length -= holders ? holders.length : 0;
7010       if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
7011         var partialsRight = partials,
7012             holdersRight = holders;
7014         partials = holders = undefined;
7015       }
7016       var data = isBindKey ? undefined : getData(func);
7018       var newData = [
7019         func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
7020         argPos, ary, arity
7021       ];
7023       if (data) {
7024         mergeData(newData, data);
7025       }
7026       func = newData[0];
7027       bitmask = newData[1];
7028       thisArg = newData[2];
7029       partials = newData[3];
7030       holders = newData[4];
7031       arity = newData[9] = newData[9] === undefined
7032         ? (isBindKey ? 0 : func.length)
7033         : nativeMax(newData[9] - length, 0);
7035       if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
7036         bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
7037       }
7038       if (!bitmask || bitmask == WRAP_BIND_FLAG) {
7039         var result = createBind(func, bitmask, thisArg);
7040       } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
7041         result = createCurry(func, bitmask, arity);
7042       } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
7043         result = createPartial(func, bitmask, thisArg, partials);
7044       } else {
7045         result = createHybrid.apply(undefined, newData);
7046       }
7047       var setter = data ? baseSetData : setData;
7048       return setWrapToString(setter(result, newData), func, bitmask);
7049     }
7051     /**
7052      * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
7053      * of source objects to the destination object for all destination properties
7054      * that resolve to `undefined`.
7055      *
7056      * @private
7057      * @param {*} objValue The destination value.
7058      * @param {*} srcValue The source value.
7059      * @param {string} key The key of the property to assign.
7060      * @param {Object} object The parent object of `objValue`.
7061      * @returns {*} Returns the value to assign.
7062      */
7063     function customDefaultsAssignIn(objValue, srcValue, key, object) {
7064       if (objValue === undefined ||
7065           (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
7066         return srcValue;
7067       }
7068       return objValue;
7069     }
7071     /**
7072      * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
7073      * objects into destination objects that are passed thru.
7074      *
7075      * @private
7076      * @param {*} objValue The destination value.
7077      * @param {*} srcValue The source value.
7078      * @param {string} key The key of the property to merge.
7079      * @param {Object} object The parent object of `objValue`.
7080      * @param {Object} source The parent object of `srcValue`.
7081      * @param {Object} [stack] Tracks traversed source values and their merged
7082      *  counterparts.
7083      * @returns {*} Returns the value to assign.
7084      */
7085     function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
7086       if (isObject(objValue) && isObject(srcValue)) {
7087         // Recursively merge objects and arrays (susceptible to call stack limits).
7088         stack.set(srcValue, objValue);
7089         baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
7090         stack['delete'](srcValue);
7091       }
7092       return objValue;
7093     }
7095     /**
7096      * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
7097      * objects.
7098      *
7099      * @private
7100      * @param {*} value The value to inspect.
7101      * @param {string} key The key of the property to inspect.
7102      * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
7103      */
7104     function customOmitClone(value) {
7105       return isPlainObject(value) ? undefined : value;
7106     }
7108     /**
7109      * A specialized version of `baseIsEqualDeep` for arrays with support for
7110      * partial deep comparisons.
7111      *
7112      * @private
7113      * @param {Array} array The array to compare.
7114      * @param {Array} other The other array to compare.
7115      * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
7116      * @param {Function} customizer The function to customize comparisons.
7117      * @param {Function} equalFunc The function to determine equivalents of values.
7118      * @param {Object} stack Tracks traversed `array` and `other` objects.
7119      * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
7120      */
7121     function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
7122       var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
7123           arrLength = array.length,
7124           othLength = other.length;
7126       if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
7127         return false;
7128       }
7129       // Assume cyclic values are equal.
7130       var stacked = stack.get(array);
7131       if (stacked && stack.get(other)) {
7132         return stacked == other;
7133       }
7134       var index = -1,
7135           result = true,
7136           seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
7138       stack.set(array, other);
7139       stack.set(other, array);
7141       // Ignore non-index properties.
7142       while (++index < arrLength) {
7143         var arrValue = array[index],
7144             othValue = other[index];
7146         if (customizer) {
7147           var compared = isPartial
7148             ? customizer(othValue, arrValue, index, other, array, stack)
7149             : customizer(arrValue, othValue, index, array, other, stack);
7150         }
7151         if (compared !== undefined) {
7152           if (compared) {
7153             continue;
7154           }
7155           result = false;
7156           break;
7157         }
7158         // Recursively compare arrays (susceptible to call stack limits).
7159         if (seen) {
7160           if (!arraySome(other, function(othValue, othIndex) {
7161                 if (!cacheHas(seen, othIndex) &&
7162                     (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
7163                   return seen.push(othIndex);
7164                 }
7165               })) {
7166             result = false;
7167             break;
7168           }
7169         } else if (!(
7170               arrValue === othValue ||
7171                 equalFunc(arrValue, othValue, bitmask, customizer, stack)
7172             )) {
7173           result = false;
7174           break;
7175         }
7176       }
7177       stack['delete'](array);
7178       stack['delete'](other);
7179       return result;
7180     }
7182     /**
7183      * A specialized version of `baseIsEqualDeep` for comparing objects of
7184      * the same `toStringTag`.
7185      *
7186      * **Note:** This function only supports comparing values with tags of
7187      * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
7188      *
7189      * @private
7190      * @param {Object} object The object to compare.
7191      * @param {Object} other The other object to compare.
7192      * @param {string} tag The `toStringTag` of the objects to compare.
7193      * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
7194      * @param {Function} customizer The function to customize comparisons.
7195      * @param {Function} equalFunc The function to determine equivalents of values.
7196      * @param {Object} stack Tracks traversed `object` and `other` objects.
7197      * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
7198      */
7199     function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
7200       switch (tag) {
7201         case dataViewTag:
7202           if ((object.byteLength != other.byteLength) ||
7203               (object.byteOffset != other.byteOffset)) {
7204             return false;
7205           }
7206           object = object.buffer;
7207           other = other.buffer;
7209         case arrayBufferTag:
7210           if ((object.byteLength != other.byteLength) ||
7211               !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
7212             return false;
7213           }
7214           return true;
7216         case boolTag:
7217         case dateTag:
7218         case numberTag:
7219           // Coerce booleans to `1` or `0` and dates to milliseconds.
7220           // Invalid dates are coerced to `NaN`.
7221           return eq(+object, +other);
7223         case errorTag:
7224           return object.name == other.name && object.message == other.message;
7226         case regexpTag:
7227         case stringTag:
7228           // Coerce regexes to strings and treat strings, primitives and objects,
7229           // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
7230           // for more details.
7231           return object == (other + '');
7233         case mapTag:
7234           var convert = mapToArray;
7236         case setTag:
7237           var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
7238           convert || (convert = setToArray);
7240           if (object.size != other.size && !isPartial) {
7241             return false;
7242           }
7243           // Assume cyclic values are equal.
7244           var stacked = stack.get(object);
7245           if (stacked) {
7246             return stacked == other;
7247           }
7248           bitmask |= COMPARE_UNORDERED_FLAG;
7250           // Recursively compare objects (susceptible to call stack limits).
7251           stack.set(object, other);
7252           var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
7253           stack['delete'](object);
7254           return result;
7256         case symbolTag:
7257           if (symbolValueOf) {
7258             return symbolValueOf.call(object) == symbolValueOf.call(other);
7259           }
7260       }
7261       return false;
7262     }
7264     /**
7265      * A specialized version of `baseIsEqualDeep` for objects with support for
7266      * partial deep comparisons.
7267      *
7268      * @private
7269      * @param {Object} object The object to compare.
7270      * @param {Object} other The other object to compare.
7271      * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
7272      * @param {Function} customizer The function to customize comparisons.
7273      * @param {Function} equalFunc The function to determine equivalents of values.
7274      * @param {Object} stack Tracks traversed `object` and `other` objects.
7275      * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
7276      */
7277     function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
7278       var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
7279           objProps = getAllKeys(object),
7280           objLength = objProps.length,
7281           othProps = getAllKeys(other),
7282           othLength = othProps.length;
7284       if (objLength != othLength && !isPartial) {
7285         return false;
7286       }
7287       var index = objLength;
7288       while (index--) {
7289         var key = objProps[index];
7290         if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
7291           return false;
7292         }
7293       }
7294       // Assume cyclic values are equal.
7295       var stacked = stack.get(object);
7296       if (stacked && stack.get(other)) {
7297         return stacked == other;
7298       }
7299       var result = true;
7300       stack.set(object, other);
7301       stack.set(other, object);
7303       var skipCtor = isPartial;
7304       while (++index < objLength) {
7305         key = objProps[index];
7306         var objValue = object[key],
7307             othValue = other[key];
7309         if (customizer) {
7310           var compared = isPartial
7311             ? customizer(othValue, objValue, key, other, object, stack)
7312             : customizer(objValue, othValue, key, object, other, stack);
7313         }
7314         // Recursively compare objects (susceptible to call stack limits).
7315         if (!(compared === undefined
7316               ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
7317               : compared
7318             )) {
7319           result = false;
7320           break;
7321         }
7322         skipCtor || (skipCtor = key == 'constructor');
7323       }
7324       if (result && !skipCtor) {
7325         var objCtor = object.constructor,
7326             othCtor = other.constructor;
7328         // Non `Object` object instances with different constructors are not equal.
7329         if (objCtor != othCtor &&
7330             ('constructor' in object && 'constructor' in other) &&
7331             !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
7332               typeof othCtor == 'function' && othCtor instanceof othCtor)) {
7333           result = false;
7334         }
7335       }
7336       stack['delete'](object);
7337       stack['delete'](other);
7338       return result;
7339     }
7341     /**
7342      * A specialized version of `baseRest` which flattens the rest array.
7343      *
7344      * @private
7345      * @param {Function} func The function to apply a rest parameter to.
7346      * @returns {Function} Returns the new function.
7347      */
7348     function flatRest(func) {
7349       return setToString(overRest(func, undefined, flatten), func + '');
7350     }
7352     /**
7353      * Creates an array of own enumerable property names and symbols of `object`.
7354      *
7355      * @private
7356      * @param {Object} object The object to query.
7357      * @returns {Array} Returns the array of property names and symbols.
7358      */
7359     function getAllKeys(object) {
7360       return baseGetAllKeys(object, keys, getSymbols);
7361     }
7363     /**
7364      * Creates an array of own and inherited enumerable property names and
7365      * symbols of `object`.
7366      *
7367      * @private
7368      * @param {Object} object The object to query.
7369      * @returns {Array} Returns the array of property names and symbols.
7370      */
7371     function getAllKeysIn(object) {
7372       return baseGetAllKeys(object, keysIn, getSymbolsIn);
7373     }
7375     /**
7376      * Gets metadata for `func`.
7377      *
7378      * @private
7379      * @param {Function} func The function to query.
7380      * @returns {*} Returns the metadata for `func`.
7381      */
7382     var getData = !metaMap ? noop : function(func) {
7383       return metaMap.get(func);
7384     };
7386     /**
7387      * Gets the name of `func`.
7388      *
7389      * @private
7390      * @param {Function} func The function to query.
7391      * @returns {string} Returns the function name.
7392      */
7393     function getFuncName(func) {
7394       var result = (func.name + ''),
7395           array = realNames[result],
7396           length = hasOwnProperty.call(realNames, result) ? array.length : 0;
7398       while (length--) {
7399         var data = array[length],
7400             otherFunc = data.func;
7401         if (otherFunc == null || otherFunc == func) {
7402           return data.name;
7403         }
7404       }
7405       return result;
7406     }
7408     /**
7409      * Gets the argument placeholder value for `func`.
7410      *
7411      * @private
7412      * @param {Function} func The function to inspect.
7413      * @returns {*} Returns the placeholder value.
7414      */
7415     function getHolder(func) {
7416       var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
7417       return object.placeholder;
7418     }
7420     /**
7421      * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
7422      * this function returns the custom method, otherwise it returns `baseIteratee`.
7423      * If arguments are provided, the chosen function is invoked with them and
7424      * its result is returned.
7425      *
7426      * @private
7427      * @param {*} [value] The value to convert to an iteratee.
7428      * @param {number} [arity] The arity of the created iteratee.
7429      * @returns {Function} Returns the chosen function or its result.
7430      */
7431     function getIteratee() {
7432       var result = lodash.iteratee || iteratee;
7433       result = result === iteratee ? baseIteratee : result;
7434       return arguments.length ? result(arguments[0], arguments[1]) : result;
7435     }
7437     /**
7438      * Gets the data for `map`.
7439      *
7440      * @private
7441      * @param {Object} map The map to query.
7442      * @param {string} key The reference key.
7443      * @returns {*} Returns the map data.
7444      */
7445     function getMapData(map, key) {
7446       var data = map.__data__;
7447       return isKeyable(key)
7448         ? data[typeof key == 'string' ? 'string' : 'hash']
7449         : data.map;
7450     }
7452     /**
7453      * Gets the property names, values, and compare flags of `object`.
7454      *
7455      * @private
7456      * @param {Object} object The object to query.
7457      * @returns {Array} Returns the match data of `object`.
7458      */
7459     function getMatchData(object) {
7460       var result = keys(object),
7461           length = result.length;
7463       while (length--) {
7464         var key = result[length],
7465             value = object[key];
7467         result[length] = [key, value, isStrictComparable(value)];
7468       }
7469       return result;
7470     }
7472     /**
7473      * Gets the native function at `key` of `object`.
7474      *
7475      * @private
7476      * @param {Object} object The object to query.
7477      * @param {string} key The key of the method to get.
7478      * @returns {*} Returns the function if it's native, else `undefined`.
7479      */
7480     function getNative(object, key) {
7481       var value = getValue(object, key);
7482       return baseIsNative(value) ? value : undefined;
7483     }
7485     /**
7486      * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
7487      *
7488      * @private
7489      * @param {*} value The value to query.
7490      * @returns {string} Returns the raw `toStringTag`.
7491      */
7492     function getRawTag(value) {
7493       var isOwn = hasOwnProperty.call(value, symToStringTag),
7494           tag = value[symToStringTag];
7496       try {
7497         value[symToStringTag] = undefined;
7498         var unmasked = true;
7499       } catch (e) {}
7501       var result = nativeObjectToString.call(value);
7502       if (unmasked) {
7503         if (isOwn) {
7504           value[symToStringTag] = tag;
7505         } else {
7506           delete value[symToStringTag];
7507         }
7508       }
7509       return result;
7510     }
7512     /**
7513      * Creates an array of the own enumerable symbols of `object`.
7514      *
7515      * @private
7516      * @param {Object} object The object to query.
7517      * @returns {Array} Returns the array of symbols.
7518      */
7519     var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
7520       if (object == null) {
7521         return [];
7522       }
7523       object = Object(object);
7524       return arrayFilter(nativeGetSymbols(object), function(symbol) {
7525         return propertyIsEnumerable.call(object, symbol);
7526       });
7527     };
7529     /**
7530      * Creates an array of the own and inherited enumerable symbols of `object`.
7531      *
7532      * @private
7533      * @param {Object} object The object to query.
7534      * @returns {Array} Returns the array of symbols.
7535      */
7536     var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
7537       var result = [];
7538       while (object) {
7539         arrayPush(result, getSymbols(object));
7540         object = getPrototype(object);
7541       }
7542       return result;
7543     };
7545     /**
7546      * Gets the `toStringTag` of `value`.
7547      *
7548      * @private
7549      * @param {*} value The value to query.
7550      * @returns {string} Returns the `toStringTag`.
7551      */
7552     var getTag = baseGetTag;
7554     // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
7555     if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
7556         (Map && getTag(new Map) != mapTag) ||
7557         (Promise && getTag(Promise.resolve()) != promiseTag) ||
7558         (Set && getTag(new Set) != setTag) ||
7559         (WeakMap && getTag(new WeakMap) != weakMapTag)) {
7560       getTag = function(value) {
7561         var result = baseGetTag(value),
7562             Ctor = result == objectTag ? value.constructor : undefined,
7563             ctorString = Ctor ? toSource(Ctor) : '';
7565         if (ctorString) {
7566           switch (ctorString) {
7567             case dataViewCtorString: return dataViewTag;
7568             case mapCtorString: return mapTag;
7569             case promiseCtorString: return promiseTag;
7570             case setCtorString: return setTag;
7571             case weakMapCtorString: return weakMapTag;
7572           }
7573         }
7574         return result;
7575       };
7576     }
7578     /**
7579      * Gets the view, applying any `transforms` to the `start` and `end` positions.
7580      *
7581      * @private
7582      * @param {number} start The start of the view.
7583      * @param {number} end The end of the view.
7584      * @param {Array} transforms The transformations to apply to the view.
7585      * @returns {Object} Returns an object containing the `start` and `end`
7586      *  positions of the view.
7587      */
7588     function getView(start, end, transforms) {
7589       var index = -1,
7590           length = transforms.length;
7592       while (++index < length) {
7593         var data = transforms[index],
7594             size = data.size;
7596         switch (data.type) {
7597           case 'drop':      start += size; break;
7598           case 'dropRight': end -= size; break;
7599           case 'take':      end = nativeMin(end, start + size); break;
7600           case 'takeRight': start = nativeMax(start, end - size); break;
7601         }
7602       }
7603       return { 'start': start, 'end': end };
7604     }
7606     /**
7607      * Extracts wrapper details from the `source` body comment.
7608      *
7609      * @private
7610      * @param {string} source The source to inspect.
7611      * @returns {Array} Returns the wrapper details.
7612      */
7613     function getWrapDetails(source) {
7614       var match = source.match(reWrapDetails);
7615       return match ? match[1].split(reSplitDetails) : [];
7616     }
7618     /**
7619      * Checks if `path` exists on `object`.
7620      *
7621      * @private
7622      * @param {Object} object The object to query.
7623      * @param {Array|string} path The path to check.
7624      * @param {Function} hasFunc The function to check properties.
7625      * @returns {boolean} Returns `true` if `path` exists, else `false`.
7626      */
7627     function hasPath(object, path, hasFunc) {
7628       path = castPath(path, object);
7630       var index = -1,
7631           length = path.length,
7632           result = false;
7634       while (++index < length) {
7635         var key = toKey(path[index]);
7636         if (!(result = object != null && hasFunc(object, key))) {
7637           break;
7638         }
7639         object = object[key];
7640       }
7641       if (result || ++index != length) {
7642         return result;
7643       }
7644       length = object == null ? 0 : object.length;
7645       return !!length && isLength(length) && isIndex(key, length) &&
7646         (isArray(object) || isArguments(object));
7647     }
7649     /**
7650      * Initializes an array clone.
7651      *
7652      * @private
7653      * @param {Array} array The array to clone.
7654      * @returns {Array} Returns the initialized clone.
7655      */
7656     function initCloneArray(array) {
7657       var length = array.length,
7658           result = new array.constructor(length);
7660       // Add properties assigned by `RegExp#exec`.
7661       if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
7662         result.index = array.index;
7663         result.input = array.input;
7664       }
7665       return result;
7666     }
7668     /**
7669      * Initializes an object clone.
7670      *
7671      * @private
7672      * @param {Object} object The object to clone.
7673      * @returns {Object} Returns the initialized clone.
7674      */
7675     function initCloneObject(object) {
7676       return (typeof object.constructor == 'function' && !isPrototype(object))
7677         ? baseCreate(getPrototype(object))
7678         : {};
7679     }
7681     /**
7682      * Initializes an object clone based on its `toStringTag`.
7683      *
7684      * **Note:** This function only supports cloning values with tags of
7685      * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
7686      *
7687      * @private
7688      * @param {Object} object The object to clone.
7689      * @param {string} tag The `toStringTag` of the object to clone.
7690      * @param {boolean} [isDeep] Specify a deep clone.
7691      * @returns {Object} Returns the initialized clone.
7692      */
7693     function initCloneByTag(object, tag, isDeep) {
7694       var Ctor = object.constructor;
7695       switch (tag) {
7696         case arrayBufferTag:
7697           return cloneArrayBuffer(object);
7699         case boolTag:
7700         case dateTag:
7701           return new Ctor(+object);
7703         case dataViewTag:
7704           return cloneDataView(object, isDeep);
7706         case float32Tag: case float64Tag:
7707         case int8Tag: case int16Tag: case int32Tag:
7708         case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
7709           return cloneTypedArray(object, isDeep);
7711         case mapTag:
7712           return new Ctor;
7714         case numberTag:
7715         case stringTag:
7716           return new Ctor(object);
7718         case regexpTag:
7719           return cloneRegExp(object);
7721         case setTag:
7722           return new Ctor;
7724         case symbolTag:
7725           return cloneSymbol(object);
7726       }
7727     }
7729     /**
7730      * Inserts wrapper `details` in a comment at the top of the `source` body.
7731      *
7732      * @private
7733      * @param {string} source The source to modify.
7734      * @returns {Array} details The details to insert.
7735      * @returns {string} Returns the modified source.
7736      */
7737     function insertWrapDetails(source, details) {
7738       var length = details.length;
7739       if (!length) {
7740         return source;
7741       }
7742       var lastIndex = length - 1;
7743       details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
7744       details = details.join(length > 2 ? ', ' : ' ');
7745       return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
7746     }
7748     /**
7749      * Checks if `value` is a flattenable `arguments` object or array.
7750      *
7751      * @private
7752      * @param {*} value The value to check.
7753      * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
7754      */
7755     function isFlattenable(value) {
7756       return isArray(value) || isArguments(value) ||
7757         !!(spreadableSymbol && value && value[spreadableSymbol]);
7758     }
7760     /**
7761      * Checks if `value` is a valid array-like index.
7762      *
7763      * @private
7764      * @param {*} value The value to check.
7765      * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
7766      * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
7767      */
7768     function isIndex(value, length) {
7769       var type = typeof value;
7770       length = length == null ? MAX_SAFE_INTEGER : length;
7772       return !!length &&
7773         (type == 'number' ||
7774           (type != 'symbol' && reIsUint.test(value))) &&
7775             (value > -1 && value % 1 == 0 && value < length);
7776     }
7778     /**
7779      * Checks if the given arguments are from an iteratee call.
7780      *
7781      * @private
7782      * @param {*} value The potential iteratee value argument.
7783      * @param {*} index The potential iteratee index or key argument.
7784      * @param {*} object The potential iteratee object argument.
7785      * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
7786      *  else `false`.
7787      */
7788     function isIterateeCall(value, index, object) {
7789       if (!isObject(object)) {
7790         return false;
7791       }
7792       var type = typeof index;
7793       if (type == 'number'
7794             ? (isArrayLike(object) && isIndex(index, object.length))
7795             : (type == 'string' && index in object)
7796           ) {
7797         return eq(object[index], value);
7798       }
7799       return false;
7800     }
7802     /**
7803      * Checks if `value` is a property name and not a property path.
7804      *
7805      * @private
7806      * @param {*} value The value to check.
7807      * @param {Object} [object] The object to query keys on.
7808      * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
7809      */
7810     function isKey(value, object) {
7811       if (isArray(value)) {
7812         return false;
7813       }
7814       var type = typeof value;
7815       if (type == 'number' || type == 'symbol' || type == 'boolean' ||
7816           value == null || isSymbol(value)) {
7817         return true;
7818       }
7819       return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
7820         (object != null && value in Object(object));
7821     }
7823     /**
7824      * Checks if `value` is suitable for use as unique object key.
7825      *
7826      * @private
7827      * @param {*} value The value to check.
7828      * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
7829      */
7830     function isKeyable(value) {
7831       var type = typeof value;
7832       return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
7833         ? (value !== '__proto__')
7834         : (value === null);
7835     }
7837     /**
7838      * Checks if `func` has a lazy counterpart.
7839      *
7840      * @private
7841      * @param {Function} func The function to check.
7842      * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
7843      *  else `false`.
7844      */
7845     function isLaziable(func) {
7846       var funcName = getFuncName(func),
7847           other = lodash[funcName];
7849       if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
7850         return false;
7851       }
7852       if (func === other) {
7853         return true;
7854       }
7855       var data = getData(other);
7856       return !!data && func === data[0];
7857     }
7859     /**
7860      * Checks if `func` has its source masked.
7861      *
7862      * @private
7863      * @param {Function} func The function to check.
7864      * @returns {boolean} Returns `true` if `func` is masked, else `false`.
7865      */
7866     function isMasked(func) {
7867       return !!maskSrcKey && (maskSrcKey in func);
7868     }
7870     /**
7871      * Checks if `func` is capable of being masked.
7872      *
7873      * @private
7874      * @param {*} value The value to check.
7875      * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
7876      */
7877     var isMaskable = coreJsData ? isFunction : stubFalse;
7879     /**
7880      * Checks if `value` is likely a prototype object.
7881      *
7882      * @private
7883      * @param {*} value The value to check.
7884      * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
7885      */
7886     function isPrototype(value) {
7887       var Ctor = value && value.constructor,
7888           proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
7890       return value === proto;
7891     }
7893     /**
7894      * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
7895      *
7896      * @private
7897      * @param {*} value The value to check.
7898      * @returns {boolean} Returns `true` if `value` if suitable for strict
7899      *  equality comparisons, else `false`.
7900      */
7901     function isStrictComparable(value) {
7902       return value === value && !isObject(value);
7903     }
7905     /**
7906      * A specialized version of `matchesProperty` for source values suitable
7907      * for strict equality comparisons, i.e. `===`.
7908      *
7909      * @private
7910      * @param {string} key The key of the property to get.
7911      * @param {*} srcValue The value to match.
7912      * @returns {Function} Returns the new spec function.
7913      */
7914     function matchesStrictComparable(key, srcValue) {
7915       return function(object) {
7916         if (object == null) {
7917           return false;
7918         }
7919         return object[key] === srcValue &&
7920           (srcValue !== undefined || (key in Object(object)));
7921       };
7922     }
7924     /**
7925      * A specialized version of `_.memoize` which clears the memoized function's
7926      * cache when it exceeds `MAX_MEMOIZE_SIZE`.
7927      *
7928      * @private
7929      * @param {Function} func The function to have its output memoized.
7930      * @returns {Function} Returns the new memoized function.
7931      */
7932     function memoizeCapped(func) {
7933       var result = memoize(func, function(key) {
7934         if (cache.size === MAX_MEMOIZE_SIZE) {
7935           cache.clear();
7936         }
7937         return key;
7938       });
7940       var cache = result.cache;
7941       return result;
7942     }
7944     /**
7945      * Merges the function metadata of `source` into `data`.
7946      *
7947      * Merging metadata reduces the number of wrappers used to invoke a function.
7948      * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
7949      * may be applied regardless of execution order. Methods like `_.ary` and
7950      * `_.rearg` modify function arguments, making the order in which they are
7951      * executed important, preventing the merging of metadata. However, we make
7952      * an exception for a safe combined case where curried functions have `_.ary`
7953      * and or `_.rearg` applied.
7954      *
7955      * @private
7956      * @param {Array} data The destination metadata.
7957      * @param {Array} source The source metadata.
7958      * @returns {Array} Returns `data`.
7959      */
7960     function mergeData(data, source) {
7961       var bitmask = data[1],
7962           srcBitmask = source[1],
7963           newBitmask = bitmask | srcBitmask,
7964           isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
7966       var isCombo =
7967         ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
7968         ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
7969         ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));
7971       // Exit early if metadata can't be merged.
7972       if (!(isCommon || isCombo)) {
7973         return data;
7974       }
7975       // Use source `thisArg` if available.
7976       if (srcBitmask & WRAP_BIND_FLAG) {
7977         data[2] = source[2];
7978         // Set when currying a bound function.
7979         newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
7980       }
7981       // Compose partial arguments.
7982       var value = source[3];
7983       if (value) {
7984         var partials = data[3];
7985         data[3] = partials ? composeArgs(partials, value, source[4]) : value;
7986         data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
7987       }
7988       // Compose partial right arguments.
7989       value = source[5];
7990       if (value) {
7991         partials = data[5];
7992         data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
7993         data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
7994       }
7995       // Use source `argPos` if available.
7996       value = source[7];
7997       if (value) {
7998         data[7] = value;
7999       }
8000       // Use source `ary` if it's smaller.
8001       if (srcBitmask & WRAP_ARY_FLAG) {
8002         data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
8003       }
8004       // Use source `arity` if one is not provided.
8005       if (data[9] == null) {
8006         data[9] = source[9];
8007       }
8008       // Use source `func` and merge bitmasks.
8009       data[0] = source[0];
8010       data[1] = newBitmask;
8012       return data;
8013     }
8015     /**
8016      * This function is like
8017      * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
8018      * except that it includes inherited enumerable properties.
8019      *
8020      * @private
8021      * @param {Object} object The object to query.
8022      * @returns {Array} Returns the array of property names.
8023      */
8024     function nativeKeysIn(object) {
8025       var result = [];
8026       if (object != null) {
8027         for (var key in Object(object)) {
8028           result.push(key);
8029         }
8030       }
8031       return result;
8032     }
8034     /**
8035      * Converts `value` to a string using `Object.prototype.toString`.
8036      *
8037      * @private
8038      * @param {*} value The value to convert.
8039      * @returns {string} Returns the converted string.
8040      */
8041     function objectToString(value) {
8042       return nativeObjectToString.call(value);
8043     }
8045     /**
8046      * A specialized version of `baseRest` which transforms the rest array.
8047      *
8048      * @private
8049      * @param {Function} func The function to apply a rest parameter to.
8050      * @param {number} [start=func.length-1] The start position of the rest parameter.
8051      * @param {Function} transform The rest array transform.
8052      * @returns {Function} Returns the new function.
8053      */
8054     function overRest(func, start, transform) {
8055       start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
8056       return function() {
8057         var args = arguments,
8058             index = -1,
8059             length = nativeMax(args.length - start, 0),
8060             array = Array(length);
8062         while (++index < length) {
8063           array[index] = args[start + index];
8064         }
8065         index = -1;
8066         var otherArgs = Array(start + 1);
8067         while (++index < start) {
8068           otherArgs[index] = args[index];
8069         }
8070         otherArgs[start] = transform(array);
8071         return apply(func, this, otherArgs);
8072       };
8073     }
8075     /**
8076      * Gets the parent value at `path` of `object`.
8077      *
8078      * @private
8079      * @param {Object} object The object to query.
8080      * @param {Array} path The path to get the parent value of.
8081      * @returns {*} Returns the parent value.
8082      */
8083     function parent(object, path) {
8084       return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
8085     }
8087     /**
8088      * Reorder `array` according to the specified indexes where the element at
8089      * the first index is assigned as the first element, the element at
8090      * the second index is assigned as the second element, and so on.
8091      *
8092      * @private
8093      * @param {Array} array The array to reorder.
8094      * @param {Array} indexes The arranged array indexes.
8095      * @returns {Array} Returns `array`.
8096      */
8097     function reorder(array, indexes) {
8098       var arrLength = array.length,
8099           length = nativeMin(indexes.length, arrLength),
8100           oldArray = copyArray(array);
8102       while (length--) {
8103         var index = indexes[length];
8104         array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
8105       }
8106       return array;
8107     }
8109     /**
8110      * Sets metadata for `func`.
8111      *
8112      * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
8113      * period of time, it will trip its breaker and transition to an identity
8114      * function to avoid garbage collection pauses in V8. See
8115      * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
8116      * for more details.
8117      *
8118      * @private
8119      * @param {Function} func The function to associate metadata with.
8120      * @param {*} data The metadata.
8121      * @returns {Function} Returns `func`.
8122      */
8123     var setData = shortOut(baseSetData);
8125     /**
8126      * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
8127      *
8128      * @private
8129      * @param {Function} func The function to delay.
8130      * @param {number} wait The number of milliseconds to delay invocation.
8131      * @returns {number|Object} Returns the timer id or timeout object.
8132      */
8133     var setTimeout = ctxSetTimeout || function(func, wait) {
8134       return root.setTimeout(func, wait);
8135     };
8137     /**
8138      * Sets the `toString` method of `func` to return `string`.
8139      *
8140      * @private
8141      * @param {Function} func The function to modify.
8142      * @param {Function} string The `toString` result.
8143      * @returns {Function} Returns `func`.
8144      */
8145     var setToString = shortOut(baseSetToString);
8147     /**
8148      * Sets the `toString` method of `wrapper` to mimic the source of `reference`
8149      * with wrapper details in a comment at the top of the source body.
8150      *
8151      * @private
8152      * @param {Function} wrapper The function to modify.
8153      * @param {Function} reference The reference function.
8154      * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
8155      * @returns {Function} Returns `wrapper`.
8156      */
8157     function setWrapToString(wrapper, reference, bitmask) {
8158       var source = (reference + '');
8159       return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
8160     }
8162     /**
8163      * Creates a function that'll short out and invoke `identity` instead
8164      * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
8165      * milliseconds.
8166      *
8167      * @private
8168      * @param {Function} func The function to restrict.
8169      * @returns {Function} Returns the new shortable function.
8170      */
8171     function shortOut(func) {
8172       var count = 0,
8173           lastCalled = 0;
8175       return function() {
8176         var stamp = nativeNow(),
8177             remaining = HOT_SPAN - (stamp - lastCalled);
8179         lastCalled = stamp;
8180         if (remaining > 0) {
8181           if (++count >= HOT_COUNT) {
8182             return arguments[0];
8183           }
8184         } else {
8185           count = 0;
8186         }
8187         return func.apply(undefined, arguments);
8188       };
8189     }
8191     /**
8192      * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
8193      *
8194      * @private
8195      * @param {Array} array The array to shuffle.
8196      * @param {number} [size=array.length] The size of `array`.
8197      * @returns {Array} Returns `array`.
8198      */
8199     function shuffleSelf(array, size) {
8200       var index = -1,
8201           length = array.length,
8202           lastIndex = length - 1;
8204       size = size === undefined ? length : size;
8205       while (++index < size) {
8206         var rand = baseRandom(index, lastIndex),
8207             value = array[rand];
8209         array[rand] = array[index];
8210         array[index] = value;
8211       }
8212       array.length = size;
8213       return array;
8214     }
8216     /**
8217      * Converts `string` to a property path array.
8218      *
8219      * @private
8220      * @param {string} string The string to convert.
8221      * @returns {Array} Returns the property path array.
8222      */
8223     var stringToPath = memoizeCapped(function(string) {
8224       var result = [];
8225       if (string.charCodeAt(0) === 46 /* . */) {
8226         result.push('');
8227       }
8228       string.replace(rePropName, function(match, number, quote, subString) {
8229         result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
8230       });
8231       return result;
8232     });
8234     /**
8235      * Converts `value` to a string key if it's not a string or symbol.
8236      *
8237      * @private
8238      * @param {*} value The value to inspect.
8239      * @returns {string|symbol} Returns the key.
8240      */
8241     function toKey(value) {
8242       if (typeof value == 'string' || isSymbol(value)) {
8243         return value;
8244       }
8245       var result = (value + '');
8246       return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
8247     }
8249     /**
8250      * Converts `func` to its source code.
8251      *
8252      * @private
8253      * @param {Function} func The function to convert.
8254      * @returns {string} Returns the source code.
8255      */
8256     function toSource(func) {
8257       if (func != null) {
8258         try {
8259           return funcToString.call(func);
8260         } catch (e) {}
8261         try {
8262           return (func + '');
8263         } catch (e) {}
8264       }
8265       return '';
8266     }
8268     /**
8269      * Updates wrapper `details` based on `bitmask` flags.
8270      *
8271      * @private
8272      * @returns {Array} details The details to modify.
8273      * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
8274      * @returns {Array} Returns `details`.
8275      */
8276     function updateWrapDetails(details, bitmask) {
8277       arrayEach(wrapFlags, function(pair) {
8278         var value = '_.' + pair[0];
8279         if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
8280           details.push(value);
8281         }
8282       });
8283       return details.sort();
8284     }
8286     /**
8287      * Creates a clone of `wrapper`.
8288      *
8289      * @private
8290      * @param {Object} wrapper The wrapper to clone.
8291      * @returns {Object} Returns the cloned wrapper.
8292      */
8293     function wrapperClone(wrapper) {
8294       if (wrapper instanceof LazyWrapper) {
8295         return wrapper.clone();
8296       }
8297       var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
8298       result.__actions__ = copyArray(wrapper.__actions__);
8299       result.__index__  = wrapper.__index__;
8300       result.__values__ = wrapper.__values__;
8301       return result;
8302     }
8304     /*------------------------------------------------------------------------*/
8306     /**
8307      * Creates an array of elements split into groups the length of `size`.
8308      * If `array` can't be split evenly, the final chunk will be the remaining
8309      * elements.
8310      *
8311      * @static
8312      * @memberOf _
8313      * @since 3.0.0
8314      * @category Array
8315      * @param {Array} array The array to process.
8316      * @param {number} [size=1] The length of each chunk
8317      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
8318      * @returns {Array} Returns the new array of chunks.
8319      * @example
8320      *
8321      * _.chunk(['a', 'b', 'c', 'd'], 2);
8322      * // => [['a', 'b'], ['c', 'd']]
8323      *
8324      * _.chunk(['a', 'b', 'c', 'd'], 3);
8325      * // => [['a', 'b', 'c'], ['d']]
8326      */
8327     function chunk(array, size, guard) {
8328       if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
8329         size = 1;
8330       } else {
8331         size = nativeMax(toInteger(size), 0);
8332       }
8333       var length = array == null ? 0 : array.length;
8334       if (!length || size < 1) {
8335         return [];
8336       }
8337       var index = 0,
8338           resIndex = 0,
8339           result = Array(nativeCeil(length / size));
8341       while (index < length) {
8342         result[resIndex++] = baseSlice(array, index, (index += size));
8343       }
8344       return result;
8345     }
8347     /**
8348      * Creates an array with all falsey values removed. The values `false`, `null`,
8349      * `0`, `""`, `undefined`, and `NaN` are falsey.
8350      *
8351      * @static
8352      * @memberOf _
8353      * @since 0.1.0
8354      * @category Array
8355      * @param {Array} array The array to compact.
8356      * @returns {Array} Returns the new array of filtered values.
8357      * @example
8358      *
8359      * _.compact([0, 1, false, 2, '', 3]);
8360      * // => [1, 2, 3]
8361      */
8362     function compact(array) {
8363       var index = -1,
8364           length = array == null ? 0 : array.length,
8365           resIndex = 0,
8366           result = [];
8368       while (++index < length) {
8369         var value = array[index];
8370         if (value) {
8371           result[resIndex++] = value;
8372         }
8373       }
8374       return result;
8375     }
8377     /**
8378      * Creates a new array concatenating `array` with any additional arrays
8379      * and/or values.
8380      *
8381      * @static
8382      * @memberOf _
8383      * @since 4.0.0
8384      * @category Array
8385      * @param {Array} array The array to concatenate.
8386      * @param {...*} [values] The values to concatenate.
8387      * @returns {Array} Returns the new concatenated array.
8388      * @example
8389      *
8390      * var array = [1];
8391      * var other = _.concat(array, 2, [3], [[4]]);
8392      *
8393      * console.log(other);
8394      * // => [1, 2, 3, [4]]
8395      *
8396      * console.log(array);
8397      * // => [1]
8398      */
8399     function concat() {
8400       var length = arguments.length;
8401       if (!length) {
8402         return [];
8403       }
8404       var args = Array(length - 1),
8405           array = arguments[0],
8406           index = length;
8408       while (index--) {
8409         args[index - 1] = arguments[index];
8410       }
8411       return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
8412     }
8414     /**
8415      * Creates an array of `array` values not included in the other given arrays
8416      * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8417      * for equality comparisons. The order and references of result values are
8418      * determined by the first array.
8419      *
8420      * **Note:** Unlike `_.pullAll`, this method returns a new array.
8421      *
8422      * @static
8423      * @memberOf _
8424      * @since 0.1.0
8425      * @category Array
8426      * @param {Array} array The array to inspect.
8427      * @param {...Array} [values] The values to exclude.
8428      * @returns {Array} Returns the new array of filtered values.
8429      * @see _.without, _.xor
8430      * @example
8431      *
8432      * _.difference([2, 1], [2, 3]);
8433      * // => [1]
8434      */
8435     var difference = baseRest(function(array, values) {
8436       return isArrayLikeObject(array)
8437         ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
8438         : [];
8439     });
8441     /**
8442      * This method is like `_.difference` except that it accepts `iteratee` which
8443      * is invoked for each element of `array` and `values` to generate the criterion
8444      * by which they're compared. The order and references of result values are
8445      * determined by the first array. The iteratee is invoked with one argument:
8446      * (value).
8447      *
8448      * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
8449      *
8450      * @static
8451      * @memberOf _
8452      * @since 4.0.0
8453      * @category Array
8454      * @param {Array} array The array to inspect.
8455      * @param {...Array} [values] The values to exclude.
8456      * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8457      * @returns {Array} Returns the new array of filtered values.
8458      * @example
8459      *
8460      * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
8461      * // => [1.2]
8462      *
8463      * // The `_.property` iteratee shorthand.
8464      * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
8465      * // => [{ 'x': 2 }]
8466      */
8467     var differenceBy = baseRest(function(array, values) {
8468       var iteratee = last(values);
8469       if (isArrayLikeObject(iteratee)) {
8470         iteratee = undefined;
8471       }
8472       return isArrayLikeObject(array)
8473         ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
8474         : [];
8475     });
8477     /**
8478      * This method is like `_.difference` except that it accepts `comparator`
8479      * which is invoked to compare elements of `array` to `values`. The order and
8480      * references of result values are determined by the first array. The comparator
8481      * is invoked with two arguments: (arrVal, othVal).
8482      *
8483      * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
8484      *
8485      * @static
8486      * @memberOf _
8487      * @since 4.0.0
8488      * @category Array
8489      * @param {Array} array The array to inspect.
8490      * @param {...Array} [values] The values to exclude.
8491      * @param {Function} [comparator] The comparator invoked per element.
8492      * @returns {Array} Returns the new array of filtered values.
8493      * @example
8494      *
8495      * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
8496      *
8497      * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
8498      * // => [{ 'x': 2, 'y': 1 }]
8499      */
8500     var differenceWith = baseRest(function(array, values) {
8501       var comparator = last(values);
8502       if (isArrayLikeObject(comparator)) {
8503         comparator = undefined;
8504       }
8505       return isArrayLikeObject(array)
8506         ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
8507         : [];
8508     });
8510     /**
8511      * Creates a slice of `array` with `n` elements dropped from the beginning.
8512      *
8513      * @static
8514      * @memberOf _
8515      * @since 0.5.0
8516      * @category Array
8517      * @param {Array} array The array to query.
8518      * @param {number} [n=1] The number of elements to drop.
8519      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
8520      * @returns {Array} Returns the slice of `array`.
8521      * @example
8522      *
8523      * _.drop([1, 2, 3]);
8524      * // => [2, 3]
8525      *
8526      * _.drop([1, 2, 3], 2);
8527      * // => [3]
8528      *
8529      * _.drop([1, 2, 3], 5);
8530      * // => []
8531      *
8532      * _.drop([1, 2, 3], 0);
8533      * // => [1, 2, 3]
8534      */
8535     function drop(array, n, guard) {
8536       var length = array == null ? 0 : array.length;
8537       if (!length) {
8538         return [];
8539       }
8540       n = (guard || n === undefined) ? 1 : toInteger(n);
8541       return baseSlice(array, n < 0 ? 0 : n, length);
8542     }
8544     /**
8545      * Creates a slice of `array` with `n` elements dropped from the end.
8546      *
8547      * @static
8548      * @memberOf _
8549      * @since 3.0.0
8550      * @category Array
8551      * @param {Array} array The array to query.
8552      * @param {number} [n=1] The number of elements to drop.
8553      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
8554      * @returns {Array} Returns the slice of `array`.
8555      * @example
8556      *
8557      * _.dropRight([1, 2, 3]);
8558      * // => [1, 2]
8559      *
8560      * _.dropRight([1, 2, 3], 2);
8561      * // => [1]
8562      *
8563      * _.dropRight([1, 2, 3], 5);
8564      * // => []
8565      *
8566      * _.dropRight([1, 2, 3], 0);
8567      * // => [1, 2, 3]
8568      */
8569     function dropRight(array, n, guard) {
8570       var length = array == null ? 0 : array.length;
8571       if (!length) {
8572         return [];
8573       }
8574       n = (guard || n === undefined) ? 1 : toInteger(n);
8575       n = length - n;
8576       return baseSlice(array, 0, n < 0 ? 0 : n);
8577     }
8579     /**
8580      * Creates a slice of `array` excluding elements dropped from the end.
8581      * Elements are dropped until `predicate` returns falsey. The predicate is
8582      * invoked with three arguments: (value, index, array).
8583      *
8584      * @static
8585      * @memberOf _
8586      * @since 3.0.0
8587      * @category Array
8588      * @param {Array} array The array to query.
8589      * @param {Function} [predicate=_.identity] The function invoked per iteration.
8590      * @returns {Array} Returns the slice of `array`.
8591      * @example
8592      *
8593      * var users = [
8594      *   { 'user': 'barney',  'active': true },
8595      *   { 'user': 'fred',    'active': false },
8596      *   { 'user': 'pebbles', 'active': false }
8597      * ];
8598      *
8599      * _.dropRightWhile(users, function(o) { return !o.active; });
8600      * // => objects for ['barney']
8601      *
8602      * // The `_.matches` iteratee shorthand.
8603      * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
8604      * // => objects for ['barney', 'fred']
8605      *
8606      * // The `_.matchesProperty` iteratee shorthand.
8607      * _.dropRightWhile(users, ['active', false]);
8608      * // => objects for ['barney']
8609      *
8610      * // The `_.property` iteratee shorthand.
8611      * _.dropRightWhile(users, 'active');
8612      * // => objects for ['barney', 'fred', 'pebbles']
8613      */
8614     function dropRightWhile(array, predicate) {
8615       return (array && array.length)
8616         ? baseWhile(array, getIteratee(predicate, 3), true, true)
8617         : [];
8618     }
8620     /**
8621      * Creates a slice of `array` excluding elements dropped from the beginning.
8622      * Elements are dropped until `predicate` returns falsey. The predicate is
8623      * invoked with three arguments: (value, index, array).
8624      *
8625      * @static
8626      * @memberOf _
8627      * @since 3.0.0
8628      * @category Array
8629      * @param {Array} array The array to query.
8630      * @param {Function} [predicate=_.identity] The function invoked per iteration.
8631      * @returns {Array} Returns the slice of `array`.
8632      * @example
8633      *
8634      * var users = [
8635      *   { 'user': 'barney',  'active': false },
8636      *   { 'user': 'fred',    'active': false },
8637      *   { 'user': 'pebbles', 'active': true }
8638      * ];
8639      *
8640      * _.dropWhile(users, function(o) { return !o.active; });
8641      * // => objects for ['pebbles']
8642      *
8643      * // The `_.matches` iteratee shorthand.
8644      * _.dropWhile(users, { 'user': 'barney', 'active': false });
8645      * // => objects for ['fred', 'pebbles']
8646      *
8647      * // The `_.matchesProperty` iteratee shorthand.
8648      * _.dropWhile(users, ['active', false]);
8649      * // => objects for ['pebbles']
8650      *
8651      * // The `_.property` iteratee shorthand.
8652      * _.dropWhile(users, 'active');
8653      * // => objects for ['barney', 'fred', 'pebbles']
8654      */
8655     function dropWhile(array, predicate) {
8656       return (array && array.length)
8657         ? baseWhile(array, getIteratee(predicate, 3), true)
8658         : [];
8659     }
8661     /**
8662      * Fills elements of `array` with `value` from `start` up to, but not
8663      * including, `end`.
8664      *
8665      * **Note:** This method mutates `array`.
8666      *
8667      * @static
8668      * @memberOf _
8669      * @since 3.2.0
8670      * @category Array
8671      * @param {Array} array The array to fill.
8672      * @param {*} value The value to fill `array` with.
8673      * @param {number} [start=0] The start position.
8674      * @param {number} [end=array.length] The end position.
8675      * @returns {Array} Returns `array`.
8676      * @example
8677      *
8678      * var array = [1, 2, 3];
8679      *
8680      * _.fill(array, 'a');
8681      * console.log(array);
8682      * // => ['a', 'a', 'a']
8683      *
8684      * _.fill(Array(3), 2);
8685      * // => [2, 2, 2]
8686      *
8687      * _.fill([4, 6, 8, 10], '*', 1, 3);
8688      * // => [4, '*', '*', 10]
8689      */
8690     function fill(array, value, start, end) {
8691       var length = array == null ? 0 : array.length;
8692       if (!length) {
8693         return [];
8694       }
8695       if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
8696         start = 0;
8697         end = length;
8698       }
8699       return baseFill(array, value, start, end);
8700     }
8702     /**
8703      * This method is like `_.find` except that it returns the index of the first
8704      * element `predicate` returns truthy for instead of the element itself.
8705      *
8706      * @static
8707      * @memberOf _
8708      * @since 1.1.0
8709      * @category Array
8710      * @param {Array} array The array to inspect.
8711      * @param {Function} [predicate=_.identity] The function invoked per iteration.
8712      * @param {number} [fromIndex=0] The index to search from.
8713      * @returns {number} Returns the index of the found element, else `-1`.
8714      * @example
8715      *
8716      * var users = [
8717      *   { 'user': 'barney',  'active': false },
8718      *   { 'user': 'fred',    'active': false },
8719      *   { 'user': 'pebbles', 'active': true }
8720      * ];
8721      *
8722      * _.findIndex(users, function(o) { return o.user == 'barney'; });
8723      * // => 0
8724      *
8725      * // The `_.matches` iteratee shorthand.
8726      * _.findIndex(users, { 'user': 'fred', 'active': false });
8727      * // => 1
8728      *
8729      * // The `_.matchesProperty` iteratee shorthand.
8730      * _.findIndex(users, ['active', false]);
8731      * // => 0
8732      *
8733      * // The `_.property` iteratee shorthand.
8734      * _.findIndex(users, 'active');
8735      * // => 2
8736      */
8737     function findIndex(array, predicate, fromIndex) {
8738       var length = array == null ? 0 : array.length;
8739       if (!length) {
8740         return -1;
8741       }
8742       var index = fromIndex == null ? 0 : toInteger(fromIndex);
8743       if (index < 0) {
8744         index = nativeMax(length + index, 0);
8745       }
8746       return baseFindIndex(array, getIteratee(predicate, 3), index);
8747     }
8749     /**
8750      * This method is like `_.findIndex` except that it iterates over elements
8751      * of `collection` from right to left.
8752      *
8753      * @static
8754      * @memberOf _
8755      * @since 2.0.0
8756      * @category Array
8757      * @param {Array} array The array to inspect.
8758      * @param {Function} [predicate=_.identity] The function invoked per iteration.
8759      * @param {number} [fromIndex=array.length-1] The index to search from.
8760      * @returns {number} Returns the index of the found element, else `-1`.
8761      * @example
8762      *
8763      * var users = [
8764      *   { 'user': 'barney',  'active': true },
8765      *   { 'user': 'fred',    'active': false },
8766      *   { 'user': 'pebbles', 'active': false }
8767      * ];
8768      *
8769      * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
8770      * // => 2
8771      *
8772      * // The `_.matches` iteratee shorthand.
8773      * _.findLastIndex(users, { 'user': 'barney', 'active': true });
8774      * // => 0
8775      *
8776      * // The `_.matchesProperty` iteratee shorthand.
8777      * _.findLastIndex(users, ['active', false]);
8778      * // => 2
8779      *
8780      * // The `_.property` iteratee shorthand.
8781      * _.findLastIndex(users, 'active');
8782      * // => 0
8783      */
8784     function findLastIndex(array, predicate, fromIndex) {
8785       var length = array == null ? 0 : array.length;
8786       if (!length) {
8787         return -1;
8788       }
8789       var index = length - 1;
8790       if (fromIndex !== undefined) {
8791         index = toInteger(fromIndex);
8792         index = fromIndex < 0
8793           ? nativeMax(length + index, 0)
8794           : nativeMin(index, length - 1);
8795       }
8796       return baseFindIndex(array, getIteratee(predicate, 3), index, true);
8797     }
8799     /**
8800      * Flattens `array` a single level deep.
8801      *
8802      * @static
8803      * @memberOf _
8804      * @since 0.1.0
8805      * @category Array
8806      * @param {Array} array The array to flatten.
8807      * @returns {Array} Returns the new flattened array.
8808      * @example
8809      *
8810      * _.flatten([1, [2, [3, [4]], 5]]);
8811      * // => [1, 2, [3, [4]], 5]
8812      */
8813     function flatten(array) {
8814       var length = array == null ? 0 : array.length;
8815       return length ? baseFlatten(array, 1) : [];
8816     }
8818     /**
8819      * Recursively flattens `array`.
8820      *
8821      * @static
8822      * @memberOf _
8823      * @since 3.0.0
8824      * @category Array
8825      * @param {Array} array The array to flatten.
8826      * @returns {Array} Returns the new flattened array.
8827      * @example
8828      *
8829      * _.flattenDeep([1, [2, [3, [4]], 5]]);
8830      * // => [1, 2, 3, 4, 5]
8831      */
8832     function flattenDeep(array) {
8833       var length = array == null ? 0 : array.length;
8834       return length ? baseFlatten(array, INFINITY) : [];
8835     }
8837     /**
8838      * Recursively flatten `array` up to `depth` times.
8839      *
8840      * @static
8841      * @memberOf _
8842      * @since 4.4.0
8843      * @category Array
8844      * @param {Array} array The array to flatten.
8845      * @param {number} [depth=1] The maximum recursion depth.
8846      * @returns {Array} Returns the new flattened array.
8847      * @example
8848      *
8849      * var array = [1, [2, [3, [4]], 5]];
8850      *
8851      * _.flattenDepth(array, 1);
8852      * // => [1, 2, [3, [4]], 5]
8853      *
8854      * _.flattenDepth(array, 2);
8855      * // => [1, 2, 3, [4], 5]
8856      */
8857     function flattenDepth(array, depth) {
8858       var length = array == null ? 0 : array.length;
8859       if (!length) {
8860         return [];
8861       }
8862       depth = depth === undefined ? 1 : toInteger(depth);
8863       return baseFlatten(array, depth);
8864     }
8866     /**
8867      * The inverse of `_.toPairs`; this method returns an object composed
8868      * from key-value `pairs`.
8869      *
8870      * @static
8871      * @memberOf _
8872      * @since 4.0.0
8873      * @category Array
8874      * @param {Array} pairs The key-value pairs.
8875      * @returns {Object} Returns the new object.
8876      * @example
8877      *
8878      * _.fromPairs([['a', 1], ['b', 2]]);
8879      * // => { 'a': 1, 'b': 2 }
8880      */
8881     function fromPairs(pairs) {
8882       var index = -1,
8883           length = pairs == null ? 0 : pairs.length,
8884           result = {};
8886       while (++index < length) {
8887         var pair = pairs[index];
8888         result[pair[0]] = pair[1];
8889       }
8890       return result;
8891     }
8893     /**
8894      * Gets the first element of `array`.
8895      *
8896      * @static
8897      * @memberOf _
8898      * @since 0.1.0
8899      * @alias first
8900      * @category Array
8901      * @param {Array} array The array to query.
8902      * @returns {*} Returns the first element of `array`.
8903      * @example
8904      *
8905      * _.head([1, 2, 3]);
8906      * // => 1
8907      *
8908      * _.head([]);
8909      * // => undefined
8910      */
8911     function head(array) {
8912       return (array && array.length) ? array[0] : undefined;
8913     }
8915     /**
8916      * Gets the index at which the first occurrence of `value` is found in `array`
8917      * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8918      * for equality comparisons. If `fromIndex` is negative, it's used as the
8919      * offset from the end of `array`.
8920      *
8921      * @static
8922      * @memberOf _
8923      * @since 0.1.0
8924      * @category Array
8925      * @param {Array} array The array to inspect.
8926      * @param {*} value The value to search for.
8927      * @param {number} [fromIndex=0] The index to search from.
8928      * @returns {number} Returns the index of the matched value, else `-1`.
8929      * @example
8930      *
8931      * _.indexOf([1, 2, 1, 2], 2);
8932      * // => 1
8933      *
8934      * // Search from the `fromIndex`.
8935      * _.indexOf([1, 2, 1, 2], 2, 2);
8936      * // => 3
8937      */
8938     function indexOf(array, value, fromIndex) {
8939       var length = array == null ? 0 : array.length;
8940       if (!length) {
8941         return -1;
8942       }
8943       var index = fromIndex == null ? 0 : toInteger(fromIndex);
8944       if (index < 0) {
8945         index = nativeMax(length + index, 0);
8946       }
8947       return baseIndexOf(array, value, index);
8948     }
8950     /**
8951      * Gets all but the last element of `array`.
8952      *
8953      * @static
8954      * @memberOf _
8955      * @since 0.1.0
8956      * @category Array
8957      * @param {Array} array The array to query.
8958      * @returns {Array} Returns the slice of `array`.
8959      * @example
8960      *
8961      * _.initial([1, 2, 3]);
8962      * // => [1, 2]
8963      */
8964     function initial(array) {
8965       var length = array == null ? 0 : array.length;
8966       return length ? baseSlice(array, 0, -1) : [];
8967     }
8969     /**
8970      * Creates an array of unique values that are included in all given arrays
8971      * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8972      * for equality comparisons. The order and references of result values are
8973      * determined by the first array.
8974      *
8975      * @static
8976      * @memberOf _
8977      * @since 0.1.0
8978      * @category Array
8979      * @param {...Array} [arrays] The arrays to inspect.
8980      * @returns {Array} Returns the new array of intersecting values.
8981      * @example
8982      *
8983      * _.intersection([2, 1], [2, 3]);
8984      * // => [2]
8985      */
8986     var intersection = baseRest(function(arrays) {
8987       var mapped = arrayMap(arrays, castArrayLikeObject);
8988       return (mapped.length && mapped[0] === arrays[0])
8989         ? baseIntersection(mapped)
8990         : [];
8991     });
8993     /**
8994      * This method is like `_.intersection` except that it accepts `iteratee`
8995      * which is invoked for each element of each `arrays` to generate the criterion
8996      * by which they're compared. The order and references of result values are
8997      * determined by the first array. The iteratee is invoked with one argument:
8998      * (value).
8999      *
9000      * @static
9001      * @memberOf _
9002      * @since 4.0.0
9003      * @category Array
9004      * @param {...Array} [arrays] The arrays to inspect.
9005      * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
9006      * @returns {Array} Returns the new array of intersecting values.
9007      * @example
9008      *
9009      * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
9010      * // => [2.1]
9011      *
9012      * // The `_.property` iteratee shorthand.
9013      * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
9014      * // => [{ 'x': 1 }]
9015      */
9016     var intersectionBy = baseRest(function(arrays) {
9017       var iteratee = last(arrays),
9018           mapped = arrayMap(arrays, castArrayLikeObject);
9020       if (iteratee === last(mapped)) {
9021         iteratee = undefined;
9022       } else {
9023         mapped.pop();
9024       }
9025       return (mapped.length && mapped[0] === arrays[0])
9026         ? baseIntersection(mapped, getIteratee(iteratee, 2))
9027         : [];
9028     });
9030     /**
9031      * This method is like `_.intersection` except that it accepts `comparator`
9032      * which is invoked to compare elements of `arrays`. The order and references
9033      * of result values are determined by the first array. The comparator is
9034      * invoked with two arguments: (arrVal, othVal).
9035      *
9036      * @static
9037      * @memberOf _
9038      * @since 4.0.0
9039      * @category Array
9040      * @param {...Array} [arrays] The arrays to inspect.
9041      * @param {Function} [comparator] The comparator invoked per element.
9042      * @returns {Array} Returns the new array of intersecting values.
9043      * @example
9044      *
9045      * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
9046      * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
9047      *
9048      * _.intersectionWith(objects, others, _.isEqual);
9049      * // => [{ 'x': 1, 'y': 2 }]
9050      */
9051     var intersectionWith = baseRest(function(arrays) {
9052       var comparator = last(arrays),
9053           mapped = arrayMap(arrays, castArrayLikeObject);
9055       comparator = typeof comparator == 'function' ? comparator : undefined;
9056       if (comparator) {
9057         mapped.pop();
9058       }
9059       return (mapped.length && mapped[0] === arrays[0])
9060         ? baseIntersection(mapped, undefined, comparator)
9061         : [];
9062     });
9064     /**
9065      * Converts all elements in `array` into a string separated by `separator`.
9066      *
9067      * @static
9068      * @memberOf _
9069      * @since 4.0.0
9070      * @category Array
9071      * @param {Array} array The array to convert.
9072      * @param {string} [separator=','] The element separator.
9073      * @returns {string} Returns the joined string.
9074      * @example
9075      *
9076      * _.join(['a', 'b', 'c'], '~');
9077      * // => 'a~b~c'
9078      */
9079     function join(array, separator) {
9080       return array == null ? '' : nativeJoin.call(array, separator);
9081     }
9083     /**
9084      * Gets the last element of `array`.
9085      *
9086      * @static
9087      * @memberOf _
9088      * @since 0.1.0
9089      * @category Array
9090      * @param {Array} array The array to query.
9091      * @returns {*} Returns the last element of `array`.
9092      * @example
9093      *
9094      * _.last([1, 2, 3]);
9095      * // => 3
9096      */
9097     function last(array) {
9098       var length = array == null ? 0 : array.length;
9099       return length ? array[length - 1] : undefined;
9100     }
9102     /**
9103      * This method is like `_.indexOf` except that it iterates over elements of
9104      * `array` from right to left.
9105      *
9106      * @static
9107      * @memberOf _
9108      * @since 0.1.0
9109      * @category Array
9110      * @param {Array} array The array to inspect.
9111      * @param {*} value The value to search for.
9112      * @param {number} [fromIndex=array.length-1] The index to search from.
9113      * @returns {number} Returns the index of the matched value, else `-1`.
9114      * @example
9115      *
9116      * _.lastIndexOf([1, 2, 1, 2], 2);
9117      * // => 3
9118      *
9119      * // Search from the `fromIndex`.
9120      * _.lastIndexOf([1, 2, 1, 2], 2, 2);
9121      * // => 1
9122      */
9123     function lastIndexOf(array, value, fromIndex) {
9124       var length = array == null ? 0 : array.length;
9125       if (!length) {
9126         return -1;
9127       }
9128       var index = length;
9129       if (fromIndex !== undefined) {
9130         index = toInteger(fromIndex);
9131         index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
9132       }
9133       return value === value
9134         ? strictLastIndexOf(array, value, index)
9135         : baseFindIndex(array, baseIsNaN, index, true);
9136     }
9138     /**
9139      * Gets the element at index `n` of `array`. If `n` is negative, the nth
9140      * element from the end is returned.
9141      *
9142      * @static
9143      * @memberOf _
9144      * @since 4.11.0
9145      * @category Array
9146      * @param {Array} array The array to query.
9147      * @param {number} [n=0] The index of the element to return.
9148      * @returns {*} Returns the nth element of `array`.
9149      * @example
9150      *
9151      * var array = ['a', 'b', 'c', 'd'];
9152      *
9153      * _.nth(array, 1);
9154      * // => 'b'
9155      *
9156      * _.nth(array, -2);
9157      * // => 'c';
9158      */
9159     function nth(array, n) {
9160       return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
9161     }
9163     /**
9164      * Removes all given values from `array` using
9165      * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
9166      * for equality comparisons.
9167      *
9168      * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
9169      * to remove elements from an array by predicate.
9170      *
9171      * @static
9172      * @memberOf _
9173      * @since 2.0.0
9174      * @category Array
9175      * @param {Array} array The array to modify.
9176      * @param {...*} [values] The values to remove.
9177      * @returns {Array} Returns `array`.
9178      * @example
9179      *
9180      * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
9181      *
9182      * _.pull(array, 'a', 'c');
9183      * console.log(array);
9184      * // => ['b', 'b']
9185      */
9186     var pull = baseRest(pullAll);
9188     /**
9189      * This method is like `_.pull` except that it accepts an array of values to remove.
9190      *
9191      * **Note:** Unlike `_.difference`, this method mutates `array`.
9192      *
9193      * @static
9194      * @memberOf _
9195      * @since 4.0.0
9196      * @category Array
9197      * @param {Array} array The array to modify.
9198      * @param {Array} values The values to remove.
9199      * @returns {Array} Returns `array`.
9200      * @example
9201      *
9202      * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
9203      *
9204      * _.pullAll(array, ['a', 'c']);
9205      * console.log(array);
9206      * // => ['b', 'b']
9207      */
9208     function pullAll(array, values) {
9209       return (array && array.length && values && values.length)
9210         ? basePullAll(array, values)
9211         : array;
9212     }
9214     /**
9215      * This method is like `_.pullAll` except that it accepts `iteratee` which is
9216      * invoked for each element of `array` and `values` to generate the criterion
9217      * by which they're compared. The iteratee is invoked with one argument: (value).
9218      *
9219      * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
9220      *
9221      * @static
9222      * @memberOf _
9223      * @since 4.0.0
9224      * @category Array
9225      * @param {Array} array The array to modify.
9226      * @param {Array} values The values to remove.
9227      * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
9228      * @returns {Array} Returns `array`.
9229      * @example
9230      *
9231      * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
9232      *
9233      * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
9234      * console.log(array);
9235      * // => [{ 'x': 2 }]
9236      */
9237     function pullAllBy(array, values, iteratee) {
9238       return (array && array.length && values && values.length)
9239         ? basePullAll(array, values, getIteratee(iteratee, 2))
9240         : array;
9241     }
9243     /**
9244      * This method is like `_.pullAll` except that it accepts `comparator` which
9245      * is invoked to compare elements of `array` to `values`. The comparator is
9246      * invoked with two arguments: (arrVal, othVal).
9247      *
9248      * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
9249      *
9250      * @static
9251      * @memberOf _
9252      * @since 4.6.0
9253      * @category Array
9254      * @param {Array} array The array to modify.
9255      * @param {Array} values The values to remove.
9256      * @param {Function} [comparator] The comparator invoked per element.
9257      * @returns {Array} Returns `array`.
9258      * @example
9259      *
9260      * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
9261      *
9262      * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
9263      * console.log(array);
9264      * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
9265      */
9266     function pullAllWith(array, values, comparator) {
9267       return (array && array.length && values && values.length)
9268         ? basePullAll(array, values, undefined, comparator)
9269         : array;
9270     }
9272     /**
9273      * Removes elements from `array` corresponding to `indexes` and returns an
9274      * array of removed elements.
9275      *
9276      * **Note:** Unlike `_.at`, this method mutates `array`.
9277      *
9278      * @static
9279      * @memberOf _
9280      * @since 3.0.0
9281      * @category Array
9282      * @param {Array} array The array to modify.
9283      * @param {...(number|number[])} [indexes] The indexes of elements to remove.
9284      * @returns {Array} Returns the new array of removed elements.
9285      * @example
9286      *
9287      * var array = ['a', 'b', 'c', 'd'];
9288      * var pulled = _.pullAt(array, [1, 3]);
9289      *
9290      * console.log(array);
9291      * // => ['a', 'c']
9292      *
9293      * console.log(pulled);
9294      * // => ['b', 'd']
9295      */
9296     var pullAt = flatRest(function(array, indexes) {
9297       var length = array == null ? 0 : array.length,
9298           result = baseAt(array, indexes);
9300       basePullAt(array, arrayMap(indexes, function(index) {
9301         return isIndex(index, length) ? +index : index;
9302       }).sort(compareAscending));
9304       return result;
9305     });
9307     /**
9308      * Removes all elements from `array` that `predicate` returns truthy for
9309      * and returns an array of the removed elements. The predicate is invoked
9310      * with three arguments: (value, index, array).
9311      *
9312      * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
9313      * to pull elements from an array by value.
9314      *
9315      * @static
9316      * @memberOf _
9317      * @since 2.0.0
9318      * @category Array
9319      * @param {Array} array The array to modify.
9320      * @param {Function} [predicate=_.identity] The function invoked per iteration.
9321      * @returns {Array} Returns the new array of removed elements.
9322      * @example
9323      *
9324      * var array = [1, 2, 3, 4];
9325      * var evens = _.remove(array, function(n) {
9326      *   return n % 2 == 0;
9327      * });
9328      *
9329      * console.log(array);
9330      * // => [1, 3]
9331      *
9332      * console.log(evens);
9333      * // => [2, 4]
9334      */
9335     function remove(array, predicate) {
9336       var result = [];
9337       if (!(array && array.length)) {
9338         return result;
9339       }
9340       var index = -1,
9341           indexes = [],
9342           length = array.length;
9344       predicate = getIteratee(predicate, 3);
9345       while (++index < length) {
9346         var value = array[index];
9347         if (predicate(value, index, array)) {
9348           result.push(value);
9349           indexes.push(index);
9350         }
9351       }
9352       basePullAt(array, indexes);
9353       return result;
9354     }
9356     /**
9357      * Reverses `array` so that the first element becomes the last, the second
9358      * element becomes the second to last, and so on.
9359      *
9360      * **Note:** This method mutates `array` and is based on
9361      * [`Array#reverse`](https://mdn.io/Array/reverse).
9362      *
9363      * @static
9364      * @memberOf _
9365      * @since 4.0.0
9366      * @category Array
9367      * @param {Array} array The array to modify.
9368      * @returns {Array} Returns `array`.
9369      * @example
9370      *
9371      * var array = [1, 2, 3];
9372      *
9373      * _.reverse(array);
9374      * // => [3, 2, 1]
9375      *
9376      * console.log(array);
9377      * // => [3, 2, 1]
9378      */
9379     function reverse(array) {
9380       return array == null ? array : nativeReverse.call(array);
9381     }
9383     /**
9384      * Creates a slice of `array` from `start` up to, but not including, `end`.
9385      *
9386      * **Note:** This method is used instead of
9387      * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
9388      * returned.
9389      *
9390      * @static
9391      * @memberOf _
9392      * @since 3.0.0
9393      * @category Array
9394      * @param {Array} array The array to slice.
9395      * @param {number} [start=0] The start position.
9396      * @param {number} [end=array.length] The end position.
9397      * @returns {Array} Returns the slice of `array`.
9398      */
9399     function slice(array, start, end) {
9400       var length = array == null ? 0 : array.length;
9401       if (!length) {
9402         return [];
9403       }
9404       if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
9405         start = 0;
9406         end = length;
9407       }
9408       else {
9409         start = start == null ? 0 : toInteger(start);
9410         end = end === undefined ? length : toInteger(end);
9411       }
9412       return baseSlice(array, start, end);
9413     }
9415     /**
9416      * Uses a binary search to determine the lowest index at which `value`
9417      * should be inserted into `array` in order to maintain its sort order.
9418      *
9419      * @static
9420      * @memberOf _
9421      * @since 0.1.0
9422      * @category Array
9423      * @param {Array} array The sorted array to inspect.
9424      * @param {*} value The value to evaluate.
9425      * @returns {number} Returns the index at which `value` should be inserted
9426      *  into `array`.
9427      * @example
9428      *
9429      * _.sortedIndex([30, 50], 40);
9430      * // => 1
9431      */
9432     function sortedIndex(array, value) {
9433       return baseSortedIndex(array, value);
9434     }
9436     /**
9437      * This method is like `_.sortedIndex` except that it accepts `iteratee`
9438      * which is invoked for `value` and each element of `array` to compute their
9439      * sort ranking. The iteratee is invoked with one argument: (value).
9440      *
9441      * @static
9442      * @memberOf _
9443      * @since 4.0.0
9444      * @category Array
9445      * @param {Array} array The sorted array to inspect.
9446      * @param {*} value The value to evaluate.
9447      * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
9448      * @returns {number} Returns the index at which `value` should be inserted
9449      *  into `array`.
9450      * @example
9451      *
9452      * var objects = [{ 'x': 4 }, { 'x': 5 }];
9453      *
9454      * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
9455      * // => 0
9456      *
9457      * // The `_.property` iteratee shorthand.
9458      * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
9459      * // => 0
9460      */
9461     function sortedIndexBy(array, value, iteratee) {
9462       return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
9463     }
9465     /**
9466      * This method is like `_.indexOf` except that it performs a binary
9467      * search on a sorted `array`.
9468      *
9469      * @static
9470      * @memberOf _
9471      * @since 4.0.0
9472      * @category Array
9473      * @param {Array} array The array to inspect.
9474      * @param {*} value The value to search for.
9475      * @returns {number} Returns the index of the matched value, else `-1`.
9476      * @example
9477      *
9478      * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
9479      * // => 1
9480      */
9481     function sortedIndexOf(array, value) {
9482       var length = array == null ? 0 : array.length;
9483       if (length) {
9484         var index = baseSortedIndex(array, value);
9485         if (index < length && eq(array[index], value)) {
9486           return index;
9487         }
9488       }
9489       return -1;
9490     }
9492     /**
9493      * This method is like `_.sortedIndex` except that it returns the highest
9494      * index at which `value` should be inserted into `array` in order to
9495      * maintain its sort order.
9496      *
9497      * @static
9498      * @memberOf _
9499      * @since 3.0.0
9500      * @category Array
9501      * @param {Array} array The sorted array to inspect.
9502      * @param {*} value The value to evaluate.
9503      * @returns {number} Returns the index at which `value` should be inserted
9504      *  into `array`.
9505      * @example
9506      *
9507      * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
9508      * // => 4
9509      */
9510     function sortedLastIndex(array, value) {
9511       return baseSortedIndex(array, value, true);
9512     }
9514     /**
9515      * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
9516      * which is invoked for `value` and each element of `array` to compute their
9517      * sort ranking. The iteratee is invoked with one argument: (value).
9518      *
9519      * @static
9520      * @memberOf _
9521      * @since 4.0.0
9522      * @category Array
9523      * @param {Array} array The sorted array to inspect.
9524      * @param {*} value The value to evaluate.
9525      * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
9526      * @returns {number} Returns the index at which `value` should be inserted
9527      *  into `array`.
9528      * @example
9529      *
9530      * var objects = [{ 'x': 4 }, { 'x': 5 }];
9531      *
9532      * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
9533      * // => 1
9534      *
9535      * // The `_.property` iteratee shorthand.
9536      * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
9537      * // => 1
9538      */
9539     function sortedLastIndexBy(array, value, iteratee) {
9540       return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
9541     }
9543     /**
9544      * This method is like `_.lastIndexOf` except that it performs a binary
9545      * search on a sorted `array`.
9546      *
9547      * @static
9548      * @memberOf _
9549      * @since 4.0.0
9550      * @category Array
9551      * @param {Array} array The array to inspect.
9552      * @param {*} value The value to search for.
9553      * @returns {number} Returns the index of the matched value, else `-1`.
9554      * @example
9555      *
9556      * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
9557      * // => 3
9558      */
9559     function sortedLastIndexOf(array, value) {
9560       var length = array == null ? 0 : array.length;
9561       if (length) {
9562         var index = baseSortedIndex(array, value, true) - 1;
9563         if (eq(array[index], value)) {
9564           return index;
9565         }
9566       }
9567       return -1;
9568     }
9570     /**
9571      * This method is like `_.uniq` except that it's designed and optimized
9572      * for sorted arrays.
9573      *
9574      * @static
9575      * @memberOf _
9576      * @since 4.0.0
9577      * @category Array
9578      * @param {Array} array The array to inspect.
9579      * @returns {Array} Returns the new duplicate free array.
9580      * @example
9581      *
9582      * _.sortedUniq([1, 1, 2]);
9583      * // => [1, 2]
9584      */
9585     function sortedUniq(array) {
9586       return (array && array.length)
9587         ? baseSortedUniq(array)
9588         : [];
9589     }
9591     /**
9592      * This method is like `_.uniqBy` except that it's designed and optimized
9593      * for sorted arrays.
9594      *
9595      * @static
9596      * @memberOf _
9597      * @since 4.0.0
9598      * @category Array
9599      * @param {Array} array The array to inspect.
9600      * @param {Function} [iteratee] The iteratee invoked per element.
9601      * @returns {Array} Returns the new duplicate free array.
9602      * @example
9603      *
9604      * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
9605      * // => [1.1, 2.3]
9606      */
9607     function sortedUniqBy(array, iteratee) {
9608       return (array && array.length)
9609         ? baseSortedUniq(array, getIteratee(iteratee, 2))
9610         : [];
9611     }
9613     /**
9614      * Gets all but the first element of `array`.
9615      *
9616      * @static
9617      * @memberOf _
9618      * @since 4.0.0
9619      * @category Array
9620      * @param {Array} array The array to query.
9621      * @returns {Array} Returns the slice of `array`.
9622      * @example
9623      *
9624      * _.tail([1, 2, 3]);
9625      * // => [2, 3]
9626      */
9627     function tail(array) {
9628       var length = array == null ? 0 : array.length;
9629       return length ? baseSlice(array, 1, length) : [];
9630     }
9632     /**
9633      * Creates a slice of `array` with `n` elements taken from the beginning.
9634      *
9635      * @static
9636      * @memberOf _
9637      * @since 0.1.0
9638      * @category Array
9639      * @param {Array} array The array to query.
9640      * @param {number} [n=1] The number of elements to take.
9641      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9642      * @returns {Array} Returns the slice of `array`.
9643      * @example
9644      *
9645      * _.take([1, 2, 3]);
9646      * // => [1]
9647      *
9648      * _.take([1, 2, 3], 2);
9649      * // => [1, 2]
9650      *
9651      * _.take([1, 2, 3], 5);
9652      * // => [1, 2, 3]
9653      *
9654      * _.take([1, 2, 3], 0);
9655      * // => []
9656      */
9657     function take(array, n, guard) {
9658       if (!(array && array.length)) {
9659         return [];
9660       }
9661       n = (guard || n === undefined) ? 1 : toInteger(n);
9662       return baseSlice(array, 0, n < 0 ? 0 : n);
9663     }
9665     /**
9666      * Creates a slice of `array` with `n` elements taken from the end.
9667      *
9668      * @static
9669      * @memberOf _
9670      * @since 3.0.0
9671      * @category Array
9672      * @param {Array} array The array to query.
9673      * @param {number} [n=1] The number of elements to take.
9674      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9675      * @returns {Array} Returns the slice of `array`.
9676      * @example
9677      *
9678      * _.takeRight([1, 2, 3]);
9679      * // => [3]
9680      *
9681      * _.takeRight([1, 2, 3], 2);
9682      * // => [2, 3]
9683      *
9684      * _.takeRight([1, 2, 3], 5);
9685      * // => [1, 2, 3]
9686      *
9687      * _.takeRight([1, 2, 3], 0);
9688      * // => []
9689      */
9690     function takeRight(array, n, guard) {
9691       var length = array == null ? 0 : array.length;
9692       if (!length) {
9693         return [];
9694       }
9695       n = (guard || n === undefined) ? 1 : toInteger(n);
9696       n = length - n;
9697       return baseSlice(array, n < 0 ? 0 : n, length);
9698     }
9700     /**
9701      * Creates a slice of `array` with elements taken from the end. Elements are
9702      * taken until `predicate` returns falsey. The predicate is invoked with
9703      * three arguments: (value, index, array).
9704      *
9705      * @static
9706      * @memberOf _
9707      * @since 3.0.0
9708      * @category Array
9709      * @param {Array} array The array to query.
9710      * @param {Function} [predicate=_.identity] The function invoked per iteration.
9711      * @returns {Array} Returns the slice of `array`.
9712      * @example
9713      *
9714      * var users = [
9715      *   { 'user': 'barney',  'active': true },
9716      *   { 'user': 'fred',    'active': false },
9717      *   { 'user': 'pebbles', 'active': false }
9718      * ];
9719      *
9720      * _.takeRightWhile(users, function(o) { return !o.active; });
9721      * // => objects for ['fred', 'pebbles']
9722      *
9723      * // The `_.matches` iteratee shorthand.
9724      * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
9725      * // => objects for ['pebbles']
9726      *
9727      * // The `_.matchesProperty` iteratee shorthand.
9728      * _.takeRightWhile(users, ['active', false]);
9729      * // => objects for ['fred', 'pebbles']
9730      *
9731      * // The `_.property` iteratee shorthand.
9732      * _.takeRightWhile(users, 'active');
9733      * // => []
9734      */
9735     function takeRightWhile(array, predicate) {
9736       return (array && array.length)
9737         ? baseWhile(array, getIteratee(predicate, 3), false, true)
9738         : [];
9739     }
9741     /**
9742      * Creates a slice of `array` with elements taken from the beginning. Elements
9743      * are taken until `predicate` returns falsey. The predicate is invoked with
9744      * three arguments: (value, index, array).
9745      *
9746      * @static
9747      * @memberOf _
9748      * @since 3.0.0
9749      * @category Array
9750      * @param {Array} array The array to query.
9751      * @param {Function} [predicate=_.identity] The function invoked per iteration.
9752      * @returns {Array} Returns the slice of `array`.
9753      * @example
9754      *
9755      * var users = [
9756      *   { 'user': 'barney',  'active': false },
9757      *   { 'user': 'fred',    'active': false },
9758      *   { 'user': 'pebbles', 'active': true }
9759      * ];
9760      *
9761      * _.takeWhile(users, function(o) { return !o.active; });
9762      * // => objects for ['barney', 'fred']
9763      *
9764      * // The `_.matches` iteratee shorthand.
9765      * _.takeWhile(users, { 'user': 'barney', 'active': false });
9766      * // => objects for ['barney']
9767      *
9768      * // The `_.matchesProperty` iteratee shorthand.
9769      * _.takeWhile(users, ['active', false]);
9770      * // => objects for ['barney', 'fred']
9771      *
9772      * // The `_.property` iteratee shorthand.
9773      * _.takeWhile(users, 'active');
9774      * // => []
9775      */
9776     function takeWhile(array, predicate) {
9777       return (array && array.length)
9778         ? baseWhile(array, getIteratee(predicate, 3))
9779         : [];
9780     }
9782     /**
9783      * Creates an array of unique values, in order, from all given arrays using
9784      * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
9785      * for equality comparisons.
9786      *
9787      * @static
9788      * @memberOf _
9789      * @since 0.1.0
9790      * @category Array
9791      * @param {...Array} [arrays] The arrays to inspect.
9792      * @returns {Array} Returns the new array of combined values.
9793      * @example
9794      *
9795      * _.union([2], [1, 2]);
9796      * // => [2, 1]
9797      */
9798     var union = baseRest(function(arrays) {
9799       return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
9800     });
9802     /**
9803      * This method is like `_.union` except that it accepts `iteratee` which is
9804      * invoked for each element of each `arrays` to generate the criterion by
9805      * which uniqueness is computed. Result values are chosen from the first
9806      * array in which the value occurs. The iteratee is invoked with one argument:
9807      * (value).
9808      *
9809      * @static
9810      * @memberOf _
9811      * @since 4.0.0
9812      * @category Array
9813      * @param {...Array} [arrays] The arrays to inspect.
9814      * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
9815      * @returns {Array} Returns the new array of combined values.
9816      * @example
9817      *
9818      * _.unionBy([2.1], [1.2, 2.3], Math.floor);
9819      * // => [2.1, 1.2]
9820      *
9821      * // The `_.property` iteratee shorthand.
9822      * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
9823      * // => [{ 'x': 1 }, { 'x': 2 }]
9824      */
9825     var unionBy = baseRest(function(arrays) {
9826       var iteratee = last(arrays);
9827       if (isArrayLikeObject(iteratee)) {
9828         iteratee = undefined;
9829       }
9830       return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
9831     });
9833     /**
9834      * This method is like `_.union` except that it accepts `comparator` which
9835      * is invoked to compare elements of `arrays`. Result values are chosen from
9836      * the first array in which the value occurs. The comparator is invoked
9837      * with two arguments: (arrVal, othVal).
9838      *
9839      * @static
9840      * @memberOf _
9841      * @since 4.0.0
9842      * @category Array
9843      * @param {...Array} [arrays] The arrays to inspect.
9844      * @param {Function} [comparator] The comparator invoked per element.
9845      * @returns {Array} Returns the new array of combined values.
9846      * @example
9847      *
9848      * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
9849      * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
9850      *
9851      * _.unionWith(objects, others, _.isEqual);
9852      * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
9853      */
9854     var unionWith = baseRest(function(arrays) {
9855       var comparator = last(arrays);
9856       comparator = typeof comparator == 'function' ? comparator : undefined;
9857       return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
9858     });
9860     /**
9861      * Creates a duplicate-free version of an array, using
9862      * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
9863      * for equality comparisons, in which only the first occurrence of each element
9864      * is kept. The order of result values is determined by the order they occur
9865      * in the array.
9866      *
9867      * @static
9868      * @memberOf _
9869      * @since 0.1.0
9870      * @category Array
9871      * @param {Array} array The array to inspect.
9872      * @returns {Array} Returns the new duplicate free array.
9873      * @example
9874      *
9875      * _.uniq([2, 1, 2]);
9876      * // => [2, 1]
9877      */
9878     function uniq(array) {
9879       return (array && array.length) ? baseUniq(array) : [];
9880     }
9882     /**
9883      * This method is like `_.uniq` except that it accepts `iteratee` which is
9884      * invoked for each element in `array` to generate the criterion by which
9885      * uniqueness is computed. The order of result values is determined by the
9886      * order they occur in the array. The iteratee is invoked with one argument:
9887      * (value).
9888      *
9889      * @static
9890      * @memberOf _
9891      * @since 4.0.0
9892      * @category Array
9893      * @param {Array} array The array to inspect.
9894      * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
9895      * @returns {Array} Returns the new duplicate free array.
9896      * @example
9897      *
9898      * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
9899      * // => [2.1, 1.2]
9900      *
9901      * // The `_.property` iteratee shorthand.
9902      * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
9903      * // => [{ 'x': 1 }, { 'x': 2 }]
9904      */
9905     function uniqBy(array, iteratee) {
9906       return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];
9907     }
9909     /**
9910      * This method is like `_.uniq` except that it accepts `comparator` which
9911      * is invoked to compare elements of `array`. The order of result values is
9912      * determined by the order they occur in the array.The comparator is invoked
9913      * with two arguments: (arrVal, othVal).
9914      *
9915      * @static
9916      * @memberOf _
9917      * @since 4.0.0
9918      * @category Array
9919      * @param {Array} array The array to inspect.
9920      * @param {Function} [comparator] The comparator invoked per element.
9921      * @returns {Array} Returns the new duplicate free array.
9922      * @example
9923      *
9924      * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
9925      *
9926      * _.uniqWith(objects, _.isEqual);
9927      * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
9928      */
9929     function uniqWith(array, comparator) {
9930       comparator = typeof comparator == 'function' ? comparator : undefined;
9931       return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
9932     }
9934     /**
9935      * This method is like `_.zip` except that it accepts an array of grouped
9936      * elements and creates an array regrouping the elements to their pre-zip
9937      * configuration.
9938      *
9939      * @static
9940      * @memberOf _
9941      * @since 1.2.0
9942      * @category Array
9943      * @param {Array} array The array of grouped elements to process.
9944      * @returns {Array} Returns the new array of regrouped elements.
9945      * @example
9946      *
9947      * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
9948      * // => [['a', 1, true], ['b', 2, false]]
9949      *
9950      * _.unzip(zipped);
9951      * // => [['a', 'b'], [1, 2], [true, false]]
9952      */
9953     function unzip(array) {
9954       if (!(array && array.length)) {
9955         return [];
9956       }
9957       var length = 0;
9958       array = arrayFilter(array, function(group) {
9959         if (isArrayLikeObject(group)) {
9960           length = nativeMax(group.length, length);
9961           return true;
9962         }
9963       });
9964       return baseTimes(length, function(index) {
9965         return arrayMap(array, baseProperty(index));
9966       });
9967     }
9969     /**
9970      * This method is like `_.unzip` except that it accepts `iteratee` to specify
9971      * how regrouped values should be combined. The iteratee is invoked with the
9972      * elements of each group: (...group).
9973      *
9974      * @static
9975      * @memberOf _
9976      * @since 3.8.0
9977      * @category Array
9978      * @param {Array} array The array of grouped elements to process.
9979      * @param {Function} [iteratee=_.identity] The function to combine
9980      *  regrouped values.
9981      * @returns {Array} Returns the new array of regrouped elements.
9982      * @example
9983      *
9984      * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
9985      * // => [[1, 10, 100], [2, 20, 200]]
9986      *
9987      * _.unzipWith(zipped, _.add);
9988      * // => [3, 30, 300]
9989      */
9990     function unzipWith(array, iteratee) {
9991       if (!(array && array.length)) {
9992         return [];
9993       }
9994       var result = unzip(array);
9995       if (iteratee == null) {
9996         return result;
9997       }
9998       return arrayMap(result, function(group) {
9999         return apply(iteratee, undefined, group);
10000       });
10001     }
10003     /**
10004      * Creates an array excluding all given values using
10005      * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
10006      * for equality comparisons.
10007      *
10008      * **Note:** Unlike `_.pull`, this method returns a new array.
10009      *
10010      * @static
10011      * @memberOf _
10012      * @since 0.1.0
10013      * @category Array
10014      * @param {Array} array The array to inspect.
10015      * @param {...*} [values] The values to exclude.
10016      * @returns {Array} Returns the new array of filtered values.
10017      * @see _.difference, _.xor
10018      * @example
10019      *
10020      * _.without([2, 1, 2, 3], 1, 2);
10021      * // => [3]
10022      */
10023     var without = baseRest(function(array, values) {
10024       return isArrayLikeObject(array)
10025         ? baseDifference(array, values)
10026         : [];
10027     });
10029     /**
10030      * Creates an array of unique values that is the
10031      * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
10032      * of the given arrays. The order of result values is determined by the order
10033      * they occur in the arrays.
10034      *
10035      * @static
10036      * @memberOf _
10037      * @since 2.4.0
10038      * @category Array
10039      * @param {...Array} [arrays] The arrays to inspect.
10040      * @returns {Array} Returns the new array of filtered values.
10041      * @see _.difference, _.without
10042      * @example
10043      *
10044      * _.xor([2, 1], [2, 3]);
10045      * // => [1, 3]
10046      */
10047     var xor = baseRest(function(arrays) {
10048       return baseXor(arrayFilter(arrays, isArrayLikeObject));
10049     });
10051     /**
10052      * This method is like `_.xor` except that it accepts `iteratee` which is
10053      * invoked for each element of each `arrays` to generate the criterion by
10054      * which by which they're compared. The order of result values is determined
10055      * by the order they occur in the arrays. The iteratee is invoked with one
10056      * argument: (value).
10057      *
10058      * @static
10059      * @memberOf _
10060      * @since 4.0.0
10061      * @category Array
10062      * @param {...Array} [arrays] The arrays to inspect.
10063      * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
10064      * @returns {Array} Returns the new array of filtered values.
10065      * @example
10066      *
10067      * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
10068      * // => [1.2, 3.4]
10069      *
10070      * // The `_.property` iteratee shorthand.
10071      * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
10072      * // => [{ 'x': 2 }]
10073      */
10074     var xorBy = baseRest(function(arrays) {
10075       var iteratee = last(arrays);
10076       if (isArrayLikeObject(iteratee)) {
10077         iteratee = undefined;
10078       }
10079       return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
10080     });
10082     /**
10083      * This method is like `_.xor` except that it accepts `comparator` which is
10084      * invoked to compare elements of `arrays`. The order of result values is
10085      * determined by the order they occur in the arrays. The comparator is invoked
10086      * with two arguments: (arrVal, othVal).
10087      *
10088      * @static
10089      * @memberOf _
10090      * @since 4.0.0
10091      * @category Array
10092      * @param {...Array} [arrays] The arrays to inspect.
10093      * @param {Function} [comparator] The comparator invoked per element.
10094      * @returns {Array} Returns the new array of filtered values.
10095      * @example
10096      *
10097      * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
10098      * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
10099      *
10100      * _.xorWith(objects, others, _.isEqual);
10101      * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
10102      */
10103     var xorWith = baseRest(function(arrays) {
10104       var comparator = last(arrays);
10105       comparator = typeof comparator == 'function' ? comparator : undefined;
10106       return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
10107     });
10109     /**
10110      * Creates an array of grouped elements, the first of which contains the
10111      * first elements of the given arrays, the second of which contains the
10112      * second elements of the given arrays, and so on.
10113      *
10114      * @static
10115      * @memberOf _
10116      * @since 0.1.0
10117      * @category Array
10118      * @param {...Array} [arrays] The arrays to process.
10119      * @returns {Array} Returns the new array of grouped elements.
10120      * @example
10121      *
10122      * _.zip(['a', 'b'], [1, 2], [true, false]);
10123      * // => [['a', 1, true], ['b', 2, false]]
10124      */
10125     var zip = baseRest(unzip);
10127     /**
10128      * This method is like `_.fromPairs` except that it accepts two arrays,
10129      * one of property identifiers and one of corresponding values.
10130      *
10131      * @static
10132      * @memberOf _
10133      * @since 0.4.0
10134      * @category Array
10135      * @param {Array} [props=[]] The property identifiers.
10136      * @param {Array} [values=[]] The property values.
10137      * @returns {Object} Returns the new object.
10138      * @example
10139      *
10140      * _.zipObject(['a', 'b'], [1, 2]);
10141      * // => { 'a': 1, 'b': 2 }
10142      */
10143     function zipObject(props, values) {
10144       return baseZipObject(props || [], values || [], assignValue);
10145     }
10147     /**
10148      * This method is like `_.zipObject` except that it supports property paths.
10149      *
10150      * @static
10151      * @memberOf _
10152      * @since 4.1.0
10153      * @category Array
10154      * @param {Array} [props=[]] The property identifiers.
10155      * @param {Array} [values=[]] The property values.
10156      * @returns {Object} Returns the new object.
10157      * @example
10158      *
10159      * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
10160      * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
10161      */
10162     function zipObjectDeep(props, values) {
10163       return baseZipObject(props || [], values || [], baseSet);
10164     }
10166     /**
10167      * This method is like `_.zip` except that it accepts `iteratee` to specify
10168      * how grouped values should be combined. The iteratee is invoked with the
10169      * elements of each group: (...group).
10170      *
10171      * @static
10172      * @memberOf _
10173      * @since 3.8.0
10174      * @category Array
10175      * @param {...Array} [arrays] The arrays to process.
10176      * @param {Function} [iteratee=_.identity] The function to combine
10177      *  grouped values.
10178      * @returns {Array} Returns the new array of grouped elements.
10179      * @example
10180      *
10181      * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
10182      *   return a + b + c;
10183      * });
10184      * // => [111, 222]
10185      */
10186     var zipWith = baseRest(function(arrays) {
10187       var length = arrays.length,
10188           iteratee = length > 1 ? arrays[length - 1] : undefined;
10190       iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
10191       return unzipWith(arrays, iteratee);
10192     });
10194     /*------------------------------------------------------------------------*/
10196     /**
10197      * Creates a `lodash` wrapper instance that wraps `value` with explicit method
10198      * chain sequences enabled. The result of such sequences must be unwrapped
10199      * with `_#value`.
10200      *
10201      * @static
10202      * @memberOf _
10203      * @since 1.3.0
10204      * @category Seq
10205      * @param {*} value The value to wrap.
10206      * @returns {Object} Returns the new `lodash` wrapper instance.
10207      * @example
10208      *
10209      * var users = [
10210      *   { 'user': 'barney',  'age': 36 },
10211      *   { 'user': 'fred',    'age': 40 },
10212      *   { 'user': 'pebbles', 'age': 1 }
10213      * ];
10214      *
10215      * var youngest = _
10216      *   .chain(users)
10217      *   .sortBy('age')
10218      *   .map(function(o) {
10219      *     return o.user + ' is ' + o.age;
10220      *   })
10221      *   .head()
10222      *   .value();
10223      * // => 'pebbles is 1'
10224      */
10225     function chain(value) {
10226       var result = lodash(value);
10227       result.__chain__ = true;
10228       return result;
10229     }
10231     /**
10232      * This method invokes `interceptor` and returns `value`. The interceptor
10233      * is invoked with one argument; (value). The purpose of this method is to
10234      * "tap into" a method chain sequence in order to modify intermediate results.
10235      *
10236      * @static
10237      * @memberOf _
10238      * @since 0.1.0
10239      * @category Seq
10240      * @param {*} value The value to provide to `interceptor`.
10241      * @param {Function} interceptor The function to invoke.
10242      * @returns {*} Returns `value`.
10243      * @example
10244      *
10245      * _([1, 2, 3])
10246      *  .tap(function(array) {
10247      *    // Mutate input array.
10248      *    array.pop();
10249      *  })
10250      *  .reverse()
10251      *  .value();
10252      * // => [2, 1]
10253      */
10254     function tap(value, interceptor) {
10255       interceptor(value);
10256       return value;
10257     }
10259     /**
10260      * This method is like `_.tap` except that it returns the result of `interceptor`.
10261      * The purpose of this method is to "pass thru" values replacing intermediate
10262      * results in a method chain sequence.
10263      *
10264      * @static
10265      * @memberOf _
10266      * @since 3.0.0
10267      * @category Seq
10268      * @param {*} value The value to provide to `interceptor`.
10269      * @param {Function} interceptor The function to invoke.
10270      * @returns {*} Returns the result of `interceptor`.
10271      * @example
10272      *
10273      * _('  abc  ')
10274      *  .chain()
10275      *  .trim()
10276      *  .thru(function(value) {
10277      *    return [value];
10278      *  })
10279      *  .value();
10280      * // => ['abc']
10281      */
10282     function thru(value, interceptor) {
10283       return interceptor(value);
10284     }
10286     /**
10287      * This method is the wrapper version of `_.at`.
10288      *
10289      * @name at
10290      * @memberOf _
10291      * @since 1.0.0
10292      * @category Seq
10293      * @param {...(string|string[])} [paths] The property paths to pick.
10294      * @returns {Object} Returns the new `lodash` wrapper instance.
10295      * @example
10296      *
10297      * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
10298      *
10299      * _(object).at(['a[0].b.c', 'a[1]']).value();
10300      * // => [3, 4]
10301      */
10302     var wrapperAt = flatRest(function(paths) {
10303       var length = paths.length,
10304           start = length ? paths[0] : 0,
10305           value = this.__wrapped__,
10306           interceptor = function(object) { return baseAt(object, paths); };
10308       if (length > 1 || this.__actions__.length ||
10309           !(value instanceof LazyWrapper) || !isIndex(start)) {
10310         return this.thru(interceptor);
10311       }
10312       value = value.slice(start, +start + (length ? 1 : 0));
10313       value.__actions__.push({
10314         'func': thru,
10315         'args': [interceptor],
10316         'thisArg': undefined
10317       });
10318       return new LodashWrapper(value, this.__chain__).thru(function(array) {
10319         if (length && !array.length) {
10320           array.push(undefined);
10321         }
10322         return array;
10323       });
10324     });
10326     /**
10327      * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
10328      *
10329      * @name chain
10330      * @memberOf _
10331      * @since 0.1.0
10332      * @category Seq
10333      * @returns {Object} Returns the new `lodash` wrapper instance.
10334      * @example
10335      *
10336      * var users = [
10337      *   { 'user': 'barney', 'age': 36 },
10338      *   { 'user': 'fred',   'age': 40 }
10339      * ];
10340      *
10341      * // A sequence without explicit chaining.
10342      * _(users).head();
10343      * // => { 'user': 'barney', 'age': 36 }
10344      *
10345      * // A sequence with explicit chaining.
10346      * _(users)
10347      *   .chain()
10348      *   .head()
10349      *   .pick('user')
10350      *   .value();
10351      * // => { 'user': 'barney' }
10352      */
10353     function wrapperChain() {
10354       return chain(this);
10355     }
10357     /**
10358      * Executes the chain sequence and returns the wrapped result.
10359      *
10360      * @name commit
10361      * @memberOf _
10362      * @since 3.2.0
10363      * @category Seq
10364      * @returns {Object} Returns the new `lodash` wrapper instance.
10365      * @example
10366      *
10367      * var array = [1, 2];
10368      * var wrapped = _(array).push(3);
10369      *
10370      * console.log(array);
10371      * // => [1, 2]
10372      *
10373      * wrapped = wrapped.commit();
10374      * console.log(array);
10375      * // => [1, 2, 3]
10376      *
10377      * wrapped.last();
10378      * // => 3
10379      *
10380      * console.log(array);
10381      * // => [1, 2, 3]
10382      */
10383     function wrapperCommit() {
10384       return new LodashWrapper(this.value(), this.__chain__);
10385     }
10387     /**
10388      * Gets the next value on a wrapped object following the
10389      * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
10390      *
10391      * @name next
10392      * @memberOf _
10393      * @since 4.0.0
10394      * @category Seq
10395      * @returns {Object} Returns the next iterator value.
10396      * @example
10397      *
10398      * var wrapped = _([1, 2]);
10399      *
10400      * wrapped.next();
10401      * // => { 'done': false, 'value': 1 }
10402      *
10403      * wrapped.next();
10404      * // => { 'done': false, 'value': 2 }
10405      *
10406      * wrapped.next();
10407      * // => { 'done': true, 'value': undefined }
10408      */
10409     function wrapperNext() {
10410       if (this.__values__ === undefined) {
10411         this.__values__ = toArray(this.value());
10412       }
10413       var done = this.__index__ >= this.__values__.length,
10414           value = done ? undefined : this.__values__[this.__index__++];
10416       return { 'done': done, 'value': value };
10417     }
10419     /**
10420      * Enables the wrapper to be iterable.
10421      *
10422      * @name Symbol.iterator
10423      * @memberOf _
10424      * @since 4.0.0
10425      * @category Seq
10426      * @returns {Object} Returns the wrapper object.
10427      * @example
10428      *
10429      * var wrapped = _([1, 2]);
10430      *
10431      * wrapped[Symbol.iterator]() === wrapped;
10432      * // => true
10433      *
10434      * Array.from(wrapped);
10435      * // => [1, 2]
10436      */
10437     function wrapperToIterator() {
10438       return this;
10439     }
10441     /**
10442      * Creates a clone of the chain sequence planting `value` as the wrapped value.
10443      *
10444      * @name plant
10445      * @memberOf _
10446      * @since 3.2.0
10447      * @category Seq
10448      * @param {*} value The value to plant.
10449      * @returns {Object} Returns the new `lodash` wrapper instance.
10450      * @example
10451      *
10452      * function square(n) {
10453      *   return n * n;
10454      * }
10455      *
10456      * var wrapped = _([1, 2]).map(square);
10457      * var other = wrapped.plant([3, 4]);
10458      *
10459      * other.value();
10460      * // => [9, 16]
10461      *
10462      * wrapped.value();
10463      * // => [1, 4]
10464      */
10465     function wrapperPlant(value) {
10466       var result,
10467           parent = this;
10469       while (parent instanceof baseLodash) {
10470         var clone = wrapperClone(parent);
10471         clone.__index__ = 0;
10472         clone.__values__ = undefined;
10473         if (result) {
10474           previous.__wrapped__ = clone;
10475         } else {
10476           result = clone;
10477         }
10478         var previous = clone;
10479         parent = parent.__wrapped__;
10480       }
10481       previous.__wrapped__ = value;
10482       return result;
10483     }
10485     /**
10486      * This method is the wrapper version of `_.reverse`.
10487      *
10488      * **Note:** This method mutates the wrapped array.
10489      *
10490      * @name reverse
10491      * @memberOf _
10492      * @since 0.1.0
10493      * @category Seq
10494      * @returns {Object} Returns the new `lodash` wrapper instance.
10495      * @example
10496      *
10497      * var array = [1, 2, 3];
10498      *
10499      * _(array).reverse().value()
10500      * // => [3, 2, 1]
10501      *
10502      * console.log(array);
10503      * // => [3, 2, 1]
10504      */
10505     function wrapperReverse() {
10506       var value = this.__wrapped__;
10507       if (value instanceof LazyWrapper) {
10508         var wrapped = value;
10509         if (this.__actions__.length) {
10510           wrapped = new LazyWrapper(this);
10511         }
10512         wrapped = wrapped.reverse();
10513         wrapped.__actions__.push({
10514           'func': thru,
10515           'args': [reverse],
10516           'thisArg': undefined
10517         });
10518         return new LodashWrapper(wrapped, this.__chain__);
10519       }
10520       return this.thru(reverse);
10521     }
10523     /**
10524      * Executes the chain sequence to resolve the unwrapped value.
10525      *
10526      * @name value
10527      * @memberOf _
10528      * @since 0.1.0
10529      * @alias toJSON, valueOf
10530      * @category Seq
10531      * @returns {*} Returns the resolved unwrapped value.
10532      * @example
10533      *
10534      * _([1, 2, 3]).value();
10535      * // => [1, 2, 3]
10536      */
10537     function wrapperValue() {
10538       return baseWrapperValue(this.__wrapped__, this.__actions__);
10539     }
10541     /*------------------------------------------------------------------------*/
10543     /**
10544      * Creates an object composed of keys generated from the results of running
10545      * each element of `collection` thru `iteratee`. The corresponding value of
10546      * each key is the number of times the key was returned by `iteratee`. The
10547      * iteratee is invoked with one argument: (value).
10548      *
10549      * @static
10550      * @memberOf _
10551      * @since 0.5.0
10552      * @category Collection
10553      * @param {Array|Object} collection The collection to iterate over.
10554      * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
10555      * @returns {Object} Returns the composed aggregate object.
10556      * @example
10557      *
10558      * _.countBy([6.1, 4.2, 6.3], Math.floor);
10559      * // => { '4': 1, '6': 2 }
10560      *
10561      * // The `_.property` iteratee shorthand.
10562      * _.countBy(['one', 'two', 'three'], 'length');
10563      * // => { '3': 2, '5': 1 }
10564      */
10565     var countBy = createAggregator(function(result, value, key) {
10566       if (hasOwnProperty.call(result, key)) {
10567         ++result[key];
10568       } else {
10569         baseAssignValue(result, key, 1);
10570       }
10571     });
10573     /**
10574      * Checks if `predicate` returns truthy for **all** elements of `collection`.
10575      * Iteration is stopped once `predicate` returns falsey. The predicate is
10576      * invoked with three arguments: (value, index|key, collection).
10577      *
10578      * **Note:** This method returns `true` for
10579      * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
10580      * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
10581      * elements of empty collections.
10582      *
10583      * @static
10584      * @memberOf _
10585      * @since 0.1.0
10586      * @category Collection
10587      * @param {Array|Object} collection The collection to iterate over.
10588      * @param {Function} [predicate=_.identity] The function invoked per iteration.
10589      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
10590      * @returns {boolean} Returns `true` if all elements pass the predicate check,
10591      *  else `false`.
10592      * @example
10593      *
10594      * _.every([true, 1, null, 'yes'], Boolean);
10595      * // => false
10596      *
10597      * var users = [
10598      *   { 'user': 'barney', 'age': 36, 'active': false },
10599      *   { 'user': 'fred',   'age': 40, 'active': false }
10600      * ];
10601      *
10602      * // The `_.matches` iteratee shorthand.
10603      * _.every(users, { 'user': 'barney', 'active': false });
10604      * // => false
10605      *
10606      * // The `_.matchesProperty` iteratee shorthand.
10607      * _.every(users, ['active', false]);
10608      * // => true
10609      *
10610      * // The `_.property` iteratee shorthand.
10611      * _.every(users, 'active');
10612      * // => false
10613      */
10614     function every(collection, predicate, guard) {
10615       var func = isArray(collection) ? arrayEvery : baseEvery;
10616       if (guard && isIterateeCall(collection, predicate, guard)) {
10617         predicate = undefined;
10618       }
10619       return func(collection, getIteratee(predicate, 3));
10620     }
10622     /**
10623      * Iterates over elements of `collection`, returning an array of all elements
10624      * `predicate` returns truthy for. The predicate is invoked with three
10625      * arguments: (value, index|key, collection).
10626      *
10627      * **Note:** Unlike `_.remove`, this method returns a new array.
10628      *
10629      * @static
10630      * @memberOf _
10631      * @since 0.1.0
10632      * @category Collection
10633      * @param {Array|Object} collection The collection to iterate over.
10634      * @param {Function} [predicate=_.identity] The function invoked per iteration.
10635      * @returns {Array} Returns the new filtered array.
10636      * @see _.reject
10637      * @example
10638      *
10639      * var users = [
10640      *   { 'user': 'barney', 'age': 36, 'active': true },
10641      *   { 'user': 'fred',   'age': 40, 'active': false }
10642      * ];
10643      *
10644      * _.filter(users, function(o) { return !o.active; });
10645      * // => objects for ['fred']
10646      *
10647      * // The `_.matches` iteratee shorthand.
10648      * _.filter(users, { 'age': 36, 'active': true });
10649      * // => objects for ['barney']
10650      *
10651      * // The `_.matchesProperty` iteratee shorthand.
10652      * _.filter(users, ['active', false]);
10653      * // => objects for ['fred']
10654      *
10655      * // The `_.property` iteratee shorthand.
10656      * _.filter(users, 'active');
10657      * // => objects for ['barney']
10658      */
10659     function filter(collection, predicate) {
10660       var func = isArray(collection) ? arrayFilter : baseFilter;
10661       return func(collection, getIteratee(predicate, 3));
10662     }
10664     /**
10665      * Iterates over elements of `collection`, returning the first element
10666      * `predicate` returns truthy for. The predicate is invoked with three
10667      * arguments: (value, index|key, collection).
10668      *
10669      * @static
10670      * @memberOf _
10671      * @since 0.1.0
10672      * @category Collection
10673      * @param {Array|Object} collection The collection to inspect.
10674      * @param {Function} [predicate=_.identity] The function invoked per iteration.
10675      * @param {number} [fromIndex=0] The index to search from.
10676      * @returns {*} Returns the matched element, else `undefined`.
10677      * @example
10678      *
10679      * var users = [
10680      *   { 'user': 'barney',  'age': 36, 'active': true },
10681      *   { 'user': 'fred',    'age': 40, 'active': false },
10682      *   { 'user': 'pebbles', 'age': 1,  'active': true }
10683      * ];
10684      *
10685      * _.find(users, function(o) { return o.age < 40; });
10686      * // => object for 'barney'
10687      *
10688      * // The `_.matches` iteratee shorthand.
10689      * _.find(users, { 'age': 1, 'active': true });
10690      * // => object for 'pebbles'
10691      *
10692      * // The `_.matchesProperty` iteratee shorthand.
10693      * _.find(users, ['active', false]);
10694      * // => object for 'fred'
10695      *
10696      * // The `_.property` iteratee shorthand.
10697      * _.find(users, 'active');
10698      * // => object for 'barney'
10699      */
10700     var find = createFind(findIndex);
10702     /**
10703      * This method is like `_.find` except that it iterates over elements of
10704      * `collection` from right to left.
10705      *
10706      * @static
10707      * @memberOf _
10708      * @since 2.0.0
10709      * @category Collection
10710      * @param {Array|Object} collection The collection to inspect.
10711      * @param {Function} [predicate=_.identity] The function invoked per iteration.
10712      * @param {number} [fromIndex=collection.length-1] The index to search from.
10713      * @returns {*} Returns the matched element, else `undefined`.
10714      * @example
10715      *
10716      * _.findLast([1, 2, 3, 4], function(n) {
10717      *   return n % 2 == 1;
10718      * });
10719      * // => 3
10720      */
10721     var findLast = createFind(findLastIndex);
10723     /**
10724      * Creates a flattened array of values by running each element in `collection`
10725      * thru `iteratee` and flattening the mapped results. The iteratee is invoked
10726      * with three arguments: (value, index|key, collection).
10727      *
10728      * @static
10729      * @memberOf _
10730      * @since 4.0.0
10731      * @category Collection
10732      * @param {Array|Object} collection The collection to iterate over.
10733      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
10734      * @returns {Array} Returns the new flattened array.
10735      * @example
10736      *
10737      * function duplicate(n) {
10738      *   return [n, n];
10739      * }
10740      *
10741      * _.flatMap([1, 2], duplicate);
10742      * // => [1, 1, 2, 2]
10743      */
10744     function flatMap(collection, iteratee) {
10745       return baseFlatten(map(collection, iteratee), 1);
10746     }
10748     /**
10749      * This method is like `_.flatMap` except that it recursively flattens the
10750      * mapped results.
10751      *
10752      * @static
10753      * @memberOf _
10754      * @since 4.7.0
10755      * @category Collection
10756      * @param {Array|Object} collection The collection to iterate over.
10757      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
10758      * @returns {Array} Returns the new flattened array.
10759      * @example
10760      *
10761      * function duplicate(n) {
10762      *   return [[[n, n]]];
10763      * }
10764      *
10765      * _.flatMapDeep([1, 2], duplicate);
10766      * // => [1, 1, 2, 2]
10767      */
10768     function flatMapDeep(collection, iteratee) {
10769       return baseFlatten(map(collection, iteratee), INFINITY);
10770     }
10772     /**
10773      * This method is like `_.flatMap` except that it recursively flattens the
10774      * mapped results up to `depth` times.
10775      *
10776      * @static
10777      * @memberOf _
10778      * @since 4.7.0
10779      * @category Collection
10780      * @param {Array|Object} collection The collection to iterate over.
10781      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
10782      * @param {number} [depth=1] The maximum recursion depth.
10783      * @returns {Array} Returns the new flattened array.
10784      * @example
10785      *
10786      * function duplicate(n) {
10787      *   return [[[n, n]]];
10788      * }
10789      *
10790      * _.flatMapDepth([1, 2], duplicate, 2);
10791      * // => [[1, 1], [2, 2]]
10792      */
10793     function flatMapDepth(collection, iteratee, depth) {
10794       depth = depth === undefined ? 1 : toInteger(depth);
10795       return baseFlatten(map(collection, iteratee), depth);
10796     }
10798     /**
10799      * Iterates over elements of `collection` and invokes `iteratee` for each element.
10800      * The iteratee is invoked with three arguments: (value, index|key, collection).
10801      * Iteratee functions may exit iteration early by explicitly returning `false`.
10802      *
10803      * **Note:** As with other "Collections" methods, objects with a "length"
10804      * property are iterated like arrays. To avoid this behavior use `_.forIn`
10805      * or `_.forOwn` for object iteration.
10806      *
10807      * @static
10808      * @memberOf _
10809      * @since 0.1.0
10810      * @alias each
10811      * @category Collection
10812      * @param {Array|Object} collection The collection to iterate over.
10813      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
10814      * @returns {Array|Object} Returns `collection`.
10815      * @see _.forEachRight
10816      * @example
10817      *
10818      * _.forEach([1, 2], function(value) {
10819      *   console.log(value);
10820      * });
10821      * // => Logs `1` then `2`.
10822      *
10823      * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
10824      *   console.log(key);
10825      * });
10826      * // => Logs 'a' then 'b' (iteration order is not guaranteed).
10827      */
10828     function forEach(collection, iteratee) {
10829       var func = isArray(collection) ? arrayEach : baseEach;
10830       return func(collection, getIteratee(iteratee, 3));
10831     }
10833     /**
10834      * This method is like `_.forEach` except that it iterates over elements of
10835      * `collection` from right to left.
10836      *
10837      * @static
10838      * @memberOf _
10839      * @since 2.0.0
10840      * @alias eachRight
10841      * @category Collection
10842      * @param {Array|Object} collection The collection to iterate over.
10843      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
10844      * @returns {Array|Object} Returns `collection`.
10845      * @see _.forEach
10846      * @example
10847      *
10848      * _.forEachRight([1, 2], function(value) {
10849      *   console.log(value);
10850      * });
10851      * // => Logs `2` then `1`.
10852      */
10853     function forEachRight(collection, iteratee) {
10854       var func = isArray(collection) ? arrayEachRight : baseEachRight;
10855       return func(collection, getIteratee(iteratee, 3));
10856     }
10858     /**
10859      * Creates an object composed of keys generated from the results of running
10860      * each element of `collection` thru `iteratee`. The order of grouped values
10861      * is determined by the order they occur in `collection`. The corresponding
10862      * value of each key is an array of elements responsible for generating the
10863      * key. The iteratee is invoked with one argument: (value).
10864      *
10865      * @static
10866      * @memberOf _
10867      * @since 0.1.0
10868      * @category Collection
10869      * @param {Array|Object} collection The collection to iterate over.
10870      * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
10871      * @returns {Object} Returns the composed aggregate object.
10872      * @example
10873      *
10874      * _.groupBy([6.1, 4.2, 6.3], Math.floor);
10875      * // => { '4': [4.2], '6': [6.1, 6.3] }
10876      *
10877      * // The `_.property` iteratee shorthand.
10878      * _.groupBy(['one', 'two', 'three'], 'length');
10879      * // => { '3': ['one', 'two'], '5': ['three'] }
10880      */
10881     var groupBy = createAggregator(function(result, value, key) {
10882       if (hasOwnProperty.call(result, key)) {
10883         result[key].push(value);
10884       } else {
10885         baseAssignValue(result, key, [value]);
10886       }
10887     });
10889     /**
10890      * Checks if `value` is in `collection`. If `collection` is a string, it's
10891      * checked for a substring of `value`, otherwise
10892      * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
10893      * is used for equality comparisons. If `fromIndex` is negative, it's used as
10894      * the offset from the end of `collection`.
10895      *
10896      * @static
10897      * @memberOf _
10898      * @since 0.1.0
10899      * @category Collection
10900      * @param {Array|Object|string} collection The collection to inspect.
10901      * @param {*} value The value to search for.
10902      * @param {number} [fromIndex=0] The index to search from.
10903      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
10904      * @returns {boolean} Returns `true` if `value` is found, else `false`.
10905      * @example
10906      *
10907      * _.includes([1, 2, 3], 1);
10908      * // => true
10909      *
10910      * _.includes([1, 2, 3], 1, 2);
10911      * // => false
10912      *
10913      * _.includes({ 'a': 1, 'b': 2 }, 1);
10914      * // => true
10915      *
10916      * _.includes('abcd', 'bc');
10917      * // => true
10918      */
10919     function includes(collection, value, fromIndex, guard) {
10920       collection = isArrayLike(collection) ? collection : values(collection);
10921       fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
10923       var length = collection.length;
10924       if (fromIndex < 0) {
10925         fromIndex = nativeMax(length + fromIndex, 0);
10926       }
10927       return isString(collection)
10928         ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
10929         : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
10930     }
10932     /**
10933      * Invokes the method at `path` of each element in `collection`, returning
10934      * an array of the results of each invoked method. Any additional arguments
10935      * are provided to each invoked method. If `path` is a function, it's invoked
10936      * for, and `this` bound to, each element in `collection`.
10937      *
10938      * @static
10939      * @memberOf _
10940      * @since 4.0.0
10941      * @category Collection
10942      * @param {Array|Object} collection The collection to iterate over.
10943      * @param {Array|Function|string} path The path of the method to invoke or
10944      *  the function invoked per iteration.
10945      * @param {...*} [args] The arguments to invoke each method with.
10946      * @returns {Array} Returns the array of results.
10947      * @example
10948      *
10949      * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
10950      * // => [[1, 5, 7], [1, 2, 3]]
10951      *
10952      * _.invokeMap([123, 456], String.prototype.split, '');
10953      * // => [['1', '2', '3'], ['4', '5', '6']]
10954      */
10955     var invokeMap = baseRest(function(collection, path, args) {
10956       var index = -1,
10957           isFunc = typeof path == 'function',
10958           result = isArrayLike(collection) ? Array(collection.length) : [];
10960       baseEach(collection, function(value) {
10961         result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
10962       });
10963       return result;
10964     });
10966     /**
10967      * Creates an object composed of keys generated from the results of running
10968      * each element of `collection` thru `iteratee`. The corresponding value of
10969      * each key is the last element responsible for generating the key. The
10970      * iteratee is invoked with one argument: (value).
10971      *
10972      * @static
10973      * @memberOf _
10974      * @since 4.0.0
10975      * @category Collection
10976      * @param {Array|Object} collection The collection to iterate over.
10977      * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
10978      * @returns {Object} Returns the composed aggregate object.
10979      * @example
10980      *
10981      * var array = [
10982      *   { 'dir': 'left', 'code': 97 },
10983      *   { 'dir': 'right', 'code': 100 }
10984      * ];
10985      *
10986      * _.keyBy(array, function(o) {
10987      *   return String.fromCharCode(o.code);
10988      * });
10989      * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
10990      *
10991      * _.keyBy(array, 'dir');
10992      * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
10993      */
10994     var keyBy = createAggregator(function(result, value, key) {
10995       baseAssignValue(result, key, value);
10996     });
10998     /**
10999      * Creates an array of values by running each element in `collection` thru
11000      * `iteratee`. The iteratee is invoked with three arguments:
11001      * (value, index|key, collection).
11002      *
11003      * Many lodash methods are guarded to work as iteratees for methods like
11004      * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
11005      *
11006      * The guarded methods are:
11007      * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
11008      * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
11009      * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
11010      * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
11011      *
11012      * @static
11013      * @memberOf _
11014      * @since 0.1.0
11015      * @category Collection
11016      * @param {Array|Object} collection The collection to iterate over.
11017      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
11018      * @returns {Array} Returns the new mapped array.
11019      * @example
11020      *
11021      * function square(n) {
11022      *   return n * n;
11023      * }
11024      *
11025      * _.map([4, 8], square);
11026      * // => [16, 64]
11027      *
11028      * _.map({ 'a': 4, 'b': 8 }, square);
11029      * // => [16, 64] (iteration order is not guaranteed)
11030      *
11031      * var users = [
11032      *   { 'user': 'barney' },
11033      *   { 'user': 'fred' }
11034      * ];
11035      *
11036      * // The `_.property` iteratee shorthand.
11037      * _.map(users, 'user');
11038      * // => ['barney', 'fred']
11039      */
11040     function map(collection, iteratee) {
11041       var func = isArray(collection) ? arrayMap : baseMap;
11042       return func(collection, getIteratee(iteratee, 3));
11043     }
11045     /**
11046      * This method is like `_.sortBy` except that it allows specifying the sort
11047      * orders of the iteratees to sort by. If `orders` is unspecified, all values
11048      * are sorted in ascending order. Otherwise, specify an order of "desc" for
11049      * descending or "asc" for ascending sort order of corresponding values.
11050      *
11051      * @static
11052      * @memberOf _
11053      * @since 4.0.0
11054      * @category Collection
11055      * @param {Array|Object} collection The collection to iterate over.
11056      * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
11057      *  The iteratees to sort by.
11058      * @param {string[]} [orders] The sort orders of `iteratees`.
11059      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
11060      * @returns {Array} Returns the new sorted array.
11061      * @example
11062      *
11063      * var users = [
11064      *   { 'user': 'fred',   'age': 48 },
11065      *   { 'user': 'barney', 'age': 34 },
11066      *   { 'user': 'fred',   'age': 40 },
11067      *   { 'user': 'barney', 'age': 36 }
11068      * ];
11069      *
11070      * // Sort by `user` in ascending order and by `age` in descending order.
11071      * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
11072      * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
11073      */
11074     function orderBy(collection, iteratees, orders, guard) {
11075       if (collection == null) {
11076         return [];
11077       }
11078       if (!isArray(iteratees)) {
11079         iteratees = iteratees == null ? [] : [iteratees];
11080       }
11081       orders = guard ? undefined : orders;
11082       if (!isArray(orders)) {
11083         orders = orders == null ? [] : [orders];
11084       }
11085       return baseOrderBy(collection, iteratees, orders);
11086     }
11088     /**
11089      * Creates an array of elements split into two groups, the first of which
11090      * contains elements `predicate` returns truthy for, the second of which
11091      * contains elements `predicate` returns falsey for. The predicate is
11092      * invoked with one argument: (value).
11093      *
11094      * @static
11095      * @memberOf _
11096      * @since 3.0.0
11097      * @category Collection
11098      * @param {Array|Object} collection The collection to iterate over.
11099      * @param {Function} [predicate=_.identity] The function invoked per iteration.
11100      * @returns {Array} Returns the array of grouped elements.
11101      * @example
11102      *
11103      * var users = [
11104      *   { 'user': 'barney',  'age': 36, 'active': false },
11105      *   { 'user': 'fred',    'age': 40, 'active': true },
11106      *   { 'user': 'pebbles', 'age': 1,  'active': false }
11107      * ];
11108      *
11109      * _.partition(users, function(o) { return o.active; });
11110      * // => objects for [['fred'], ['barney', 'pebbles']]
11111      *
11112      * // The `_.matches` iteratee shorthand.
11113      * _.partition(users, { 'age': 1, 'active': false });
11114      * // => objects for [['pebbles'], ['barney', 'fred']]
11115      *
11116      * // The `_.matchesProperty` iteratee shorthand.
11117      * _.partition(users, ['active', false]);
11118      * // => objects for [['barney', 'pebbles'], ['fred']]
11119      *
11120      * // The `_.property` iteratee shorthand.
11121      * _.partition(users, 'active');
11122      * // => objects for [['fred'], ['barney', 'pebbles']]
11123      */
11124     var partition = createAggregator(function(result, value, key) {
11125       result[key ? 0 : 1].push(value);
11126     }, function() { return [[], []]; });
11128     /**
11129      * Reduces `collection` to a value which is the accumulated result of running
11130      * each element in `collection` thru `iteratee`, where each successive
11131      * invocation is supplied the return value of the previous. If `accumulator`
11132      * is not given, the first element of `collection` is used as the initial
11133      * value. The iteratee is invoked with four arguments:
11134      * (accumulator, value, index|key, collection).
11135      *
11136      * Many lodash methods are guarded to work as iteratees for methods like
11137      * `_.reduce`, `_.reduceRight`, and `_.transform`.
11138      *
11139      * The guarded methods are:
11140      * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
11141      * and `sortBy`
11142      *
11143      * @static
11144      * @memberOf _
11145      * @since 0.1.0
11146      * @category Collection
11147      * @param {Array|Object} collection The collection to iterate over.
11148      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
11149      * @param {*} [accumulator] The initial value.
11150      * @returns {*} Returns the accumulated value.
11151      * @see _.reduceRight
11152      * @example
11153      *
11154      * _.reduce([1, 2], function(sum, n) {
11155      *   return sum + n;
11156      * }, 0);
11157      * // => 3
11158      *
11159      * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
11160      *   (result[value] || (result[value] = [])).push(key);
11161      *   return result;
11162      * }, {});
11163      * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
11164      */
11165     function reduce(collection, iteratee, accumulator) {
11166       var func = isArray(collection) ? arrayReduce : baseReduce,
11167           initAccum = arguments.length < 3;
11169       return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
11170     }
11172     /**
11173      * This method is like `_.reduce` except that it iterates over elements of
11174      * `collection` from right to left.
11175      *
11176      * @static
11177      * @memberOf _
11178      * @since 0.1.0
11179      * @category Collection
11180      * @param {Array|Object} collection The collection to iterate over.
11181      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
11182      * @param {*} [accumulator] The initial value.
11183      * @returns {*} Returns the accumulated value.
11184      * @see _.reduce
11185      * @example
11186      *
11187      * var array = [[0, 1], [2, 3], [4, 5]];
11188      *
11189      * _.reduceRight(array, function(flattened, other) {
11190      *   return flattened.concat(other);
11191      * }, []);
11192      * // => [4, 5, 2, 3, 0, 1]
11193      */
11194     function reduceRight(collection, iteratee, accumulator) {
11195       var func = isArray(collection) ? arrayReduceRight : baseReduce,
11196           initAccum = arguments.length < 3;
11198       return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
11199     }
11201     /**
11202      * The opposite of `_.filter`; this method returns the elements of `collection`
11203      * that `predicate` does **not** return truthy for.
11204      *
11205      * @static
11206      * @memberOf _
11207      * @since 0.1.0
11208      * @category Collection
11209      * @param {Array|Object} collection The collection to iterate over.
11210      * @param {Function} [predicate=_.identity] The function invoked per iteration.
11211      * @returns {Array} Returns the new filtered array.
11212      * @see _.filter
11213      * @example
11214      *
11215      * var users = [
11216      *   { 'user': 'barney', 'age': 36, 'active': false },
11217      *   { 'user': 'fred',   'age': 40, 'active': true }
11218      * ];
11219      *
11220      * _.reject(users, function(o) { return !o.active; });
11221      * // => objects for ['fred']
11222      *
11223      * // The `_.matches` iteratee shorthand.
11224      * _.reject(users, { 'age': 40, 'active': true });
11225      * // => objects for ['barney']
11226      *
11227      * // The `_.matchesProperty` iteratee shorthand.
11228      * _.reject(users, ['active', false]);
11229      * // => objects for ['fred']
11230      *
11231      * // The `_.property` iteratee shorthand.
11232      * _.reject(users, 'active');
11233      * // => objects for ['barney']
11234      */
11235     function reject(collection, predicate) {
11236       var func = isArray(collection) ? arrayFilter : baseFilter;
11237       return func(collection, negate(getIteratee(predicate, 3)));
11238     }
11240     /**
11241      * Gets a random element from `collection`.
11242      *
11243      * @static
11244      * @memberOf _
11245      * @since 2.0.0
11246      * @category Collection
11247      * @param {Array|Object} collection The collection to sample.
11248      * @returns {*} Returns the random element.
11249      * @example
11250      *
11251      * _.sample([1, 2, 3, 4]);
11252      * // => 2
11253      */
11254     function sample(collection) {
11255       var func = isArray(collection) ? arraySample : baseSample;
11256       return func(collection);
11257     }
11259     /**
11260      * Gets `n` random elements at unique keys from `collection` up to the
11261      * size of `collection`.
11262      *
11263      * @static
11264      * @memberOf _
11265      * @since 4.0.0
11266      * @category Collection
11267      * @param {Array|Object} collection The collection to sample.
11268      * @param {number} [n=1] The number of elements to sample.
11269      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
11270      * @returns {Array} Returns the random elements.
11271      * @example
11272      *
11273      * _.sampleSize([1, 2, 3], 2);
11274      * // => [3, 1]
11275      *
11276      * _.sampleSize([1, 2, 3], 4);
11277      * // => [2, 3, 1]
11278      */
11279     function sampleSize(collection, n, guard) {
11280       if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
11281         n = 1;
11282       } else {
11283         n = toInteger(n);
11284       }
11285       var func = isArray(collection) ? arraySampleSize : baseSampleSize;
11286       return func(collection, n);
11287     }
11289     /**
11290      * Creates an array of shuffled values, using a version of the
11291      * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
11292      *
11293      * @static
11294      * @memberOf _
11295      * @since 0.1.0
11296      * @category Collection
11297      * @param {Array|Object} collection The collection to shuffle.
11298      * @returns {Array} Returns the new shuffled array.
11299      * @example
11300      *
11301      * _.shuffle([1, 2, 3, 4]);
11302      * // => [4, 1, 3, 2]
11303      */
11304     function shuffle(collection) {
11305       var func = isArray(collection) ? arrayShuffle : baseShuffle;
11306       return func(collection);
11307     }
11309     /**
11310      * Gets the size of `collection` by returning its length for array-like
11311      * values or the number of own enumerable string keyed properties for objects.
11312      *
11313      * @static
11314      * @memberOf _
11315      * @since 0.1.0
11316      * @category Collection
11317      * @param {Array|Object|string} collection The collection to inspect.
11318      * @returns {number} Returns the collection size.
11319      * @example
11320      *
11321      * _.size([1, 2, 3]);
11322      * // => 3
11323      *
11324      * _.size({ 'a': 1, 'b': 2 });
11325      * // => 2
11326      *
11327      * _.size('pebbles');
11328      * // => 7
11329      */
11330     function size(collection) {
11331       if (collection == null) {
11332         return 0;
11333       }
11334       if (isArrayLike(collection)) {
11335         return isString(collection) ? stringSize(collection) : collection.length;
11336       }
11337       var tag = getTag(collection);
11338       if (tag == mapTag || tag == setTag) {
11339         return collection.size;
11340       }
11341       return baseKeys(collection).length;
11342     }
11344     /**
11345      * Checks if `predicate` returns truthy for **any** element of `collection`.
11346      * Iteration is stopped once `predicate` returns truthy. The predicate is
11347      * invoked with three arguments: (value, index|key, collection).
11348      *
11349      * @static
11350      * @memberOf _
11351      * @since 0.1.0
11352      * @category Collection
11353      * @param {Array|Object} collection The collection to iterate over.
11354      * @param {Function} [predicate=_.identity] The function invoked per iteration.
11355      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
11356      * @returns {boolean} Returns `true` if any element passes the predicate check,
11357      *  else `false`.
11358      * @example
11359      *
11360      * _.some([null, 0, 'yes', false], Boolean);
11361      * // => true
11362      *
11363      * var users = [
11364      *   { 'user': 'barney', 'active': true },
11365      *   { 'user': 'fred',   'active': false }
11366      * ];
11367      *
11368      * // The `_.matches` iteratee shorthand.
11369      * _.some(users, { 'user': 'barney', 'active': false });
11370      * // => false
11371      *
11372      * // The `_.matchesProperty` iteratee shorthand.
11373      * _.some(users, ['active', false]);
11374      * // => true
11375      *
11376      * // The `_.property` iteratee shorthand.
11377      * _.some(users, 'active');
11378      * // => true
11379      */
11380     function some(collection, predicate, guard) {
11381       var func = isArray(collection) ? arraySome : baseSome;
11382       if (guard && isIterateeCall(collection, predicate, guard)) {
11383         predicate = undefined;
11384       }
11385       return func(collection, getIteratee(predicate, 3));
11386     }
11388     /**
11389      * Creates an array of elements, sorted in ascending order by the results of
11390      * running each element in a collection thru each iteratee. This method
11391      * performs a stable sort, that is, it preserves the original sort order of
11392      * equal elements. The iteratees are invoked with one argument: (value).
11393      *
11394      * @static
11395      * @memberOf _
11396      * @since 0.1.0
11397      * @category Collection
11398      * @param {Array|Object} collection The collection to iterate over.
11399      * @param {...(Function|Function[])} [iteratees=[_.identity]]
11400      *  The iteratees to sort by.
11401      * @returns {Array} Returns the new sorted array.
11402      * @example
11403      *
11404      * var users = [
11405      *   { 'user': 'fred',   'age': 48 },
11406      *   { 'user': 'barney', 'age': 36 },
11407      *   { 'user': 'fred',   'age': 40 },
11408      *   { 'user': 'barney', 'age': 34 }
11409      * ];
11410      *
11411      * _.sortBy(users, [function(o) { return o.user; }]);
11412      * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
11413      *
11414      * _.sortBy(users, ['user', 'age']);
11415      * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]
11416      */
11417     var sortBy = baseRest(function(collection, iteratees) {
11418       if (collection == null) {
11419         return [];
11420       }
11421       var length = iteratees.length;
11422       if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
11423         iteratees = [];
11424       } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
11425         iteratees = [iteratees[0]];
11426       }
11427       return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
11428     });
11430     /*------------------------------------------------------------------------*/
11432     /**
11433      * Gets the timestamp of the number of milliseconds that have elapsed since
11434      * the Unix epoch (1 January 1970 00:00:00 UTC).
11435      *
11436      * @static
11437      * @memberOf _
11438      * @since 2.4.0
11439      * @category Date
11440      * @returns {number} Returns the timestamp.
11441      * @example
11442      *
11443      * _.defer(function(stamp) {
11444      *   console.log(_.now() - stamp);
11445      * }, _.now());
11446      * // => Logs the number of milliseconds it took for the deferred invocation.
11447      */
11448     var now = ctxNow || function() {
11449       return root.Date.now();
11450     };
11452     /*------------------------------------------------------------------------*/
11454     /**
11455      * The opposite of `_.before`; this method creates a function that invokes
11456      * `func` once it's called `n` or more times.
11457      *
11458      * @static
11459      * @memberOf _
11460      * @since 0.1.0
11461      * @category Function
11462      * @param {number} n The number of calls before `func` is invoked.
11463      * @param {Function} func The function to restrict.
11464      * @returns {Function} Returns the new restricted function.
11465      * @example
11466      *
11467      * var saves = ['profile', 'settings'];
11468      *
11469      * var done = _.after(saves.length, function() {
11470      *   console.log('done saving!');
11471      * });
11472      *
11473      * _.forEach(saves, function(type) {
11474      *   asyncSave({ 'type': type, 'complete': done });
11475      * });
11476      * // => Logs 'done saving!' after the two async saves have completed.
11477      */
11478     function after(n, func) {
11479       if (typeof func != 'function') {
11480         throw new TypeError(FUNC_ERROR_TEXT);
11481       }
11482       n = toInteger(n);
11483       return function() {
11484         if (--n < 1) {
11485           return func.apply(this, arguments);
11486         }
11487       };
11488     }
11490     /**
11491      * Creates a function that invokes `func`, with up to `n` arguments,
11492      * ignoring any additional arguments.
11493      *
11494      * @static
11495      * @memberOf _
11496      * @since 3.0.0
11497      * @category Function
11498      * @param {Function} func The function to cap arguments for.
11499      * @param {number} [n=func.length] The arity cap.
11500      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
11501      * @returns {Function} Returns the new capped function.
11502      * @example
11503      *
11504      * _.map(['6', '8', '10'], _.ary(parseInt, 1));
11505      * // => [6, 8, 10]
11506      */
11507     function ary(func, n, guard) {
11508       n = guard ? undefined : n;
11509       n = (func && n == null) ? func.length : n;
11510       return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
11511     }
11513     /**
11514      * Creates a function that invokes `func`, with the `this` binding and arguments
11515      * of the created function, while it's called less than `n` times. Subsequent
11516      * calls to the created function return the result of the last `func` invocation.
11517      *
11518      * @static
11519      * @memberOf _
11520      * @since 3.0.0
11521      * @category Function
11522      * @param {number} n The number of calls at which `func` is no longer invoked.
11523      * @param {Function} func The function to restrict.
11524      * @returns {Function} Returns the new restricted function.
11525      * @example
11526      *
11527      * jQuery(element).on('click', _.before(5, addContactToList));
11528      * // => Allows adding up to 4 contacts to the list.
11529      */
11530     function before(n, func) {
11531       var result;
11532       if (typeof func != 'function') {
11533         throw new TypeError(FUNC_ERROR_TEXT);
11534       }
11535       n = toInteger(n);
11536       return function() {
11537         if (--n > 0) {
11538           result = func.apply(this, arguments);
11539         }
11540         if (n <= 1) {
11541           func = undefined;
11542         }
11543         return result;
11544       };
11545     }
11547     /**
11548      * Creates a function that invokes `func` with the `this` binding of `thisArg`
11549      * and `partials` prepended to the arguments it receives.
11550      *
11551      * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
11552      * may be used as a placeholder for partially applied arguments.
11553      *
11554      * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
11555      * property of bound functions.
11556      *
11557      * @static
11558      * @memberOf _
11559      * @since 0.1.0
11560      * @category Function
11561      * @param {Function} func The function to bind.
11562      * @param {*} thisArg The `this` binding of `func`.
11563      * @param {...*} [partials] The arguments to be partially applied.
11564      * @returns {Function} Returns the new bound function.
11565      * @example
11566      *
11567      * function greet(greeting, punctuation) {
11568      *   return greeting + ' ' + this.user + punctuation;
11569      * }
11570      *
11571      * var object = { 'user': 'fred' };
11572      *
11573      * var bound = _.bind(greet, object, 'hi');
11574      * bound('!');
11575      * // => 'hi fred!'
11576      *
11577      * // Bound with placeholders.
11578      * var bound = _.bind(greet, object, _, '!');
11579      * bound('hi');
11580      * // => 'hi fred!'
11581      */
11582     var bind = baseRest(function(func, thisArg, partials) {
11583       var bitmask = WRAP_BIND_FLAG;
11584       if (partials.length) {
11585         var holders = replaceHolders(partials, getHolder(bind));
11586         bitmask |= WRAP_PARTIAL_FLAG;
11587       }
11588       return createWrap(func, bitmask, thisArg, partials, holders);
11589     });
11591     /**
11592      * Creates a function that invokes the method at `object[key]` with `partials`
11593      * prepended to the arguments it receives.
11594      *
11595      * This method differs from `_.bind` by allowing bound functions to reference
11596      * methods that may be redefined or don't yet exist. See
11597      * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
11598      * for more details.
11599      *
11600      * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
11601      * builds, may be used as a placeholder for partially applied arguments.
11602      *
11603      * @static
11604      * @memberOf _
11605      * @since 0.10.0
11606      * @category Function
11607      * @param {Object} object The object to invoke the method on.
11608      * @param {string} key The key of the method.
11609      * @param {...*} [partials] The arguments to be partially applied.
11610      * @returns {Function} Returns the new bound function.
11611      * @example
11612      *
11613      * var object = {
11614      *   'user': 'fred',
11615      *   'greet': function(greeting, punctuation) {
11616      *     return greeting + ' ' + this.user + punctuation;
11617      *   }
11618      * };
11619      *
11620      * var bound = _.bindKey(object, 'greet', 'hi');
11621      * bound('!');
11622      * // => 'hi fred!'
11623      *
11624      * object.greet = function(greeting, punctuation) {
11625      *   return greeting + 'ya ' + this.user + punctuation;
11626      * };
11627      *
11628      * bound('!');
11629      * // => 'hiya fred!'
11630      *
11631      * // Bound with placeholders.
11632      * var bound = _.bindKey(object, 'greet', _, '!');
11633      * bound('hi');
11634      * // => 'hiya fred!'
11635      */
11636     var bindKey = baseRest(function(object, key, partials) {
11637       var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
11638       if (partials.length) {
11639         var holders = replaceHolders(partials, getHolder(bindKey));
11640         bitmask |= WRAP_PARTIAL_FLAG;
11641       }
11642       return createWrap(key, bitmask, object, partials, holders);
11643     });
11645     /**
11646      * Creates a function that accepts arguments of `func` and either invokes
11647      * `func` returning its result, if at least `arity` number of arguments have
11648      * been provided, or returns a function that accepts the remaining `func`
11649      * arguments, and so on. The arity of `func` may be specified if `func.length`
11650      * is not sufficient.
11651      *
11652      * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
11653      * may be used as a placeholder for provided arguments.
11654      *
11655      * **Note:** This method doesn't set the "length" property of curried functions.
11656      *
11657      * @static
11658      * @memberOf _
11659      * @since 2.0.0
11660      * @category Function
11661      * @param {Function} func The function to curry.
11662      * @param {number} [arity=func.length] The arity of `func`.
11663      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
11664      * @returns {Function} Returns the new curried function.
11665      * @example
11666      *
11667      * var abc = function(a, b, c) {
11668      *   return [a, b, c];
11669      * };
11670      *
11671      * var curried = _.curry(abc);
11672      *
11673      * curried(1)(2)(3);
11674      * // => [1, 2, 3]
11675      *
11676      * curried(1, 2)(3);
11677      * // => [1, 2, 3]
11678      *
11679      * curried(1, 2, 3);
11680      * // => [1, 2, 3]
11681      *
11682      * // Curried with placeholders.
11683      * curried(1)(_, 3)(2);
11684      * // => [1, 2, 3]
11685      */
11686     function curry(func, arity, guard) {
11687       arity = guard ? undefined : arity;
11688       var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
11689       result.placeholder = curry.placeholder;
11690       return result;
11691     }
11693     /**
11694      * This method is like `_.curry` except that arguments are applied to `func`
11695      * in the manner of `_.partialRight` instead of `_.partial`.
11696      *
11697      * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
11698      * builds, may be used as a placeholder for provided arguments.
11699      *
11700      * **Note:** This method doesn't set the "length" property of curried functions.
11701      *
11702      * @static
11703      * @memberOf _
11704      * @since 3.0.0
11705      * @category Function
11706      * @param {Function} func The function to curry.
11707      * @param {number} [arity=func.length] The arity of `func`.
11708      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
11709      * @returns {Function} Returns the new curried function.
11710      * @example
11711      *
11712      * var abc = function(a, b, c) {
11713      *   return [a, b, c];
11714      * };
11715      *
11716      * var curried = _.curryRight(abc);
11717      *
11718      * curried(3)(2)(1);
11719      * // => [1, 2, 3]
11720      *
11721      * curried(2, 3)(1);
11722      * // => [1, 2, 3]
11723      *
11724      * curried(1, 2, 3);
11725      * // => [1, 2, 3]
11726      *
11727      * // Curried with placeholders.
11728      * curried(3)(1, _)(2);
11729      * // => [1, 2, 3]
11730      */
11731     function curryRight(func, arity, guard) {
11732       arity = guard ? undefined : arity;
11733       var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
11734       result.placeholder = curryRight.placeholder;
11735       return result;
11736     }
11738     /**
11739      * Creates a debounced function that delays invoking `func` until after `wait`
11740      * milliseconds have elapsed since the last time the debounced function was
11741      * invoked. The debounced function comes with a `cancel` method to cancel
11742      * delayed `func` invocations and a `flush` method to immediately invoke them.
11743      * Provide `options` to indicate whether `func` should be invoked on the
11744      * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
11745      * with the last arguments provided to the debounced function. Subsequent
11746      * calls to the debounced function return the result of the last `func`
11747      * invocation.
11748      *
11749      * **Note:** If `leading` and `trailing` options are `true`, `func` is
11750      * invoked on the trailing edge of the timeout only if the debounced function
11751      * is invoked more than once during the `wait` timeout.
11752      *
11753      * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
11754      * until to the next tick, similar to `setTimeout` with a timeout of `0`.
11755      *
11756      * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
11757      * for details over the differences between `_.debounce` and `_.throttle`.
11758      *
11759      * @static
11760      * @memberOf _
11761      * @since 0.1.0
11762      * @category Function
11763      * @param {Function} func The function to debounce.
11764      * @param {number} [wait=0] The number of milliseconds to delay.
11765      * @param {Object} [options={}] The options object.
11766      * @param {boolean} [options.leading=false]
11767      *  Specify invoking on the leading edge of the timeout.
11768      * @param {number} [options.maxWait]
11769      *  The maximum time `func` is allowed to be delayed before it's invoked.
11770      * @param {boolean} [options.trailing=true]
11771      *  Specify invoking on the trailing edge of the timeout.
11772      * @returns {Function} Returns the new debounced function.
11773      * @example
11774      *
11775      * // Avoid costly calculations while the window size is in flux.
11776      * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
11777      *
11778      * // Invoke `sendMail` when clicked, debouncing subsequent calls.
11779      * jQuery(element).on('click', _.debounce(sendMail, 300, {
11780      *   'leading': true,
11781      *   'trailing': false
11782      * }));
11783      *
11784      * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
11785      * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
11786      * var source = new EventSource('/stream');
11787      * jQuery(source).on('message', debounced);
11788      *
11789      * // Cancel the trailing debounced invocation.
11790      * jQuery(window).on('popstate', debounced.cancel);
11791      */
11792     function debounce(func, wait, options) {
11793       var lastArgs,
11794           lastThis,
11795           maxWait,
11796           result,
11797           timerId,
11798           lastCallTime,
11799           lastInvokeTime = 0,
11800           leading = false,
11801           maxing = false,
11802           trailing = true;
11804       if (typeof func != 'function') {
11805         throw new TypeError(FUNC_ERROR_TEXT);
11806       }
11807       wait = toNumber(wait) || 0;
11808       if (isObject(options)) {
11809         leading = !!options.leading;
11810         maxing = 'maxWait' in options;
11811         maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
11812         trailing = 'trailing' in options ? !!options.trailing : trailing;
11813       }
11815       function invokeFunc(time) {
11816         var args = lastArgs,
11817             thisArg = lastThis;
11819         lastArgs = lastThis = undefined;
11820         lastInvokeTime = time;
11821         result = func.apply(thisArg, args);
11822         return result;
11823       }
11825       function leadingEdge(time) {
11826         // Reset any `maxWait` timer.
11827         lastInvokeTime = time;
11828         // Start the timer for the trailing edge.
11829         timerId = setTimeout(timerExpired, wait);
11830         // Invoke the leading edge.
11831         return leading ? invokeFunc(time) : result;
11832       }
11834       function remainingWait(time) {
11835         var timeSinceLastCall = time - lastCallTime,
11836             timeSinceLastInvoke = time - lastInvokeTime,
11837             timeWaiting = wait - timeSinceLastCall;
11839         return maxing
11840           ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
11841           : timeWaiting;
11842       }
11844       function shouldInvoke(time) {
11845         var timeSinceLastCall = time - lastCallTime,
11846             timeSinceLastInvoke = time - lastInvokeTime;
11848         // Either this is the first call, activity has stopped and we're at the
11849         // trailing edge, the system time has gone backwards and we're treating
11850         // it as the trailing edge, or we've hit the `maxWait` limit.
11851         return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
11852           (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
11853       }
11855       function timerExpired() {
11856         var time = now();
11857         if (shouldInvoke(time)) {
11858           return trailingEdge(time);
11859         }
11860         // Restart the timer.
11861         timerId = setTimeout(timerExpired, remainingWait(time));
11862       }
11864       function trailingEdge(time) {
11865         timerId = undefined;
11867         // Only invoke if we have `lastArgs` which means `func` has been
11868         // debounced at least once.
11869         if (trailing && lastArgs) {
11870           return invokeFunc(time);
11871         }
11872         lastArgs = lastThis = undefined;
11873         return result;
11874       }
11876       function cancel() {
11877         if (timerId !== undefined) {
11878           clearTimeout(timerId);
11879         }
11880         lastInvokeTime = 0;
11881         lastArgs = lastCallTime = lastThis = timerId = undefined;
11882       }
11884       function flush() {
11885         return timerId === undefined ? result : trailingEdge(now());
11886       }
11888       function debounced() {
11889         var time = now(),
11890             isInvoking = shouldInvoke(time);
11892         lastArgs = arguments;
11893         lastThis = this;
11894         lastCallTime = time;
11896         if (isInvoking) {
11897           if (timerId === undefined) {
11898             return leadingEdge(lastCallTime);
11899           }
11900           if (maxing) {
11901             // Handle invocations in a tight loop.
11902             timerId = setTimeout(timerExpired, wait);
11903             return invokeFunc(lastCallTime);
11904           }
11905         }
11906         if (timerId === undefined) {
11907           timerId = setTimeout(timerExpired, wait);
11908         }
11909         return result;
11910       }
11911       debounced.cancel = cancel;
11912       debounced.flush = flush;
11913       return debounced;
11914     }
11916     /**
11917      * Defers invoking the `func` until the current call stack has cleared. Any
11918      * additional arguments are provided to `func` when it's invoked.
11919      *
11920      * @static
11921      * @memberOf _
11922      * @since 0.1.0
11923      * @category Function
11924      * @param {Function} func The function to defer.
11925      * @param {...*} [args] The arguments to invoke `func` with.
11926      * @returns {number} Returns the timer id.
11927      * @example
11928      *
11929      * _.defer(function(text) {
11930      *   console.log(text);
11931      * }, 'deferred');
11932      * // => Logs 'deferred' after one millisecond.
11933      */
11934     var defer = baseRest(function(func, args) {
11935       return baseDelay(func, 1, args);
11936     });
11938     /**
11939      * Invokes `func` after `wait` milliseconds. Any additional arguments are
11940      * provided to `func` when it's invoked.
11941      *
11942      * @static
11943      * @memberOf _
11944      * @since 0.1.0
11945      * @category Function
11946      * @param {Function} func The function to delay.
11947      * @param {number} wait The number of milliseconds to delay invocation.
11948      * @param {...*} [args] The arguments to invoke `func` with.
11949      * @returns {number} Returns the timer id.
11950      * @example
11951      *
11952      * _.delay(function(text) {
11953      *   console.log(text);
11954      * }, 1000, 'later');
11955      * // => Logs 'later' after one second.
11956      */
11957     var delay = baseRest(function(func, wait, args) {
11958       return baseDelay(func, toNumber(wait) || 0, args);
11959     });
11961     /**
11962      * Creates a function that invokes `func` with arguments reversed.
11963      *
11964      * @static
11965      * @memberOf _
11966      * @since 4.0.0
11967      * @category Function
11968      * @param {Function} func The function to flip arguments for.
11969      * @returns {Function} Returns the new flipped function.
11970      * @example
11971      *
11972      * var flipped = _.flip(function() {
11973      *   return _.toArray(arguments);
11974      * });
11975      *
11976      * flipped('a', 'b', 'c', 'd');
11977      * // => ['d', 'c', 'b', 'a']
11978      */
11979     function flip(func) {
11980       return createWrap(func, WRAP_FLIP_FLAG);
11981     }
11983     /**
11984      * Creates a function that memoizes the result of `func`. If `resolver` is
11985      * provided, it determines the cache key for storing the result based on the
11986      * arguments provided to the memoized function. By default, the first argument
11987      * provided to the memoized function is used as the map cache key. The `func`
11988      * is invoked with the `this` binding of the memoized function.
11989      *
11990      * **Note:** The cache is exposed as the `cache` property on the memoized
11991      * function. Its creation may be customized by replacing the `_.memoize.Cache`
11992      * constructor with one whose instances implement the
11993      * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
11994      * method interface of `clear`, `delete`, `get`, `has`, and `set`.
11995      *
11996      * @static
11997      * @memberOf _
11998      * @since 0.1.0
11999      * @category Function
12000      * @param {Function} func The function to have its output memoized.
12001      * @param {Function} [resolver] The function to resolve the cache key.
12002      * @returns {Function} Returns the new memoized function.
12003      * @example
12004      *
12005      * var object = { 'a': 1, 'b': 2 };
12006      * var other = { 'c': 3, 'd': 4 };
12007      *
12008      * var values = _.memoize(_.values);
12009      * values(object);
12010      * // => [1, 2]
12011      *
12012      * values(other);
12013      * // => [3, 4]
12014      *
12015      * object.a = 2;
12016      * values(object);
12017      * // => [1, 2]
12018      *
12019      * // Modify the result cache.
12020      * values.cache.set(object, ['a', 'b']);
12021      * values(object);
12022      * // => ['a', 'b']
12023      *
12024      * // Replace `_.memoize.Cache`.
12025      * _.memoize.Cache = WeakMap;
12026      */
12027     function memoize(func, resolver) {
12028       if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
12029         throw new TypeError(FUNC_ERROR_TEXT);
12030       }
12031       var memoized = function() {
12032         var args = arguments,
12033             key = resolver ? resolver.apply(this, args) : args[0],
12034             cache = memoized.cache;
12036         if (cache.has(key)) {
12037           return cache.get(key);
12038         }
12039         var result = func.apply(this, args);
12040         memoized.cache = cache.set(key, result) || cache;
12041         return result;
12042       };
12043       memoized.cache = new (memoize.Cache || MapCache);
12044       return memoized;
12045     }
12047     // Expose `MapCache`.
12048     memoize.Cache = MapCache;
12050     /**
12051      * Creates a function that negates the result of the predicate `func`. The
12052      * `func` predicate is invoked with the `this` binding and arguments of the
12053      * created function.
12054      *
12055      * @static
12056      * @memberOf _
12057      * @since 3.0.0
12058      * @category Function
12059      * @param {Function} predicate The predicate to negate.
12060      * @returns {Function} Returns the new negated function.
12061      * @example
12062      *
12063      * function isEven(n) {
12064      *   return n % 2 == 0;
12065      * }
12066      *
12067      * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
12068      * // => [1, 3, 5]
12069      */
12070     function negate(predicate) {
12071       if (typeof predicate != 'function') {
12072         throw new TypeError(FUNC_ERROR_TEXT);
12073       }
12074       return function() {
12075         var args = arguments;
12076         switch (args.length) {
12077           case 0: return !predicate.call(this);
12078           case 1: return !predicate.call(this, args[0]);
12079           case 2: return !predicate.call(this, args[0], args[1]);
12080           case 3: return !predicate.call(this, args[0], args[1], args[2]);
12081         }
12082         return !predicate.apply(this, args);
12083       };
12084     }
12086     /**
12087      * Creates a function that is restricted to invoking `func` once. Repeat calls
12088      * to the function return the value of the first invocation. The `func` is
12089      * invoked with the `this` binding and arguments of the created function.
12090      *
12091      * @static
12092      * @memberOf _
12093      * @since 0.1.0
12094      * @category Function
12095      * @param {Function} func The function to restrict.
12096      * @returns {Function} Returns the new restricted function.
12097      * @example
12098      *
12099      * var initialize = _.once(createApplication);
12100      * initialize();
12101      * initialize();
12102      * // => `createApplication` is invoked once
12103      */
12104     function once(func) {
12105       return before(2, func);
12106     }
12108     /**
12109      * Creates a function that invokes `func` with its arguments transformed.
12110      *
12111      * @static
12112      * @since 4.0.0
12113      * @memberOf _
12114      * @category Function
12115      * @param {Function} func The function to wrap.
12116      * @param {...(Function|Function[])} [transforms=[_.identity]]
12117      *  The argument transforms.
12118      * @returns {Function} Returns the new function.
12119      * @example
12120      *
12121      * function doubled(n) {
12122      *   return n * 2;
12123      * }
12124      *
12125      * function square(n) {
12126      *   return n * n;
12127      * }
12128      *
12129      * var func = _.overArgs(function(x, y) {
12130      *   return [x, y];
12131      * }, [square, doubled]);
12132      *
12133      * func(9, 3);
12134      * // => [81, 6]
12135      *
12136      * func(10, 5);
12137      * // => [100, 10]
12138      */
12139     var overArgs = castRest(function(func, transforms) {
12140       transforms = (transforms.length == 1 && isArray(transforms[0]))
12141         ? arrayMap(transforms[0], baseUnary(getIteratee()))
12142         : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
12144       var funcsLength = transforms.length;
12145       return baseRest(function(args) {
12146         var index = -1,
12147             length = nativeMin(args.length, funcsLength);
12149         while (++index < length) {
12150           args[index] = transforms[index].call(this, args[index]);
12151         }
12152         return apply(func, this, args);
12153       });
12154     });
12156     /**
12157      * Creates a function that invokes `func` with `partials` prepended to the
12158      * arguments it receives. This method is like `_.bind` except it does **not**
12159      * alter the `this` binding.
12160      *
12161      * The `_.partial.placeholder` value, which defaults to `_` in monolithic
12162      * builds, may be used as a placeholder for partially applied arguments.
12163      *
12164      * **Note:** This method doesn't set the "length" property of partially
12165      * applied functions.
12166      *
12167      * @static
12168      * @memberOf _
12169      * @since 0.2.0
12170      * @category Function
12171      * @param {Function} func The function to partially apply arguments to.
12172      * @param {...*} [partials] The arguments to be partially applied.
12173      * @returns {Function} Returns the new partially applied function.
12174      * @example
12175      *
12176      * function greet(greeting, name) {
12177      *   return greeting + ' ' + name;
12178      * }
12179      *
12180      * var sayHelloTo = _.partial(greet, 'hello');
12181      * sayHelloTo('fred');
12182      * // => 'hello fred'
12183      *
12184      * // Partially applied with placeholders.
12185      * var greetFred = _.partial(greet, _, 'fred');
12186      * greetFred('hi');
12187      * // => 'hi fred'
12188      */
12189     var partial = baseRest(function(func, partials) {
12190       var holders = replaceHolders(partials, getHolder(partial));
12191       return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
12192     });
12194     /**
12195      * This method is like `_.partial` except that partially applied arguments
12196      * are appended to the arguments it receives.
12197      *
12198      * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
12199      * builds, may be used as a placeholder for partially applied arguments.
12200      *
12201      * **Note:** This method doesn't set the "length" property of partially
12202      * applied functions.
12203      *
12204      * @static
12205      * @memberOf _
12206      * @since 1.0.0
12207      * @category Function
12208      * @param {Function} func The function to partially apply arguments to.
12209      * @param {...*} [partials] The arguments to be partially applied.
12210      * @returns {Function} Returns the new partially applied function.
12211      * @example
12212      *
12213      * function greet(greeting, name) {
12214      *   return greeting + ' ' + name;
12215      * }
12216      *
12217      * var greetFred = _.partialRight(greet, 'fred');
12218      * greetFred('hi');
12219      * // => 'hi fred'
12220      *
12221      * // Partially applied with placeholders.
12222      * var sayHelloTo = _.partialRight(greet, 'hello', _);
12223      * sayHelloTo('fred');
12224      * // => 'hello fred'
12225      */
12226     var partialRight = baseRest(function(func, partials) {
12227       var holders = replaceHolders(partials, getHolder(partialRight));
12228       return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
12229     });
12231     /**
12232      * Creates a function that invokes `func` with arguments arranged according
12233      * to the specified `indexes` where the argument value at the first index is
12234      * provided as the first argument, the argument value at the second index is
12235      * provided as the second argument, and so on.
12236      *
12237      * @static
12238      * @memberOf _
12239      * @since 3.0.0
12240      * @category Function
12241      * @param {Function} func The function to rearrange arguments for.
12242      * @param {...(number|number[])} indexes The arranged argument indexes.
12243      * @returns {Function} Returns the new function.
12244      * @example
12245      *
12246      * var rearged = _.rearg(function(a, b, c) {
12247      *   return [a, b, c];
12248      * }, [2, 0, 1]);
12249      *
12250      * rearged('b', 'c', 'a')
12251      * // => ['a', 'b', 'c']
12252      */
12253     var rearg = flatRest(function(func, indexes) {
12254       return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
12255     });
12257     /**
12258      * Creates a function that invokes `func` with the `this` binding of the
12259      * created function and arguments from `start` and beyond provided as
12260      * an array.
12261      *
12262      * **Note:** This method is based on the
12263      * [rest parameter](https://mdn.io/rest_parameters).
12264      *
12265      * @static
12266      * @memberOf _
12267      * @since 4.0.0
12268      * @category Function
12269      * @param {Function} func The function to apply a rest parameter to.
12270      * @param {number} [start=func.length-1] The start position of the rest parameter.
12271      * @returns {Function} Returns the new function.
12272      * @example
12273      *
12274      * var say = _.rest(function(what, names) {
12275      *   return what + ' ' + _.initial(names).join(', ') +
12276      *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
12277      * });
12278      *
12279      * say('hello', 'fred', 'barney', 'pebbles');
12280      * // => 'hello fred, barney, & pebbles'
12281      */
12282     function rest(func, start) {
12283       if (typeof func != 'function') {
12284         throw new TypeError(FUNC_ERROR_TEXT);
12285       }
12286       start = start === undefined ? start : toInteger(start);
12287       return baseRest(func, start);
12288     }
12290     /**
12291      * Creates a function that invokes `func` with the `this` binding of the
12292      * create function and an array of arguments much like
12293      * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
12294      *
12295      * **Note:** This method is based on the
12296      * [spread operator](https://mdn.io/spread_operator).
12297      *
12298      * @static
12299      * @memberOf _
12300      * @since 3.2.0
12301      * @category Function
12302      * @param {Function} func The function to spread arguments over.
12303      * @param {number} [start=0] The start position of the spread.
12304      * @returns {Function} Returns the new function.
12305      * @example
12306      *
12307      * var say = _.spread(function(who, what) {
12308      *   return who + ' says ' + what;
12309      * });
12310      *
12311      * say(['fred', 'hello']);
12312      * // => 'fred says hello'
12313      *
12314      * var numbers = Promise.all([
12315      *   Promise.resolve(40),
12316      *   Promise.resolve(36)
12317      * ]);
12318      *
12319      * numbers.then(_.spread(function(x, y) {
12320      *   return x + y;
12321      * }));
12322      * // => a Promise of 76
12323      */
12324     function spread(func, start) {
12325       if (typeof func != 'function') {
12326         throw new TypeError(FUNC_ERROR_TEXT);
12327       }
12328       start = start == null ? 0 : nativeMax(toInteger(start), 0);
12329       return baseRest(function(args) {
12330         var array = args[start],
12331             otherArgs = castSlice(args, 0, start);
12333         if (array) {
12334           arrayPush(otherArgs, array);
12335         }
12336         return apply(func, this, otherArgs);
12337       });
12338     }
12340     /**
12341      * Creates a throttled function that only invokes `func` at most once per
12342      * every `wait` milliseconds. The throttled function comes with a `cancel`
12343      * method to cancel delayed `func` invocations and a `flush` method to
12344      * immediately invoke them. Provide `options` to indicate whether `func`
12345      * should be invoked on the leading and/or trailing edge of the `wait`
12346      * timeout. The `func` is invoked with the last arguments provided to the
12347      * throttled function. Subsequent calls to the throttled function return the
12348      * result of the last `func` invocation.
12349      *
12350      * **Note:** If `leading` and `trailing` options are `true`, `func` is
12351      * invoked on the trailing edge of the timeout only if the throttled function
12352      * is invoked more than once during the `wait` timeout.
12353      *
12354      * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
12355      * until to the next tick, similar to `setTimeout` with a timeout of `0`.
12356      *
12357      * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
12358      * for details over the differences between `_.throttle` and `_.debounce`.
12359      *
12360      * @static
12361      * @memberOf _
12362      * @since 0.1.0
12363      * @category Function
12364      * @param {Function} func The function to throttle.
12365      * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
12366      * @param {Object} [options={}] The options object.
12367      * @param {boolean} [options.leading=true]
12368      *  Specify invoking on the leading edge of the timeout.
12369      * @param {boolean} [options.trailing=true]
12370      *  Specify invoking on the trailing edge of the timeout.
12371      * @returns {Function} Returns the new throttled function.
12372      * @example
12373      *
12374      * // Avoid excessively updating the position while scrolling.
12375      * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
12376      *
12377      * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
12378      * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
12379      * jQuery(element).on('click', throttled);
12380      *
12381      * // Cancel the trailing throttled invocation.
12382      * jQuery(window).on('popstate', throttled.cancel);
12383      */
12384     function throttle(func, wait, options) {
12385       var leading = true,
12386           trailing = true;
12388       if (typeof func != 'function') {
12389         throw new TypeError(FUNC_ERROR_TEXT);
12390       }
12391       if (isObject(options)) {
12392         leading = 'leading' in options ? !!options.leading : leading;
12393         trailing = 'trailing' in options ? !!options.trailing : trailing;
12394       }
12395       return debounce(func, wait, {
12396         'leading': leading,
12397         'maxWait': wait,
12398         'trailing': trailing
12399       });
12400     }
12402     /**
12403      * Creates a function that accepts up to one argument, ignoring any
12404      * additional arguments.
12405      *
12406      * @static
12407      * @memberOf _
12408      * @since 4.0.0
12409      * @category Function
12410      * @param {Function} func The function to cap arguments for.
12411      * @returns {Function} Returns the new capped function.
12412      * @example
12413      *
12414      * _.map(['6', '8', '10'], _.unary(parseInt));
12415      * // => [6, 8, 10]
12416      */
12417     function unary(func) {
12418       return ary(func, 1);
12419     }
12421     /**
12422      * Creates a function that provides `value` to `wrapper` as its first
12423      * argument. Any additional arguments provided to the function are appended
12424      * to those provided to the `wrapper`. The wrapper is invoked with the `this`
12425      * binding of the created function.
12426      *
12427      * @static
12428      * @memberOf _
12429      * @since 0.1.0
12430      * @category Function
12431      * @param {*} value The value to wrap.
12432      * @param {Function} [wrapper=identity] The wrapper function.
12433      * @returns {Function} Returns the new function.
12434      * @example
12435      *
12436      * var p = _.wrap(_.escape, function(func, text) {
12437      *   return '<p>' + func(text) + '</p>';
12438      * });
12439      *
12440      * p('fred, barney, & pebbles');
12441      * // => '<p>fred, barney, &amp; pebbles</p>'
12442      */
12443     function wrap(value, wrapper) {
12444       return partial(castFunction(wrapper), value);
12445     }
12447     /*------------------------------------------------------------------------*/
12449     /**
12450      * Casts `value` as an array if it's not one.
12451      *
12452      * @static
12453      * @memberOf _
12454      * @since 4.4.0
12455      * @category Lang
12456      * @param {*} value The value to inspect.
12457      * @returns {Array} Returns the cast array.
12458      * @example
12459      *
12460      * _.castArray(1);
12461      * // => [1]
12462      *
12463      * _.castArray({ 'a': 1 });
12464      * // => [{ 'a': 1 }]
12465      *
12466      * _.castArray('abc');
12467      * // => ['abc']
12468      *
12469      * _.castArray(null);
12470      * // => [null]
12471      *
12472      * _.castArray(undefined);
12473      * // => [undefined]
12474      *
12475      * _.castArray();
12476      * // => []
12477      *
12478      * var array = [1, 2, 3];
12479      * console.log(_.castArray(array) === array);
12480      * // => true
12481      */
12482     function castArray() {
12483       if (!arguments.length) {
12484         return [];
12485       }
12486       var value = arguments[0];
12487       return isArray(value) ? value : [value];
12488     }
12490     /**
12491      * Creates a shallow clone of `value`.
12492      *
12493      * **Note:** This method is loosely based on the
12494      * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
12495      * and supports cloning arrays, array buffers, booleans, date objects, maps,
12496      * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
12497      * arrays. The own enumerable properties of `arguments` objects are cloned
12498      * as plain objects. An empty object is returned for uncloneable values such
12499      * as error objects, functions, DOM nodes, and WeakMaps.
12500      *
12501      * @static
12502      * @memberOf _
12503      * @since 0.1.0
12504      * @category Lang
12505      * @param {*} value The value to clone.
12506      * @returns {*} Returns the cloned value.
12507      * @see _.cloneDeep
12508      * @example
12509      *
12510      * var objects = [{ 'a': 1 }, { 'b': 2 }];
12511      *
12512      * var shallow = _.clone(objects);
12513      * console.log(shallow[0] === objects[0]);
12514      * // => true
12515      */
12516     function clone(value) {
12517       return baseClone(value, CLONE_SYMBOLS_FLAG);
12518     }
12520     /**
12521      * This method is like `_.clone` except that it accepts `customizer` which
12522      * is invoked to produce the cloned value. If `customizer` returns `undefined`,
12523      * cloning is handled by the method instead. The `customizer` is invoked with
12524      * up to four arguments; (value [, index|key, object, stack]).
12525      *
12526      * @static
12527      * @memberOf _
12528      * @since 4.0.0
12529      * @category Lang
12530      * @param {*} value The value to clone.
12531      * @param {Function} [customizer] The function to customize cloning.
12532      * @returns {*} Returns the cloned value.
12533      * @see _.cloneDeepWith
12534      * @example
12535      *
12536      * function customizer(value) {
12537      *   if (_.isElement(value)) {
12538      *     return value.cloneNode(false);
12539      *   }
12540      * }
12541      *
12542      * var el = _.cloneWith(document.body, customizer);
12543      *
12544      * console.log(el === document.body);
12545      * // => false
12546      * console.log(el.nodeName);
12547      * // => 'BODY'
12548      * console.log(el.childNodes.length);
12549      * // => 0
12550      */
12551     function cloneWith(value, customizer) {
12552       customizer = typeof customizer == 'function' ? customizer : undefined;
12553       return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
12554     }
12556     /**
12557      * This method is like `_.clone` except that it recursively clones `value`.
12558      *
12559      * @static
12560      * @memberOf _
12561      * @since 1.0.0
12562      * @category Lang
12563      * @param {*} value The value to recursively clone.
12564      * @returns {*} Returns the deep cloned value.
12565      * @see _.clone
12566      * @example
12567      *
12568      * var objects = [{ 'a': 1 }, { 'b': 2 }];
12569      *
12570      * var deep = _.cloneDeep(objects);
12571      * console.log(deep[0] === objects[0]);
12572      * // => false
12573      */
12574     function cloneDeep(value) {
12575       return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
12576     }
12578     /**
12579      * This method is like `_.cloneWith` except that it recursively clones `value`.
12580      *
12581      * @static
12582      * @memberOf _
12583      * @since 4.0.0
12584      * @category Lang
12585      * @param {*} value The value to recursively clone.
12586      * @param {Function} [customizer] The function to customize cloning.
12587      * @returns {*} Returns the deep cloned value.
12588      * @see _.cloneWith
12589      * @example
12590      *
12591      * function customizer(value) {
12592      *   if (_.isElement(value)) {
12593      *     return value.cloneNode(true);
12594      *   }
12595      * }
12596      *
12597      * var el = _.cloneDeepWith(document.body, customizer);
12598      *
12599      * console.log(el === document.body);
12600      * // => false
12601      * console.log(el.nodeName);
12602      * // => 'BODY'
12603      * console.log(el.childNodes.length);
12604      * // => 20
12605      */
12606     function cloneDeepWith(value, customizer) {
12607       customizer = typeof customizer == 'function' ? customizer : undefined;
12608       return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
12609     }
12611     /**
12612      * Checks if `object` conforms to `source` by invoking the predicate
12613      * properties of `source` with the corresponding property values of `object`.
12614      *
12615      * **Note:** This method is equivalent to `_.conforms` when `source` is
12616      * partially applied.
12617      *
12618      * @static
12619      * @memberOf _
12620      * @since 4.14.0
12621      * @category Lang
12622      * @param {Object} object The object to inspect.
12623      * @param {Object} source The object of property predicates to conform to.
12624      * @returns {boolean} Returns `true` if `object` conforms, else `false`.
12625      * @example
12626      *
12627      * var object = { 'a': 1, 'b': 2 };
12628      *
12629      * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
12630      * // => true
12631      *
12632      * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
12633      * // => false
12634      */
12635     function conformsTo(object, source) {
12636       return source == null || baseConformsTo(object, source, keys(source));
12637     }
12639     /**
12640      * Performs a
12641      * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
12642      * comparison between two values to determine if they are equivalent.
12643      *
12644      * @static
12645      * @memberOf _
12646      * @since 4.0.0
12647      * @category Lang
12648      * @param {*} value The value to compare.
12649      * @param {*} other The other value to compare.
12650      * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
12651      * @example
12652      *
12653      * var object = { 'a': 1 };
12654      * var other = { 'a': 1 };
12655      *
12656      * _.eq(object, object);
12657      * // => true
12658      *
12659      * _.eq(object, other);
12660      * // => false
12661      *
12662      * _.eq('a', 'a');
12663      * // => true
12664      *
12665      * _.eq('a', Object('a'));
12666      * // => false
12667      *
12668      * _.eq(NaN, NaN);
12669      * // => true
12670      */
12671     function eq(value, other) {
12672       return value === other || (value !== value && other !== other);
12673     }
12675     /**
12676      * Checks if `value` is greater than `other`.
12677      *
12678      * @static
12679      * @memberOf _
12680      * @since 3.9.0
12681      * @category Lang
12682      * @param {*} value The value to compare.
12683      * @param {*} other The other value to compare.
12684      * @returns {boolean} Returns `true` if `value` is greater than `other`,
12685      *  else `false`.
12686      * @see _.lt
12687      * @example
12688      *
12689      * _.gt(3, 1);
12690      * // => true
12691      *
12692      * _.gt(3, 3);
12693      * // => false
12694      *
12695      * _.gt(1, 3);
12696      * // => false
12697      */
12698     var gt = createRelationalOperation(baseGt);
12700     /**
12701      * Checks if `value` is greater than or equal to `other`.
12702      *
12703      * @static
12704      * @memberOf _
12705      * @since 3.9.0
12706      * @category Lang
12707      * @param {*} value The value to compare.
12708      * @param {*} other The other value to compare.
12709      * @returns {boolean} Returns `true` if `value` is greater than or equal to
12710      *  `other`, else `false`.
12711      * @see _.lte
12712      * @example
12713      *
12714      * _.gte(3, 1);
12715      * // => true
12716      *
12717      * _.gte(3, 3);
12718      * // => true
12719      *
12720      * _.gte(1, 3);
12721      * // => false
12722      */
12723     var gte = createRelationalOperation(function(value, other) {
12724       return value >= other;
12725     });
12727     /**
12728      * Checks if `value` is likely an `arguments` object.
12729      *
12730      * @static
12731      * @memberOf _
12732      * @since 0.1.0
12733      * @category Lang
12734      * @param {*} value The value to check.
12735      * @returns {boolean} Returns `true` if `value` is an `arguments` object,
12736      *  else `false`.
12737      * @example
12738      *
12739      * _.isArguments(function() { return arguments; }());
12740      * // => true
12741      *
12742      * _.isArguments([1, 2, 3]);
12743      * // => false
12744      */
12745     var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
12746       return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
12747         !propertyIsEnumerable.call(value, 'callee');
12748     };
12750     /**
12751      * Checks if `value` is classified as an `Array` object.
12752      *
12753      * @static
12754      * @memberOf _
12755      * @since 0.1.0
12756      * @category Lang
12757      * @param {*} value The value to check.
12758      * @returns {boolean} Returns `true` if `value` is an array, else `false`.
12759      * @example
12760      *
12761      * _.isArray([1, 2, 3]);
12762      * // => true
12763      *
12764      * _.isArray(document.body.children);
12765      * // => false
12766      *
12767      * _.isArray('abc');
12768      * // => false
12769      *
12770      * _.isArray(_.noop);
12771      * // => false
12772      */
12773     var isArray = Array.isArray;
12775     /**
12776      * Checks if `value` is classified as an `ArrayBuffer` object.
12777      *
12778      * @static
12779      * @memberOf _
12780      * @since 4.3.0
12781      * @category Lang
12782      * @param {*} value The value to check.
12783      * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
12784      * @example
12785      *
12786      * _.isArrayBuffer(new ArrayBuffer(2));
12787      * // => true
12788      *
12789      * _.isArrayBuffer(new Array(2));
12790      * // => false
12791      */
12792     var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
12794     /**
12795      * Checks if `value` is array-like. A value is considered array-like if it's
12796      * not a function and has a `value.length` that's an integer greater than or
12797      * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
12798      *
12799      * @static
12800      * @memberOf _
12801      * @since 4.0.0
12802      * @category Lang
12803      * @param {*} value The value to check.
12804      * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
12805      * @example
12806      *
12807      * _.isArrayLike([1, 2, 3]);
12808      * // => true
12809      *
12810      * _.isArrayLike(document.body.children);
12811      * // => true
12812      *
12813      * _.isArrayLike('abc');
12814      * // => true
12815      *
12816      * _.isArrayLike(_.noop);
12817      * // => false
12818      */
12819     function isArrayLike(value) {
12820       return value != null && isLength(value.length) && !isFunction(value);
12821     }
12823     /**
12824      * This method is like `_.isArrayLike` except that it also checks if `value`
12825      * is an object.
12826      *
12827      * @static
12828      * @memberOf _
12829      * @since 4.0.0
12830      * @category Lang
12831      * @param {*} value The value to check.
12832      * @returns {boolean} Returns `true` if `value` is an array-like object,
12833      *  else `false`.
12834      * @example
12835      *
12836      * _.isArrayLikeObject([1, 2, 3]);
12837      * // => true
12838      *
12839      * _.isArrayLikeObject(document.body.children);
12840      * // => true
12841      *
12842      * _.isArrayLikeObject('abc');
12843      * // => false
12844      *
12845      * _.isArrayLikeObject(_.noop);
12846      * // => false
12847      */
12848     function isArrayLikeObject(value) {
12849       return isObjectLike(value) && isArrayLike(value);
12850     }
12852     /**
12853      * Checks if `value` is classified as a boolean primitive or object.
12854      *
12855      * @static
12856      * @memberOf _
12857      * @since 0.1.0
12858      * @category Lang
12859      * @param {*} value The value to check.
12860      * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
12861      * @example
12862      *
12863      * _.isBoolean(false);
12864      * // => true
12865      *
12866      * _.isBoolean(null);
12867      * // => false
12868      */
12869     function isBoolean(value) {
12870       return value === true || value === false ||
12871         (isObjectLike(value) && baseGetTag(value) == boolTag);
12872     }
12874     /**
12875      * Checks if `value` is a buffer.
12876      *
12877      * @static
12878      * @memberOf _
12879      * @since 4.3.0
12880      * @category Lang
12881      * @param {*} value The value to check.
12882      * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
12883      * @example
12884      *
12885      * _.isBuffer(new Buffer(2));
12886      * // => true
12887      *
12888      * _.isBuffer(new Uint8Array(2));
12889      * // => false
12890      */
12891     var isBuffer = nativeIsBuffer || stubFalse;
12893     /**
12894      * Checks if `value` is classified as a `Date` object.
12895      *
12896      * @static
12897      * @memberOf _
12898      * @since 0.1.0
12899      * @category Lang
12900      * @param {*} value The value to check.
12901      * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
12902      * @example
12903      *
12904      * _.isDate(new Date);
12905      * // => true
12906      *
12907      * _.isDate('Mon April 23 2012');
12908      * // => false
12909      */
12910     var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
12912     /**
12913      * Checks if `value` is likely a DOM element.
12914      *
12915      * @static
12916      * @memberOf _
12917      * @since 0.1.0
12918      * @category Lang
12919      * @param {*} value The value to check.
12920      * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
12921      * @example
12922      *
12923      * _.isElement(document.body);
12924      * // => true
12925      *
12926      * _.isElement('<body>');
12927      * // => false
12928      */
12929     function isElement(value) {
12930       return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
12931     }
12933     /**
12934      * Checks if `value` is an empty object, collection, map, or set.
12935      *
12936      * Objects are considered empty if they have no own enumerable string keyed
12937      * properties.
12938      *
12939      * Array-like values such as `arguments` objects, arrays, buffers, strings, or
12940      * jQuery-like collections are considered empty if they have a `length` of `0`.
12941      * Similarly, maps and sets are considered empty if they have a `size` of `0`.
12942      *
12943      * @static
12944      * @memberOf _
12945      * @since 0.1.0
12946      * @category Lang
12947      * @param {*} value The value to check.
12948      * @returns {boolean} Returns `true` if `value` is empty, else `false`.
12949      * @example
12950      *
12951      * _.isEmpty(null);
12952      * // => true
12953      *
12954      * _.isEmpty(true);
12955      * // => true
12956      *
12957      * _.isEmpty(1);
12958      * // => true
12959      *
12960      * _.isEmpty([1, 2, 3]);
12961      * // => false
12962      *
12963      * _.isEmpty({ 'a': 1 });
12964      * // => false
12965      */
12966     function isEmpty(value) {
12967       if (value == null) {
12968         return true;
12969       }
12970       if (isArrayLike(value) &&
12971           (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
12972             isBuffer(value) || isTypedArray(value) || isArguments(value))) {
12973         return !value.length;
12974       }
12975       var tag = getTag(value);
12976       if (tag == mapTag || tag == setTag) {
12977         return !value.size;
12978       }
12979       if (isPrototype(value)) {
12980         return !baseKeys(value).length;
12981       }
12982       for (var key in value) {
12983         if (hasOwnProperty.call(value, key)) {
12984           return false;
12985         }
12986       }
12987       return true;
12988     }
12990     /**
12991      * Performs a deep comparison between two values to determine if they are
12992      * equivalent.
12993      *
12994      * **Note:** This method supports comparing arrays, array buffers, booleans,
12995      * date objects, error objects, maps, numbers, `Object` objects, regexes,
12996      * sets, strings, symbols, and typed arrays. `Object` objects are compared
12997      * by their own, not inherited, enumerable properties. Functions and DOM
12998      * nodes are compared by strict equality, i.e. `===`.
12999      *
13000      * @static
13001      * @memberOf _
13002      * @since 0.1.0
13003      * @category Lang
13004      * @param {*} value The value to compare.
13005      * @param {*} other The other value to compare.
13006      * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
13007      * @example
13008      *
13009      * var object = { 'a': 1 };
13010      * var other = { 'a': 1 };
13011      *
13012      * _.isEqual(object, other);
13013      * // => true
13014      *
13015      * object === other;
13016      * // => false
13017      */
13018     function isEqual(value, other) {
13019       return baseIsEqual(value, other);
13020     }
13022     /**
13023      * This method is like `_.isEqual` except that it accepts `customizer` which
13024      * is invoked to compare values. If `customizer` returns `undefined`, comparisons
13025      * are handled by the method instead. The `customizer` is invoked with up to
13026      * six arguments: (objValue, othValue [, index|key, object, other, stack]).
13027      *
13028      * @static
13029      * @memberOf _
13030      * @since 4.0.0
13031      * @category Lang
13032      * @param {*} value The value to compare.
13033      * @param {*} other The other value to compare.
13034      * @param {Function} [customizer] The function to customize comparisons.
13035      * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
13036      * @example
13037      *
13038      * function isGreeting(value) {
13039      *   return /^h(?:i|ello)$/.test(value);
13040      * }
13041      *
13042      * function customizer(objValue, othValue) {
13043      *   if (isGreeting(objValue) && isGreeting(othValue)) {
13044      *     return true;
13045      *   }
13046      * }
13047      *
13048      * var array = ['hello', 'goodbye'];
13049      * var other = ['hi', 'goodbye'];
13050      *
13051      * _.isEqualWith(array, other, customizer);
13052      * // => true
13053      */
13054     function isEqualWith(value, other, customizer) {
13055       customizer = typeof customizer == 'function' ? customizer : undefined;
13056       var result = customizer ? customizer(value, other) : undefined;
13057       return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
13058     }
13060     /**
13061      * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
13062      * `SyntaxError`, `TypeError`, or `URIError` object.
13063      *
13064      * @static
13065      * @memberOf _
13066      * @since 3.0.0
13067      * @category Lang
13068      * @param {*} value The value to check.
13069      * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
13070      * @example
13071      *
13072      * _.isError(new Error);
13073      * // => true
13074      *
13075      * _.isError(Error);
13076      * // => false
13077      */
13078     function isError(value) {
13079       if (!isObjectLike(value)) {
13080         return false;
13081       }
13082       var tag = baseGetTag(value);
13083       return tag == errorTag || tag == domExcTag ||
13084         (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
13085     }
13087     /**
13088      * Checks if `value` is a finite primitive number.
13089      *
13090      * **Note:** This method is based on
13091      * [`Number.isFinite`](https://mdn.io/Number/isFinite).
13092      *
13093      * @static
13094      * @memberOf _
13095      * @since 0.1.0
13096      * @category Lang
13097      * @param {*} value The value to check.
13098      * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
13099      * @example
13100      *
13101      * _.isFinite(3);
13102      * // => true
13103      *
13104      * _.isFinite(Number.MIN_VALUE);
13105      * // => true
13106      *
13107      * _.isFinite(Infinity);
13108      * // => false
13109      *
13110      * _.isFinite('3');
13111      * // => false
13112      */
13113     function isFinite(value) {
13114       return typeof value == 'number' && nativeIsFinite(value);
13115     }
13117     /**
13118      * Checks if `value` is classified as a `Function` object.
13119      *
13120      * @static
13121      * @memberOf _
13122      * @since 0.1.0
13123      * @category Lang
13124      * @param {*} value The value to check.
13125      * @returns {boolean} Returns `true` if `value` is a function, else `false`.
13126      * @example
13127      *
13128      * _.isFunction(_);
13129      * // => true
13130      *
13131      * _.isFunction(/abc/);
13132      * // => false
13133      */
13134     function isFunction(value) {
13135       if (!isObject(value)) {
13136         return false;
13137       }
13138       // The use of `Object#toString` avoids issues with the `typeof` operator
13139       // in Safari 9 which returns 'object' for typed arrays and other constructors.
13140       var tag = baseGetTag(value);
13141       return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
13142     }
13144     /**
13145      * Checks if `value` is an integer.
13146      *
13147      * **Note:** This method is based on
13148      * [`Number.isInteger`](https://mdn.io/Number/isInteger).
13149      *
13150      * @static
13151      * @memberOf _
13152      * @since 4.0.0
13153      * @category Lang
13154      * @param {*} value The value to check.
13155      * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
13156      * @example
13157      *
13158      * _.isInteger(3);
13159      * // => true
13160      *
13161      * _.isInteger(Number.MIN_VALUE);
13162      * // => false
13163      *
13164      * _.isInteger(Infinity);
13165      * // => false
13166      *
13167      * _.isInteger('3');
13168      * // => false
13169      */
13170     function isInteger(value) {
13171       return typeof value == 'number' && value == toInteger(value);
13172     }
13174     /**
13175      * Checks if `value` is a valid array-like length.
13176      *
13177      * **Note:** This method is loosely based on
13178      * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
13179      *
13180      * @static
13181      * @memberOf _
13182      * @since 4.0.0
13183      * @category Lang
13184      * @param {*} value The value to check.
13185      * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
13186      * @example
13187      *
13188      * _.isLength(3);
13189      * // => true
13190      *
13191      * _.isLength(Number.MIN_VALUE);
13192      * // => false
13193      *
13194      * _.isLength(Infinity);
13195      * // => false
13196      *
13197      * _.isLength('3');
13198      * // => false
13199      */
13200     function isLength(value) {
13201       return typeof value == 'number' &&
13202         value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
13203     }
13205     /**
13206      * Checks if `value` is the
13207      * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
13208      * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
13209      *
13210      * @static
13211      * @memberOf _
13212      * @since 0.1.0
13213      * @category Lang
13214      * @param {*} value The value to check.
13215      * @returns {boolean} Returns `true` if `value` is an object, else `false`.
13216      * @example
13217      *
13218      * _.isObject({});
13219      * // => true
13220      *
13221      * _.isObject([1, 2, 3]);
13222      * // => true
13223      *
13224      * _.isObject(_.noop);
13225      * // => true
13226      *
13227      * _.isObject(null);
13228      * // => false
13229      */
13230     function isObject(value) {
13231       var type = typeof value;
13232       return value != null && (type == 'object' || type == 'function');
13233     }
13235     /**
13236      * Checks if `value` is object-like. A value is object-like if it's not `null`
13237      * and has a `typeof` result of "object".
13238      *
13239      * @static
13240      * @memberOf _
13241      * @since 4.0.0
13242      * @category Lang
13243      * @param {*} value The value to check.
13244      * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
13245      * @example
13246      *
13247      * _.isObjectLike({});
13248      * // => true
13249      *
13250      * _.isObjectLike([1, 2, 3]);
13251      * // => true
13252      *
13253      * _.isObjectLike(_.noop);
13254      * // => false
13255      *
13256      * _.isObjectLike(null);
13257      * // => false
13258      */
13259     function isObjectLike(value) {
13260       return value != null && typeof value == 'object';
13261     }
13263     /**
13264      * Checks if `value` is classified as a `Map` object.
13265      *
13266      * @static
13267      * @memberOf _
13268      * @since 4.3.0
13269      * @category Lang
13270      * @param {*} value The value to check.
13271      * @returns {boolean} Returns `true` if `value` is a map, else `false`.
13272      * @example
13273      *
13274      * _.isMap(new Map);
13275      * // => true
13276      *
13277      * _.isMap(new WeakMap);
13278      * // => false
13279      */
13280     var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
13282     /**
13283      * Performs a partial deep comparison between `object` and `source` to
13284      * determine if `object` contains equivalent property values.
13285      *
13286      * **Note:** This method is equivalent to `_.matches` when `source` is
13287      * partially applied.
13288      *
13289      * Partial comparisons will match empty array and empty object `source`
13290      * values against any array or object value, respectively. See `_.isEqual`
13291      * for a list of supported value comparisons.
13292      *
13293      * @static
13294      * @memberOf _
13295      * @since 3.0.0
13296      * @category Lang
13297      * @param {Object} object The object to inspect.
13298      * @param {Object} source The object of property values to match.
13299      * @returns {boolean} Returns `true` if `object` is a match, else `false`.
13300      * @example
13301      *
13302      * var object = { 'a': 1, 'b': 2 };
13303      *
13304      * _.isMatch(object, { 'b': 2 });
13305      * // => true
13306      *
13307      * _.isMatch(object, { 'b': 1 });
13308      * // => false
13309      */
13310     function isMatch(object, source) {
13311       return object === source || baseIsMatch(object, source, getMatchData(source));
13312     }
13314     /**
13315      * This method is like `_.isMatch` except that it accepts `customizer` which
13316      * is invoked to compare values. If `customizer` returns `undefined`, comparisons
13317      * are handled by the method instead. The `customizer` is invoked with five
13318      * arguments: (objValue, srcValue, index|key, object, source).
13319      *
13320      * @static
13321      * @memberOf _
13322      * @since 4.0.0
13323      * @category Lang
13324      * @param {Object} object The object to inspect.
13325      * @param {Object} source The object of property values to match.
13326      * @param {Function} [customizer] The function to customize comparisons.
13327      * @returns {boolean} Returns `true` if `object` is a match, else `false`.
13328      * @example
13329      *
13330      * function isGreeting(value) {
13331      *   return /^h(?:i|ello)$/.test(value);
13332      * }
13333      *
13334      * function customizer(objValue, srcValue) {
13335      *   if (isGreeting(objValue) && isGreeting(srcValue)) {
13336      *     return true;
13337      *   }
13338      * }
13339      *
13340      * var object = { 'greeting': 'hello' };
13341      * var source = { 'greeting': 'hi' };
13342      *
13343      * _.isMatchWith(object, source, customizer);
13344      * // => true
13345      */
13346     function isMatchWith(object, source, customizer) {
13347       customizer = typeof customizer == 'function' ? customizer : undefined;
13348       return baseIsMatch(object, source, getMatchData(source), customizer);
13349     }
13351     /**
13352      * Checks if `value` is `NaN`.
13353      *
13354      * **Note:** This method is based on
13355      * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
13356      * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
13357      * `undefined` and other non-number values.
13358      *
13359      * @static
13360      * @memberOf _
13361      * @since 0.1.0
13362      * @category Lang
13363      * @param {*} value The value to check.
13364      * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
13365      * @example
13366      *
13367      * _.isNaN(NaN);
13368      * // => true
13369      *
13370      * _.isNaN(new Number(NaN));
13371      * // => true
13372      *
13373      * isNaN(undefined);
13374      * // => true
13375      *
13376      * _.isNaN(undefined);
13377      * // => false
13378      */
13379     function isNaN(value) {
13380       // An `NaN` primitive is the only value that is not equal to itself.
13381       // Perform the `toStringTag` check first to avoid errors with some
13382       // ActiveX objects in IE.
13383       return isNumber(value) && value != +value;
13384     }
13386     /**
13387      * Checks if `value` is a pristine native function.
13388      *
13389      * **Note:** This method can't reliably detect native functions in the presence
13390      * of the core-js package because core-js circumvents this kind of detection.
13391      * Despite multiple requests, the core-js maintainer has made it clear: any
13392      * attempt to fix the detection will be obstructed. As a result, we're left
13393      * with little choice but to throw an error. Unfortunately, this also affects
13394      * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
13395      * which rely on core-js.
13396      *
13397      * @static
13398      * @memberOf _
13399      * @since 3.0.0
13400      * @category Lang
13401      * @param {*} value The value to check.
13402      * @returns {boolean} Returns `true` if `value` is a native function,
13403      *  else `false`.
13404      * @example
13405      *
13406      * _.isNative(Array.prototype.push);
13407      * // => true
13408      *
13409      * _.isNative(_);
13410      * // => false
13411      */
13412     function isNative(value) {
13413       if (isMaskable(value)) {
13414         throw new Error(CORE_ERROR_TEXT);
13415       }
13416       return baseIsNative(value);
13417     }
13419     /**
13420      * Checks if `value` is `null`.
13421      *
13422      * @static
13423      * @memberOf _
13424      * @since 0.1.0
13425      * @category Lang
13426      * @param {*} value The value to check.
13427      * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
13428      * @example
13429      *
13430      * _.isNull(null);
13431      * // => true
13432      *
13433      * _.isNull(void 0);
13434      * // => false
13435      */
13436     function isNull(value) {
13437       return value === null;
13438     }
13440     /**
13441      * Checks if `value` is `null` or `undefined`.
13442      *
13443      * @static
13444      * @memberOf _
13445      * @since 4.0.0
13446      * @category Lang
13447      * @param {*} value The value to check.
13448      * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
13449      * @example
13450      *
13451      * _.isNil(null);
13452      * // => true
13453      *
13454      * _.isNil(void 0);
13455      * // => true
13456      *
13457      * _.isNil(NaN);
13458      * // => false
13459      */
13460     function isNil(value) {
13461       return value == null;
13462     }
13464     /**
13465      * Checks if `value` is classified as a `Number` primitive or object.
13466      *
13467      * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
13468      * classified as numbers, use the `_.isFinite` method.
13469      *
13470      * @static
13471      * @memberOf _
13472      * @since 0.1.0
13473      * @category Lang
13474      * @param {*} value The value to check.
13475      * @returns {boolean} Returns `true` if `value` is a number, else `false`.
13476      * @example
13477      *
13478      * _.isNumber(3);
13479      * // => true
13480      *
13481      * _.isNumber(Number.MIN_VALUE);
13482      * // => true
13483      *
13484      * _.isNumber(Infinity);
13485      * // => true
13486      *
13487      * _.isNumber('3');
13488      * // => false
13489      */
13490     function isNumber(value) {
13491       return typeof value == 'number' ||
13492         (isObjectLike(value) && baseGetTag(value) == numberTag);
13493     }
13495     /**
13496      * Checks if `value` is a plain object, that is, an object created by the
13497      * `Object` constructor or one with a `[[Prototype]]` of `null`.
13498      *
13499      * @static
13500      * @memberOf _
13501      * @since 0.8.0
13502      * @category Lang
13503      * @param {*} value The value to check.
13504      * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
13505      * @example
13506      *
13507      * function Foo() {
13508      *   this.a = 1;
13509      * }
13510      *
13511      * _.isPlainObject(new Foo);
13512      * // => false
13513      *
13514      * _.isPlainObject([1, 2, 3]);
13515      * // => false
13516      *
13517      * _.isPlainObject({ 'x': 0, 'y': 0 });
13518      * // => true
13519      *
13520      * _.isPlainObject(Object.create(null));
13521      * // => true
13522      */
13523     function isPlainObject(value) {
13524       if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
13525         return false;
13526       }
13527       var proto = getPrototype(value);
13528       if (proto === null) {
13529         return true;
13530       }
13531       var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
13532       return typeof Ctor == 'function' && Ctor instanceof Ctor &&
13533         funcToString.call(Ctor) == objectCtorString;
13534     }
13536     /**
13537      * Checks if `value` is classified as a `RegExp` object.
13538      *
13539      * @static
13540      * @memberOf _
13541      * @since 0.1.0
13542      * @category Lang
13543      * @param {*} value The value to check.
13544      * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
13545      * @example
13546      *
13547      * _.isRegExp(/abc/);
13548      * // => true
13549      *
13550      * _.isRegExp('/abc/');
13551      * // => false
13552      */
13553     var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
13555     /**
13556      * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
13557      * double precision number which isn't the result of a rounded unsafe integer.
13558      *
13559      * **Note:** This method is based on
13560      * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
13561      *
13562      * @static
13563      * @memberOf _
13564      * @since 4.0.0
13565      * @category Lang
13566      * @param {*} value The value to check.
13567      * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
13568      * @example
13569      *
13570      * _.isSafeInteger(3);
13571      * // => true
13572      *
13573      * _.isSafeInteger(Number.MIN_VALUE);
13574      * // => false
13575      *
13576      * _.isSafeInteger(Infinity);
13577      * // => false
13578      *
13579      * _.isSafeInteger('3');
13580      * // => false
13581      */
13582     function isSafeInteger(value) {
13583       return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
13584     }
13586     /**
13587      * Checks if `value` is classified as a `Set` object.
13588      *
13589      * @static
13590      * @memberOf _
13591      * @since 4.3.0
13592      * @category Lang
13593      * @param {*} value The value to check.
13594      * @returns {boolean} Returns `true` if `value` is a set, else `false`.
13595      * @example
13596      *
13597      * _.isSet(new Set);
13598      * // => true
13599      *
13600      * _.isSet(new WeakSet);
13601      * // => false
13602      */
13603     var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
13605     /**
13606      * Checks if `value` is classified as a `String` primitive or object.
13607      *
13608      * @static
13609      * @since 0.1.0
13610      * @memberOf _
13611      * @category Lang
13612      * @param {*} value The value to check.
13613      * @returns {boolean} Returns `true` if `value` is a string, else `false`.
13614      * @example
13615      *
13616      * _.isString('abc');
13617      * // => true
13618      *
13619      * _.isString(1);
13620      * // => false
13621      */
13622     function isString(value) {
13623       return typeof value == 'string' ||
13624         (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
13625     }
13627     /**
13628      * Checks if `value` is classified as a `Symbol` primitive or object.
13629      *
13630      * @static
13631      * @memberOf _
13632      * @since 4.0.0
13633      * @category Lang
13634      * @param {*} value The value to check.
13635      * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
13636      * @example
13637      *
13638      * _.isSymbol(Symbol.iterator);
13639      * // => true
13640      *
13641      * _.isSymbol('abc');
13642      * // => false
13643      */
13644     function isSymbol(value) {
13645       return typeof value == 'symbol' ||
13646         (isObjectLike(value) && baseGetTag(value) == symbolTag);
13647     }
13649     /**
13650      * Checks if `value` is classified as a typed array.
13651      *
13652      * @static
13653      * @memberOf _
13654      * @since 3.0.0
13655      * @category Lang
13656      * @param {*} value The value to check.
13657      * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
13658      * @example
13659      *
13660      * _.isTypedArray(new Uint8Array);
13661      * // => true
13662      *
13663      * _.isTypedArray([]);
13664      * // => false
13665      */
13666     var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
13668     /**
13669      * Checks if `value` is `undefined`.
13670      *
13671      * @static
13672      * @since 0.1.0
13673      * @memberOf _
13674      * @category Lang
13675      * @param {*} value The value to check.
13676      * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
13677      * @example
13678      *
13679      * _.isUndefined(void 0);
13680      * // => true
13681      *
13682      * _.isUndefined(null);
13683      * // => false
13684      */
13685     function isUndefined(value) {
13686       return value === undefined;
13687     }
13689     /**
13690      * Checks if `value` is classified as a `WeakMap` object.
13691      *
13692      * @static
13693      * @memberOf _
13694      * @since 4.3.0
13695      * @category Lang
13696      * @param {*} value The value to check.
13697      * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
13698      * @example
13699      *
13700      * _.isWeakMap(new WeakMap);
13701      * // => true
13702      *
13703      * _.isWeakMap(new Map);
13704      * // => false
13705      */
13706     function isWeakMap(value) {
13707       return isObjectLike(value) && getTag(value) == weakMapTag;
13708     }
13710     /**
13711      * Checks if `value` is classified as a `WeakSet` object.
13712      *
13713      * @static
13714      * @memberOf _
13715      * @since 4.3.0
13716      * @category Lang
13717      * @param {*} value The value to check.
13718      * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
13719      * @example
13720      *
13721      * _.isWeakSet(new WeakSet);
13722      * // => true
13723      *
13724      * _.isWeakSet(new Set);
13725      * // => false
13726      */
13727     function isWeakSet(value) {
13728       return isObjectLike(value) && baseGetTag(value) == weakSetTag;
13729     }
13731     /**
13732      * Checks if `value` is less than `other`.
13733      *
13734      * @static
13735      * @memberOf _
13736      * @since 3.9.0
13737      * @category Lang
13738      * @param {*} value The value to compare.
13739      * @param {*} other The other value to compare.
13740      * @returns {boolean} Returns `true` if `value` is less than `other`,
13741      *  else `false`.
13742      * @see _.gt
13743      * @example
13744      *
13745      * _.lt(1, 3);
13746      * // => true
13747      *
13748      * _.lt(3, 3);
13749      * // => false
13750      *
13751      * _.lt(3, 1);
13752      * // => false
13753      */
13754     var lt = createRelationalOperation(baseLt);
13756     /**
13757      * Checks if `value` is less than or equal to `other`.
13758      *
13759      * @static
13760      * @memberOf _
13761      * @since 3.9.0
13762      * @category Lang
13763      * @param {*} value The value to compare.
13764      * @param {*} other The other value to compare.
13765      * @returns {boolean} Returns `true` if `value` is less than or equal to
13766      *  `other`, else `false`.
13767      * @see _.gte
13768      * @example
13769      *
13770      * _.lte(1, 3);
13771      * // => true
13772      *
13773      * _.lte(3, 3);
13774      * // => true
13775      *
13776      * _.lte(3, 1);
13777      * // => false
13778      */
13779     var lte = createRelationalOperation(function(value, other) {
13780       return value <= other;
13781     });
13783     /**
13784      * Converts `value` to an array.
13785      *
13786      * @static
13787      * @since 0.1.0
13788      * @memberOf _
13789      * @category Lang
13790      * @param {*} value The value to convert.
13791      * @returns {Array} Returns the converted array.
13792      * @example
13793      *
13794      * _.toArray({ 'a': 1, 'b': 2 });
13795      * // => [1, 2]
13796      *
13797      * _.toArray('abc');
13798      * // => ['a', 'b', 'c']
13799      *
13800      * _.toArray(1);
13801      * // => []
13802      *
13803      * _.toArray(null);
13804      * // => []
13805      */
13806     function toArray(value) {
13807       if (!value) {
13808         return [];
13809       }
13810       if (isArrayLike(value)) {
13811         return isString(value) ? stringToArray(value) : copyArray(value);
13812       }
13813       if (symIterator && value[symIterator]) {
13814         return iteratorToArray(value[symIterator]());
13815       }
13816       var tag = getTag(value),
13817           func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);
13819       return func(value);
13820     }
13822     /**
13823      * Converts `value` to a finite number.
13824      *
13825      * @static
13826      * @memberOf _
13827      * @since 4.12.0
13828      * @category Lang
13829      * @param {*} value The value to convert.
13830      * @returns {number} Returns the converted number.
13831      * @example
13832      *
13833      * _.toFinite(3.2);
13834      * // => 3.2
13835      *
13836      * _.toFinite(Number.MIN_VALUE);
13837      * // => 5e-324
13838      *
13839      * _.toFinite(Infinity);
13840      * // => 1.7976931348623157e+308
13841      *
13842      * _.toFinite('3.2');
13843      * // => 3.2
13844      */
13845     function toFinite(value) {
13846       if (!value) {
13847         return value === 0 ? value : 0;
13848       }
13849       value = toNumber(value);
13850       if (value === INFINITY || value === -INFINITY) {
13851         var sign = (value < 0 ? -1 : 1);
13852         return sign * MAX_INTEGER;
13853       }
13854       return value === value ? value : 0;
13855     }
13857     /**
13858      * Converts `value` to an integer.
13859      *
13860      * **Note:** This method is loosely based on
13861      * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
13862      *
13863      * @static
13864      * @memberOf _
13865      * @since 4.0.0
13866      * @category Lang
13867      * @param {*} value The value to convert.
13868      * @returns {number} Returns the converted integer.
13869      * @example
13870      *
13871      * _.toInteger(3.2);
13872      * // => 3
13873      *
13874      * _.toInteger(Number.MIN_VALUE);
13875      * // => 0
13876      *
13877      * _.toInteger(Infinity);
13878      * // => 1.7976931348623157e+308
13879      *
13880      * _.toInteger('3.2');
13881      * // => 3
13882      */
13883     function toInteger(value) {
13884       var result = toFinite(value),
13885           remainder = result % 1;
13887       return result === result ? (remainder ? result - remainder : result) : 0;
13888     }
13890     /**
13891      * Converts `value` to an integer suitable for use as the length of an
13892      * array-like object.
13893      *
13894      * **Note:** This method is based on
13895      * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
13896      *
13897      * @static
13898      * @memberOf _
13899      * @since 4.0.0
13900      * @category Lang
13901      * @param {*} value The value to convert.
13902      * @returns {number} Returns the converted integer.
13903      * @example
13904      *
13905      * _.toLength(3.2);
13906      * // => 3
13907      *
13908      * _.toLength(Number.MIN_VALUE);
13909      * // => 0
13910      *
13911      * _.toLength(Infinity);
13912      * // => 4294967295
13913      *
13914      * _.toLength('3.2');
13915      * // => 3
13916      */
13917     function toLength(value) {
13918       return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
13919     }
13921     /**
13922      * Converts `value` to a number.
13923      *
13924      * @static
13925      * @memberOf _
13926      * @since 4.0.0
13927      * @category Lang
13928      * @param {*} value The value to process.
13929      * @returns {number} Returns the number.
13930      * @example
13931      *
13932      * _.toNumber(3.2);
13933      * // => 3.2
13934      *
13935      * _.toNumber(Number.MIN_VALUE);
13936      * // => 5e-324
13937      *
13938      * _.toNumber(Infinity);
13939      * // => Infinity
13940      *
13941      * _.toNumber('3.2');
13942      * // => 3.2
13943      */
13944     function toNumber(value) {
13945       if (typeof value == 'number') {
13946         return value;
13947       }
13948       if (isSymbol(value)) {
13949         return NAN;
13950       }
13951       if (isObject(value)) {
13952         var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
13953         value = isObject(other) ? (other + '') : other;
13954       }
13955       if (typeof value != 'string') {
13956         return value === 0 ? value : +value;
13957       }
13958       value = value.replace(reTrim, '');
13959       var isBinary = reIsBinary.test(value);
13960       return (isBinary || reIsOctal.test(value))
13961         ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
13962         : (reIsBadHex.test(value) ? NAN : +value);
13963     }
13965     /**
13966      * Converts `value` to a plain object flattening inherited enumerable string
13967      * keyed properties of `value` to own properties of the plain object.
13968      *
13969      * @static
13970      * @memberOf _
13971      * @since 3.0.0
13972      * @category Lang
13973      * @param {*} value The value to convert.
13974      * @returns {Object} Returns the converted plain object.
13975      * @example
13976      *
13977      * function Foo() {
13978      *   this.b = 2;
13979      * }
13980      *
13981      * Foo.prototype.c = 3;
13982      *
13983      * _.assign({ 'a': 1 }, new Foo);
13984      * // => { 'a': 1, 'b': 2 }
13985      *
13986      * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
13987      * // => { 'a': 1, 'b': 2, 'c': 3 }
13988      */
13989     function toPlainObject(value) {
13990       return copyObject(value, keysIn(value));
13991     }
13993     /**
13994      * Converts `value` to a safe integer. A safe integer can be compared and
13995      * represented correctly.
13996      *
13997      * @static
13998      * @memberOf _
13999      * @since 4.0.0
14000      * @category Lang
14001      * @param {*} value The value to convert.
14002      * @returns {number} Returns the converted integer.
14003      * @example
14004      *
14005      * _.toSafeInteger(3.2);
14006      * // => 3
14007      *
14008      * _.toSafeInteger(Number.MIN_VALUE);
14009      * // => 0
14010      *
14011      * _.toSafeInteger(Infinity);
14012      * // => 9007199254740991
14013      *
14014      * _.toSafeInteger('3.2');
14015      * // => 3
14016      */
14017     function toSafeInteger(value) {
14018       return value
14019         ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
14020         : (value === 0 ? value : 0);
14021     }
14023     /**
14024      * Converts `value` to a string. An empty string is returned for `null`
14025      * and `undefined` values. The sign of `-0` is preserved.
14026      *
14027      * @static
14028      * @memberOf _
14029      * @since 4.0.0
14030      * @category Lang
14031      * @param {*} value The value to convert.
14032      * @returns {string} Returns the converted string.
14033      * @example
14034      *
14035      * _.toString(null);
14036      * // => ''
14037      *
14038      * _.toString(-0);
14039      * // => '-0'
14040      *
14041      * _.toString([1, 2, 3]);
14042      * // => '1,2,3'
14043      */
14044     function toString(value) {
14045       return value == null ? '' : baseToString(value);
14046     }
14048     /*------------------------------------------------------------------------*/
14050     /**
14051      * Assigns own enumerable string keyed properties of source objects to the
14052      * destination object. Source objects are applied from left to right.
14053      * Subsequent sources overwrite property assignments of previous sources.
14054      *
14055      * **Note:** This method mutates `object` and is loosely based on
14056      * [`Object.assign`](https://mdn.io/Object/assign).
14057      *
14058      * @static
14059      * @memberOf _
14060      * @since 0.10.0
14061      * @category Object
14062      * @param {Object} object The destination object.
14063      * @param {...Object} [sources] The source objects.
14064      * @returns {Object} Returns `object`.
14065      * @see _.assignIn
14066      * @example
14067      *
14068      * function Foo() {
14069      *   this.a = 1;
14070      * }
14071      *
14072      * function Bar() {
14073      *   this.c = 3;
14074      * }
14075      *
14076      * Foo.prototype.b = 2;
14077      * Bar.prototype.d = 4;
14078      *
14079      * _.assign({ 'a': 0 }, new Foo, new Bar);
14080      * // => { 'a': 1, 'c': 3 }
14081      */
14082     var assign = createAssigner(function(object, source) {
14083       if (isPrototype(source) || isArrayLike(source)) {
14084         copyObject(source, keys(source), object);
14085         return;
14086       }
14087       for (var key in source) {
14088         if (hasOwnProperty.call(source, key)) {
14089           assignValue(object, key, source[key]);
14090         }
14091       }
14092     });
14094     /**
14095      * This method is like `_.assign` except that it iterates over own and
14096      * inherited source properties.
14097      *
14098      * **Note:** This method mutates `object`.
14099      *
14100      * @static
14101      * @memberOf _
14102      * @since 4.0.0
14103      * @alias extend
14104      * @category Object
14105      * @param {Object} object The destination object.
14106      * @param {...Object} [sources] The source objects.
14107      * @returns {Object} Returns `object`.
14108      * @see _.assign
14109      * @example
14110      *
14111      * function Foo() {
14112      *   this.a = 1;
14113      * }
14114      *
14115      * function Bar() {
14116      *   this.c = 3;
14117      * }
14118      *
14119      * Foo.prototype.b = 2;
14120      * Bar.prototype.d = 4;
14121      *
14122      * _.assignIn({ 'a': 0 }, new Foo, new Bar);
14123      * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
14124      */
14125     var assignIn = createAssigner(function(object, source) {
14126       copyObject(source, keysIn(source), object);
14127     });
14129     /**
14130      * This method is like `_.assignIn` except that it accepts `customizer`
14131      * which is invoked to produce the assigned values. If `customizer` returns
14132      * `undefined`, assignment is handled by the method instead. The `customizer`
14133      * is invoked with five arguments: (objValue, srcValue, key, object, source).
14134      *
14135      * **Note:** This method mutates `object`.
14136      *
14137      * @static
14138      * @memberOf _
14139      * @since 4.0.0
14140      * @alias extendWith
14141      * @category Object
14142      * @param {Object} object The destination object.
14143      * @param {...Object} sources The source objects.
14144      * @param {Function} [customizer] The function to customize assigned values.
14145      * @returns {Object} Returns `object`.
14146      * @see _.assignWith
14147      * @example
14148      *
14149      * function customizer(objValue, srcValue) {
14150      *   return _.isUndefined(objValue) ? srcValue : objValue;
14151      * }
14152      *
14153      * var defaults = _.partialRight(_.assignInWith, customizer);
14154      *
14155      * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
14156      * // => { 'a': 1, 'b': 2 }
14157      */
14158     var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
14159       copyObject(source, keysIn(source), object, customizer);
14160     });
14162     /**
14163      * This method is like `_.assign` except that it accepts `customizer`
14164      * which is invoked to produce the assigned values. If `customizer` returns
14165      * `undefined`, assignment is handled by the method instead. The `customizer`
14166      * is invoked with five arguments: (objValue, srcValue, key, object, source).
14167      *
14168      * **Note:** This method mutates `object`.
14169      *
14170      * @static
14171      * @memberOf _
14172      * @since 4.0.0
14173      * @category Object
14174      * @param {Object} object The destination object.
14175      * @param {...Object} sources The source objects.
14176      * @param {Function} [customizer] The function to customize assigned values.
14177      * @returns {Object} Returns `object`.
14178      * @see _.assignInWith
14179      * @example
14180      *
14181      * function customizer(objValue, srcValue) {
14182      *   return _.isUndefined(objValue) ? srcValue : objValue;
14183      * }
14184      *
14185      * var defaults = _.partialRight(_.assignWith, customizer);
14186      *
14187      * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
14188      * // => { 'a': 1, 'b': 2 }
14189      */
14190     var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
14191       copyObject(source, keys(source), object, customizer);
14192     });
14194     /**
14195      * Creates an array of values corresponding to `paths` of `object`.
14196      *
14197      * @static
14198      * @memberOf _
14199      * @since 1.0.0
14200      * @category Object
14201      * @param {Object} object The object to iterate over.
14202      * @param {...(string|string[])} [paths] The property paths to pick.
14203      * @returns {Array} Returns the picked values.
14204      * @example
14205      *
14206      * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
14207      *
14208      * _.at(object, ['a[0].b.c', 'a[1]']);
14209      * // => [3, 4]
14210      */
14211     var at = flatRest(baseAt);
14213     /**
14214      * Creates an object that inherits from the `prototype` object. If a
14215      * `properties` object is given, its own enumerable string keyed properties
14216      * are assigned to the created object.
14217      *
14218      * @static
14219      * @memberOf _
14220      * @since 2.3.0
14221      * @category Object
14222      * @param {Object} prototype The object to inherit from.
14223      * @param {Object} [properties] The properties to assign to the object.
14224      * @returns {Object} Returns the new object.
14225      * @example
14226      *
14227      * function Shape() {
14228      *   this.x = 0;
14229      *   this.y = 0;
14230      * }
14231      *
14232      * function Circle() {
14233      *   Shape.call(this);
14234      * }
14235      *
14236      * Circle.prototype = _.create(Shape.prototype, {
14237      *   'constructor': Circle
14238      * });
14239      *
14240      * var circle = new Circle;
14241      * circle instanceof Circle;
14242      * // => true
14243      *
14244      * circle instanceof Shape;
14245      * // => true
14246      */
14247     function create(prototype, properties) {
14248       var result = baseCreate(prototype);
14249       return properties == null ? result : baseAssign(result, properties);
14250     }
14252     /**
14253      * Assigns own and inherited enumerable string keyed properties of source
14254      * objects to the destination object for all destination properties that
14255      * resolve to `undefined`. Source objects are applied from left to right.
14256      * Once a property is set, additional values of the same property are ignored.
14257      *
14258      * **Note:** This method mutates `object`.
14259      *
14260      * @static
14261      * @since 0.1.0
14262      * @memberOf _
14263      * @category Object
14264      * @param {Object} object The destination object.
14265      * @param {...Object} [sources] The source objects.
14266      * @returns {Object} Returns `object`.
14267      * @see _.defaultsDeep
14268      * @example
14269      *
14270      * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
14271      * // => { 'a': 1, 'b': 2 }
14272      */
14273     var defaults = baseRest(function(object, sources) {
14274       object = Object(object);
14276       var index = -1;
14277       var length = sources.length;
14278       var guard = length > 2 ? sources[2] : undefined;
14280       if (guard && isIterateeCall(sources[0], sources[1], guard)) {
14281         length = 1;
14282       }
14284       while (++index < length) {
14285         var source = sources[index];
14286         var props = keysIn(source);
14287         var propsIndex = -1;
14288         var propsLength = props.length;
14290         while (++propsIndex < propsLength) {
14291           var key = props[propsIndex];
14292           var value = object[key];
14294           if (value === undefined ||
14295               (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
14296             object[key] = source[key];
14297           }
14298         }
14299       }
14301       return object;
14302     });
14304     /**
14305      * This method is like `_.defaults` except that it recursively assigns
14306      * default properties.
14307      *
14308      * **Note:** This method mutates `object`.
14309      *
14310      * @static
14311      * @memberOf _
14312      * @since 3.10.0
14313      * @category Object
14314      * @param {Object} object The destination object.
14315      * @param {...Object} [sources] The source objects.
14316      * @returns {Object} Returns `object`.
14317      * @see _.defaults
14318      * @example
14319      *
14320      * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
14321      * // => { 'a': { 'b': 2, 'c': 3 } }
14322      */
14323     var defaultsDeep = baseRest(function(args) {
14324       args.push(undefined, customDefaultsMerge);
14325       return apply(mergeWith, undefined, args);
14326     });
14328     /**
14329      * This method is like `_.find` except that it returns the key of the first
14330      * element `predicate` returns truthy for instead of the element itself.
14331      *
14332      * @static
14333      * @memberOf _
14334      * @since 1.1.0
14335      * @category Object
14336      * @param {Object} object The object to inspect.
14337      * @param {Function} [predicate=_.identity] The function invoked per iteration.
14338      * @returns {string|undefined} Returns the key of the matched element,
14339      *  else `undefined`.
14340      * @example
14341      *
14342      * var users = {
14343      *   'barney':  { 'age': 36, 'active': true },
14344      *   'fred':    { 'age': 40, 'active': false },
14345      *   'pebbles': { 'age': 1,  'active': true }
14346      * };
14347      *
14348      * _.findKey(users, function(o) { return o.age < 40; });
14349      * // => 'barney' (iteration order is not guaranteed)
14350      *
14351      * // The `_.matches` iteratee shorthand.
14352      * _.findKey(users, { 'age': 1, 'active': true });
14353      * // => 'pebbles'
14354      *
14355      * // The `_.matchesProperty` iteratee shorthand.
14356      * _.findKey(users, ['active', false]);
14357      * // => 'fred'
14358      *
14359      * // The `_.property` iteratee shorthand.
14360      * _.findKey(users, 'active');
14361      * // => 'barney'
14362      */
14363     function findKey(object, predicate) {
14364       return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
14365     }
14367     /**
14368      * This method is like `_.findKey` except that it iterates over elements of
14369      * a collection in the opposite order.
14370      *
14371      * @static
14372      * @memberOf _
14373      * @since 2.0.0
14374      * @category Object
14375      * @param {Object} object The object to inspect.
14376      * @param {Function} [predicate=_.identity] The function invoked per iteration.
14377      * @returns {string|undefined} Returns the key of the matched element,
14378      *  else `undefined`.
14379      * @example
14380      *
14381      * var users = {
14382      *   'barney':  { 'age': 36, 'active': true },
14383      *   'fred':    { 'age': 40, 'active': false },
14384      *   'pebbles': { 'age': 1,  'active': true }
14385      * };
14386      *
14387      * _.findLastKey(users, function(o) { return o.age < 40; });
14388      * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
14389      *
14390      * // The `_.matches` iteratee shorthand.
14391      * _.findLastKey(users, { 'age': 36, 'active': true });
14392      * // => 'barney'
14393      *
14394      * // The `_.matchesProperty` iteratee shorthand.
14395      * _.findLastKey(users, ['active', false]);
14396      * // => 'fred'
14397      *
14398      * // The `_.property` iteratee shorthand.
14399      * _.findLastKey(users, 'active');
14400      * // => 'pebbles'
14401      */
14402     function findLastKey(object, predicate) {
14403       return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
14404     }
14406     /**
14407      * Iterates over own and inherited enumerable string keyed properties of an
14408      * object and invokes `iteratee` for each property. The iteratee is invoked
14409      * with three arguments: (value, key, object). Iteratee functions may exit
14410      * iteration early by explicitly returning `false`.
14411      *
14412      * @static
14413      * @memberOf _
14414      * @since 0.3.0
14415      * @category Object
14416      * @param {Object} object The object to iterate over.
14417      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
14418      * @returns {Object} Returns `object`.
14419      * @see _.forInRight
14420      * @example
14421      *
14422      * function Foo() {
14423      *   this.a = 1;
14424      *   this.b = 2;
14425      * }
14426      *
14427      * Foo.prototype.c = 3;
14428      *
14429      * _.forIn(new Foo, function(value, key) {
14430      *   console.log(key);
14431      * });
14432      * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
14433      */
14434     function forIn(object, iteratee) {
14435       return object == null
14436         ? object
14437         : baseFor(object, getIteratee(iteratee, 3), keysIn);
14438     }
14440     /**
14441      * This method is like `_.forIn` except that it iterates over properties of
14442      * `object` in the opposite order.
14443      *
14444      * @static
14445      * @memberOf _
14446      * @since 2.0.0
14447      * @category Object
14448      * @param {Object} object The object to iterate over.
14449      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
14450      * @returns {Object} Returns `object`.
14451      * @see _.forIn
14452      * @example
14453      *
14454      * function Foo() {
14455      *   this.a = 1;
14456      *   this.b = 2;
14457      * }
14458      *
14459      * Foo.prototype.c = 3;
14460      *
14461      * _.forInRight(new Foo, function(value, key) {
14462      *   console.log(key);
14463      * });
14464      * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
14465      */
14466     function forInRight(object, iteratee) {
14467       return object == null
14468         ? object
14469         : baseForRight(object, getIteratee(iteratee, 3), keysIn);
14470     }
14472     /**
14473      * Iterates over own enumerable string keyed properties of an object and
14474      * invokes `iteratee` for each property. The iteratee is invoked with three
14475      * arguments: (value, key, object). Iteratee functions may exit iteration
14476      * early by explicitly returning `false`.
14477      *
14478      * @static
14479      * @memberOf _
14480      * @since 0.3.0
14481      * @category Object
14482      * @param {Object} object The object to iterate over.
14483      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
14484      * @returns {Object} Returns `object`.
14485      * @see _.forOwnRight
14486      * @example
14487      *
14488      * function Foo() {
14489      *   this.a = 1;
14490      *   this.b = 2;
14491      * }
14492      *
14493      * Foo.prototype.c = 3;
14494      *
14495      * _.forOwn(new Foo, function(value, key) {
14496      *   console.log(key);
14497      * });
14498      * // => Logs 'a' then 'b' (iteration order is not guaranteed).
14499      */
14500     function forOwn(object, iteratee) {
14501       return object && baseForOwn(object, getIteratee(iteratee, 3));
14502     }
14504     /**
14505      * This method is like `_.forOwn` except that it iterates over properties of
14506      * `object` in the opposite order.
14507      *
14508      * @static
14509      * @memberOf _
14510      * @since 2.0.0
14511      * @category Object
14512      * @param {Object} object The object to iterate over.
14513      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
14514      * @returns {Object} Returns `object`.
14515      * @see _.forOwn
14516      * @example
14517      *
14518      * function Foo() {
14519      *   this.a = 1;
14520      *   this.b = 2;
14521      * }
14522      *
14523      * Foo.prototype.c = 3;
14524      *
14525      * _.forOwnRight(new Foo, function(value, key) {
14526      *   console.log(key);
14527      * });
14528      * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
14529      */
14530     function forOwnRight(object, iteratee) {
14531       return object && baseForOwnRight(object, getIteratee(iteratee, 3));
14532     }
14534     /**
14535      * Creates an array of function property names from own enumerable properties
14536      * of `object`.
14537      *
14538      * @static
14539      * @since 0.1.0
14540      * @memberOf _
14541      * @category Object
14542      * @param {Object} object The object to inspect.
14543      * @returns {Array} Returns the function names.
14544      * @see _.functionsIn
14545      * @example
14546      *
14547      * function Foo() {
14548      *   this.a = _.constant('a');
14549      *   this.b = _.constant('b');
14550      * }
14551      *
14552      * Foo.prototype.c = _.constant('c');
14553      *
14554      * _.functions(new Foo);
14555      * // => ['a', 'b']
14556      */
14557     function functions(object) {
14558       return object == null ? [] : baseFunctions(object, keys(object));
14559     }
14561     /**
14562      * Creates an array of function property names from own and inherited
14563      * enumerable properties of `object`.
14564      *
14565      * @static
14566      * @memberOf _
14567      * @since 4.0.0
14568      * @category Object
14569      * @param {Object} object The object to inspect.
14570      * @returns {Array} Returns the function names.
14571      * @see _.functions
14572      * @example
14573      *
14574      * function Foo() {
14575      *   this.a = _.constant('a');
14576      *   this.b = _.constant('b');
14577      * }
14578      *
14579      * Foo.prototype.c = _.constant('c');
14580      *
14581      * _.functionsIn(new Foo);
14582      * // => ['a', 'b', 'c']
14583      */
14584     function functionsIn(object) {
14585       return object == null ? [] : baseFunctions(object, keysIn(object));
14586     }
14588     /**
14589      * Gets the value at `path` of `object`. If the resolved value is
14590      * `undefined`, the `defaultValue` is returned in its place.
14591      *
14592      * @static
14593      * @memberOf _
14594      * @since 3.7.0
14595      * @category Object
14596      * @param {Object} object The object to query.
14597      * @param {Array|string} path The path of the property to get.
14598      * @param {*} [defaultValue] The value returned for `undefined` resolved values.
14599      * @returns {*} Returns the resolved value.
14600      * @example
14601      *
14602      * var object = { 'a': [{ 'b': { 'c': 3 } }] };
14603      *
14604      * _.get(object, 'a[0].b.c');
14605      * // => 3
14606      *
14607      * _.get(object, ['a', '0', 'b', 'c']);
14608      * // => 3
14609      *
14610      * _.get(object, 'a.b.c', 'default');
14611      * // => 'default'
14612      */
14613     function get(object, path, defaultValue) {
14614       var result = object == null ? undefined : baseGet(object, path);
14615       return result === undefined ? defaultValue : result;
14616     }
14618     /**
14619      * Checks if `path` is a direct property of `object`.
14620      *
14621      * @static
14622      * @since 0.1.0
14623      * @memberOf _
14624      * @category Object
14625      * @param {Object} object The object to query.
14626      * @param {Array|string} path The path to check.
14627      * @returns {boolean} Returns `true` if `path` exists, else `false`.
14628      * @example
14629      *
14630      * var object = { 'a': { 'b': 2 } };
14631      * var other = _.create({ 'a': _.create({ 'b': 2 }) });
14632      *
14633      * _.has(object, 'a');
14634      * // => true
14635      *
14636      * _.has(object, 'a.b');
14637      * // => true
14638      *
14639      * _.has(object, ['a', 'b']);
14640      * // => true
14641      *
14642      * _.has(other, 'a');
14643      * // => false
14644      */
14645     function has(object, path) {
14646       return object != null && hasPath(object, path, baseHas);
14647     }
14649     /**
14650      * Checks if `path` is a direct or inherited property of `object`.
14651      *
14652      * @static
14653      * @memberOf _
14654      * @since 4.0.0
14655      * @category Object
14656      * @param {Object} object The object to query.
14657      * @param {Array|string} path The path to check.
14658      * @returns {boolean} Returns `true` if `path` exists, else `false`.
14659      * @example
14660      *
14661      * var object = _.create({ 'a': _.create({ 'b': 2 }) });
14662      *
14663      * _.hasIn(object, 'a');
14664      * // => true
14665      *
14666      * _.hasIn(object, 'a.b');
14667      * // => true
14668      *
14669      * _.hasIn(object, ['a', 'b']);
14670      * // => true
14671      *
14672      * _.hasIn(object, 'b');
14673      * // => false
14674      */
14675     function hasIn(object, path) {
14676       return object != null && hasPath(object, path, baseHasIn);
14677     }
14679     /**
14680      * Creates an object composed of the inverted keys and values of `object`.
14681      * If `object` contains duplicate values, subsequent values overwrite
14682      * property assignments of previous values.
14683      *
14684      * @static
14685      * @memberOf _
14686      * @since 0.7.0
14687      * @category Object
14688      * @param {Object} object The object to invert.
14689      * @returns {Object} Returns the new inverted object.
14690      * @example
14691      *
14692      * var object = { 'a': 1, 'b': 2, 'c': 1 };
14693      *
14694      * _.invert(object);
14695      * // => { '1': 'c', '2': 'b' }
14696      */
14697     var invert = createInverter(function(result, value, key) {
14698       if (value != null &&
14699           typeof value.toString != 'function') {
14700         value = nativeObjectToString.call(value);
14701       }
14703       result[value] = key;
14704     }, constant(identity));
14706     /**
14707      * This method is like `_.invert` except that the inverted object is generated
14708      * from the results of running each element of `object` thru `iteratee`. The
14709      * corresponding inverted value of each inverted key is an array of keys
14710      * responsible for generating the inverted value. The iteratee is invoked
14711      * with one argument: (value).
14712      *
14713      * @static
14714      * @memberOf _
14715      * @since 4.1.0
14716      * @category Object
14717      * @param {Object} object The object to invert.
14718      * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
14719      * @returns {Object} Returns the new inverted object.
14720      * @example
14721      *
14722      * var object = { 'a': 1, 'b': 2, 'c': 1 };
14723      *
14724      * _.invertBy(object);
14725      * // => { '1': ['a', 'c'], '2': ['b'] }
14726      *
14727      * _.invertBy(object, function(value) {
14728      *   return 'group' + value;
14729      * });
14730      * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
14731      */
14732     var invertBy = createInverter(function(result, value, key) {
14733       if (value != null &&
14734           typeof value.toString != 'function') {
14735         value = nativeObjectToString.call(value);
14736       }
14738       if (hasOwnProperty.call(result, value)) {
14739         result[value].push(key);
14740       } else {
14741         result[value] = [key];
14742       }
14743     }, getIteratee);
14745     /**
14746      * Invokes the method at `path` of `object`.
14747      *
14748      * @static
14749      * @memberOf _
14750      * @since 4.0.0
14751      * @category Object
14752      * @param {Object} object The object to query.
14753      * @param {Array|string} path The path of the method to invoke.
14754      * @param {...*} [args] The arguments to invoke the method with.
14755      * @returns {*} Returns the result of the invoked method.
14756      * @example
14757      *
14758      * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
14759      *
14760      * _.invoke(object, 'a[0].b.c.slice', 1, 3);
14761      * // => [2, 3]
14762      */
14763     var invoke = baseRest(baseInvoke);
14765     /**
14766      * Creates an array of the own enumerable property names of `object`.
14767      *
14768      * **Note:** Non-object values are coerced to objects. See the
14769      * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
14770      * for more details.
14771      *
14772      * @static
14773      * @since 0.1.0
14774      * @memberOf _
14775      * @category Object
14776      * @param {Object} object The object to query.
14777      * @returns {Array} Returns the array of property names.
14778      * @example
14779      *
14780      * function Foo() {
14781      *   this.a = 1;
14782      *   this.b = 2;
14783      * }
14784      *
14785      * Foo.prototype.c = 3;
14786      *
14787      * _.keys(new Foo);
14788      * // => ['a', 'b'] (iteration order is not guaranteed)
14789      *
14790      * _.keys('hi');
14791      * // => ['0', '1']
14792      */
14793     function keys(object) {
14794       return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
14795     }
14797     /**
14798      * Creates an array of the own and inherited enumerable property names of `object`.
14799      *
14800      * **Note:** Non-object values are coerced to objects.
14801      *
14802      * @static
14803      * @memberOf _
14804      * @since 3.0.0
14805      * @category Object
14806      * @param {Object} object The object to query.
14807      * @returns {Array} Returns the array of property names.
14808      * @example
14809      *
14810      * function Foo() {
14811      *   this.a = 1;
14812      *   this.b = 2;
14813      * }
14814      *
14815      * Foo.prototype.c = 3;
14816      *
14817      * _.keysIn(new Foo);
14818      * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
14819      */
14820     function keysIn(object) {
14821       return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
14822     }
14824     /**
14825      * The opposite of `_.mapValues`; this method creates an object with the
14826      * same values as `object` and keys generated by running each own enumerable
14827      * string keyed property of `object` thru `iteratee`. The iteratee is invoked
14828      * with three arguments: (value, key, object).
14829      *
14830      * @static
14831      * @memberOf _
14832      * @since 3.8.0
14833      * @category Object
14834      * @param {Object} object The object to iterate over.
14835      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
14836      * @returns {Object} Returns the new mapped object.
14837      * @see _.mapValues
14838      * @example
14839      *
14840      * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
14841      *   return key + value;
14842      * });
14843      * // => { 'a1': 1, 'b2': 2 }
14844      */
14845     function mapKeys(object, iteratee) {
14846       var result = {};
14847       iteratee = getIteratee(iteratee, 3);
14849       baseForOwn(object, function(value, key, object) {
14850         baseAssignValue(result, iteratee(value, key, object), value);
14851       });
14852       return result;
14853     }
14855     /**
14856      * Creates an object with the same keys as `object` and values generated
14857      * by running each own enumerable string keyed property of `object` thru
14858      * `iteratee`. The iteratee is invoked with three arguments:
14859      * (value, key, object).
14860      *
14861      * @static
14862      * @memberOf _
14863      * @since 2.4.0
14864      * @category Object
14865      * @param {Object} object The object to iterate over.
14866      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
14867      * @returns {Object} Returns the new mapped object.
14868      * @see _.mapKeys
14869      * @example
14870      *
14871      * var users = {
14872      *   'fred':    { 'user': 'fred',    'age': 40 },
14873      *   'pebbles': { 'user': 'pebbles', 'age': 1 }
14874      * };
14875      *
14876      * _.mapValues(users, function(o) { return o.age; });
14877      * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
14878      *
14879      * // The `_.property` iteratee shorthand.
14880      * _.mapValues(users, 'age');
14881      * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
14882      */
14883     function mapValues(object, iteratee) {
14884       var result = {};
14885       iteratee = getIteratee(iteratee, 3);
14887       baseForOwn(object, function(value, key, object) {
14888         baseAssignValue(result, key, iteratee(value, key, object));
14889       });
14890       return result;
14891     }
14893     /**
14894      * This method is like `_.assign` except that it recursively merges own and
14895      * inherited enumerable string keyed properties of source objects into the
14896      * destination object. Source properties that resolve to `undefined` are
14897      * skipped if a destination value exists. Array and plain object properties
14898      * are merged recursively. Other objects and value types are overridden by
14899      * assignment. Source objects are applied from left to right. Subsequent
14900      * sources overwrite property assignments of previous sources.
14901      *
14902      * **Note:** This method mutates `object`.
14903      *
14904      * @static
14905      * @memberOf _
14906      * @since 0.5.0
14907      * @category Object
14908      * @param {Object} object The destination object.
14909      * @param {...Object} [sources] The source objects.
14910      * @returns {Object} Returns `object`.
14911      * @example
14912      *
14913      * var object = {
14914      *   'a': [{ 'b': 2 }, { 'd': 4 }]
14915      * };
14916      *
14917      * var other = {
14918      *   'a': [{ 'c': 3 }, { 'e': 5 }]
14919      * };
14920      *
14921      * _.merge(object, other);
14922      * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
14923      */
14924     var merge = createAssigner(function(object, source, srcIndex) {
14925       baseMerge(object, source, srcIndex);
14926     });
14928     /**
14929      * This method is like `_.merge` except that it accepts `customizer` which
14930      * is invoked to produce the merged values of the destination and source
14931      * properties. If `customizer` returns `undefined`, merging is handled by the
14932      * method instead. The `customizer` is invoked with six arguments:
14933      * (objValue, srcValue, key, object, source, stack).
14934      *
14935      * **Note:** This method mutates `object`.
14936      *
14937      * @static
14938      * @memberOf _
14939      * @since 4.0.0
14940      * @category Object
14941      * @param {Object} object The destination object.
14942      * @param {...Object} sources The source objects.
14943      * @param {Function} customizer The function to customize assigned values.
14944      * @returns {Object} Returns `object`.
14945      * @example
14946      *
14947      * function customizer(objValue, srcValue) {
14948      *   if (_.isArray(objValue)) {
14949      *     return objValue.concat(srcValue);
14950      *   }
14951      * }
14952      *
14953      * var object = { 'a': [1], 'b': [2] };
14954      * var other = { 'a': [3], 'b': [4] };
14955      *
14956      * _.mergeWith(object, other, customizer);
14957      * // => { 'a': [1, 3], 'b': [2, 4] }
14958      */
14959     var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
14960       baseMerge(object, source, srcIndex, customizer);
14961     });
14963     /**
14964      * The opposite of `_.pick`; this method creates an object composed of the
14965      * own and inherited enumerable property paths of `object` that are not omitted.
14966      *
14967      * **Note:** This method is considerably slower than `_.pick`.
14968      *
14969      * @static
14970      * @since 0.1.0
14971      * @memberOf _
14972      * @category Object
14973      * @param {Object} object The source object.
14974      * @param {...(string|string[])} [paths] The property paths to omit.
14975      * @returns {Object} Returns the new object.
14976      * @example
14977      *
14978      * var object = { 'a': 1, 'b': '2', 'c': 3 };
14979      *
14980      * _.omit(object, ['a', 'c']);
14981      * // => { 'b': '2' }
14982      */
14983     var omit = flatRest(function(object, paths) {
14984       var result = {};
14985       if (object == null) {
14986         return result;
14987       }
14988       var isDeep = false;
14989       paths = arrayMap(paths, function(path) {
14990         path = castPath(path, object);
14991         isDeep || (isDeep = path.length > 1);
14992         return path;
14993       });
14994       copyObject(object, getAllKeysIn(object), result);
14995       if (isDeep) {
14996         result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
14997       }
14998       var length = paths.length;
14999       while (length--) {
15000         baseUnset(result, paths[length]);
15001       }
15002       return result;
15003     });
15005     /**
15006      * The opposite of `_.pickBy`; this method creates an object composed of
15007      * the own and inherited enumerable string keyed properties of `object` that
15008      * `predicate` doesn't return truthy for. The predicate is invoked with two
15009      * arguments: (value, key).
15010      *
15011      * @static
15012      * @memberOf _
15013      * @since 4.0.0
15014      * @category Object
15015      * @param {Object} object The source object.
15016      * @param {Function} [predicate=_.identity] The function invoked per property.
15017      * @returns {Object} Returns the new object.
15018      * @example
15019      *
15020      * var object = { 'a': 1, 'b': '2', 'c': 3 };
15021      *
15022      * _.omitBy(object, _.isNumber);
15023      * // => { 'b': '2' }
15024      */
15025     function omitBy(object, predicate) {
15026       return pickBy(object, negate(getIteratee(predicate)));
15027     }
15029     /**
15030      * Creates an object composed of the picked `object` properties.
15031      *
15032      * @static
15033      * @since 0.1.0
15034      * @memberOf _
15035      * @category Object
15036      * @param {Object} object The source object.
15037      * @param {...(string|string[])} [paths] The property paths to pick.
15038      * @returns {Object} Returns the new object.
15039      * @example
15040      *
15041      * var object = { 'a': 1, 'b': '2', 'c': 3 };
15042      *
15043      * _.pick(object, ['a', 'c']);
15044      * // => { 'a': 1, 'c': 3 }
15045      */
15046     var pick = flatRest(function(object, paths) {
15047       return object == null ? {} : basePick(object, paths);
15048     });
15050     /**
15051      * Creates an object composed of the `object` properties `predicate` returns
15052      * truthy for. The predicate is invoked with two arguments: (value, key).
15053      *
15054      * @static
15055      * @memberOf _
15056      * @since 4.0.0
15057      * @category Object
15058      * @param {Object} object The source object.
15059      * @param {Function} [predicate=_.identity] The function invoked per property.
15060      * @returns {Object} Returns the new object.
15061      * @example
15062      *
15063      * var object = { 'a': 1, 'b': '2', 'c': 3 };
15064      *
15065      * _.pickBy(object, _.isNumber);
15066      * // => { 'a': 1, 'c': 3 }
15067      */
15068     function pickBy(object, predicate) {
15069       if (object == null) {
15070         return {};
15071       }
15072       var props = arrayMap(getAllKeysIn(object), function(prop) {
15073         return [prop];
15074       });
15075       predicate = getIteratee(predicate);
15076       return basePickBy(object, props, function(value, path) {
15077         return predicate(value, path[0]);
15078       });
15079     }
15081     /**
15082      * This method is like `_.get` except that if the resolved value is a
15083      * function it's invoked with the `this` binding of its parent object and
15084      * its result is returned.
15085      *
15086      * @static
15087      * @since 0.1.0
15088      * @memberOf _
15089      * @category Object
15090      * @param {Object} object The object to query.
15091      * @param {Array|string} path The path of the property to resolve.
15092      * @param {*} [defaultValue] The value returned for `undefined` resolved values.
15093      * @returns {*} Returns the resolved value.
15094      * @example
15095      *
15096      * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
15097      *
15098      * _.result(object, 'a[0].b.c1');
15099      * // => 3
15100      *
15101      * _.result(object, 'a[0].b.c2');
15102      * // => 4
15103      *
15104      * _.result(object, 'a[0].b.c3', 'default');
15105      * // => 'default'
15106      *
15107      * _.result(object, 'a[0].b.c3', _.constant('default'));
15108      * // => 'default'
15109      */
15110     function result(object, path, defaultValue) {
15111       path = castPath(path, object);
15113       var index = -1,
15114           length = path.length;
15116       // Ensure the loop is entered when path is empty.
15117       if (!length) {
15118         length = 1;
15119         object = undefined;
15120       }
15121       while (++index < length) {
15122         var value = object == null ? undefined : object[toKey(path[index])];
15123         if (value === undefined) {
15124           index = length;
15125           value = defaultValue;
15126         }
15127         object = isFunction(value) ? value.call(object) : value;
15128       }
15129       return object;
15130     }
15132     /**
15133      * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
15134      * it's created. Arrays are created for missing index properties while objects
15135      * are created for all other missing properties. Use `_.setWith` to customize
15136      * `path` creation.
15137      *
15138      * **Note:** This method mutates `object`.
15139      *
15140      * @static
15141      * @memberOf _
15142      * @since 3.7.0
15143      * @category Object
15144      * @param {Object} object The object to modify.
15145      * @param {Array|string} path The path of the property to set.
15146      * @param {*} value The value to set.
15147      * @returns {Object} Returns `object`.
15148      * @example
15149      *
15150      * var object = { 'a': [{ 'b': { 'c': 3 } }] };
15151      *
15152      * _.set(object, 'a[0].b.c', 4);
15153      * console.log(object.a[0].b.c);
15154      * // => 4
15155      *
15156      * _.set(object, ['x', '0', 'y', 'z'], 5);
15157      * console.log(object.x[0].y.z);
15158      * // => 5
15159      */
15160     function set(object, path, value) {
15161       return object == null ? object : baseSet(object, path, value);
15162     }
15164     /**
15165      * This method is like `_.set` except that it accepts `customizer` which is
15166      * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
15167      * path creation is handled by the method instead. The `customizer` is invoked
15168      * with three arguments: (nsValue, key, nsObject).
15169      *
15170      * **Note:** This method mutates `object`.
15171      *
15172      * @static
15173      * @memberOf _
15174      * @since 4.0.0
15175      * @category Object
15176      * @param {Object} object The object to modify.
15177      * @param {Array|string} path The path of the property to set.
15178      * @param {*} value The value to set.
15179      * @param {Function} [customizer] The function to customize assigned values.
15180      * @returns {Object} Returns `object`.
15181      * @example
15182      *
15183      * var object = {};
15184      *
15185      * _.setWith(object, '[0][1]', 'a', Object);
15186      * // => { '0': { '1': 'a' } }
15187      */
15188     function setWith(object, path, value, customizer) {
15189       customizer = typeof customizer == 'function' ? customizer : undefined;
15190       return object == null ? object : baseSet(object, path, value, customizer);
15191     }
15193     /**
15194      * Creates an array of own enumerable string keyed-value pairs for `object`
15195      * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
15196      * entries are returned.
15197      *
15198      * @static
15199      * @memberOf _
15200      * @since 4.0.0
15201      * @alias entries
15202      * @category Object
15203      * @param {Object} object The object to query.
15204      * @returns {Array} Returns the key-value pairs.
15205      * @example
15206      *
15207      * function Foo() {
15208      *   this.a = 1;
15209      *   this.b = 2;
15210      * }
15211      *
15212      * Foo.prototype.c = 3;
15213      *
15214      * _.toPairs(new Foo);
15215      * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
15216      */
15217     var toPairs = createToPairs(keys);
15219     /**
15220      * Creates an array of own and inherited enumerable string keyed-value pairs
15221      * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
15222      * or set, its entries are returned.
15223      *
15224      * @static
15225      * @memberOf _
15226      * @since 4.0.0
15227      * @alias entriesIn
15228      * @category Object
15229      * @param {Object} object The object to query.
15230      * @returns {Array} Returns the key-value pairs.
15231      * @example
15232      *
15233      * function Foo() {
15234      *   this.a = 1;
15235      *   this.b = 2;
15236      * }
15237      *
15238      * Foo.prototype.c = 3;
15239      *
15240      * _.toPairsIn(new Foo);
15241      * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
15242      */
15243     var toPairsIn = createToPairs(keysIn);
15245     /**
15246      * An alternative to `_.reduce`; this method transforms `object` to a new
15247      * `accumulator` object which is the result of running each of its own
15248      * enumerable string keyed properties thru `iteratee`, with each invocation
15249      * potentially mutating the `accumulator` object. If `accumulator` is not
15250      * provided, a new object with the same `[[Prototype]]` will be used. The
15251      * iteratee is invoked with four arguments: (accumulator, value, key, object).
15252      * Iteratee functions may exit iteration early by explicitly returning `false`.
15253      *
15254      * @static
15255      * @memberOf _
15256      * @since 1.3.0
15257      * @category Object
15258      * @param {Object} object The object to iterate over.
15259      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
15260      * @param {*} [accumulator] The custom accumulator value.
15261      * @returns {*} Returns the accumulated value.
15262      * @example
15263      *
15264      * _.transform([2, 3, 4], function(result, n) {
15265      *   result.push(n *= n);
15266      *   return n % 2 == 0;
15267      * }, []);
15268      * // => [4, 9]
15269      *
15270      * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
15271      *   (result[value] || (result[value] = [])).push(key);
15272      * }, {});
15273      * // => { '1': ['a', 'c'], '2': ['b'] }
15274      */
15275     function transform(object, iteratee, accumulator) {
15276       var isArr = isArray(object),
15277           isArrLike = isArr || isBuffer(object) || isTypedArray(object);
15279       iteratee = getIteratee(iteratee, 4);
15280       if (accumulator == null) {
15281         var Ctor = object && object.constructor;
15282         if (isArrLike) {
15283           accumulator = isArr ? new Ctor : [];
15284         }
15285         else if (isObject(object)) {
15286           accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
15287         }
15288         else {
15289           accumulator = {};
15290         }
15291       }
15292       (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
15293         return iteratee(accumulator, value, index, object);
15294       });
15295       return accumulator;
15296     }
15298     /**
15299      * Removes the property at `path` of `object`.
15300      *
15301      * **Note:** This method mutates `object`.
15302      *
15303      * @static
15304      * @memberOf _
15305      * @since 4.0.0
15306      * @category Object
15307      * @param {Object} object The object to modify.
15308      * @param {Array|string} path The path of the property to unset.
15309      * @returns {boolean} Returns `true` if the property is deleted, else `false`.
15310      * @example
15311      *
15312      * var object = { 'a': [{ 'b': { 'c': 7 } }] };
15313      * _.unset(object, 'a[0].b.c');
15314      * // => true
15315      *
15316      * console.log(object);
15317      * // => { 'a': [{ 'b': {} }] };
15318      *
15319      * _.unset(object, ['a', '0', 'b', 'c']);
15320      * // => true
15321      *
15322      * console.log(object);
15323      * // => { 'a': [{ 'b': {} }] };
15324      */
15325     function unset(object, path) {
15326       return object == null ? true : baseUnset(object, path);
15327     }
15329     /**
15330      * This method is like `_.set` except that accepts `updater` to produce the
15331      * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
15332      * is invoked with one argument: (value).
15333      *
15334      * **Note:** This method mutates `object`.
15335      *
15336      * @static
15337      * @memberOf _
15338      * @since 4.6.0
15339      * @category Object
15340      * @param {Object} object The object to modify.
15341      * @param {Array|string} path The path of the property to set.
15342      * @param {Function} updater The function to produce the updated value.
15343      * @returns {Object} Returns `object`.
15344      * @example
15345      *
15346      * var object = { 'a': [{ 'b': { 'c': 3 } }] };
15347      *
15348      * _.update(object, 'a[0].b.c', function(n) { return n * n; });
15349      * console.log(object.a[0].b.c);
15350      * // => 9
15351      *
15352      * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
15353      * console.log(object.x[0].y.z);
15354      * // => 0
15355      */
15356     function update(object, path, updater) {
15357       return object == null ? object : baseUpdate(object, path, castFunction(updater));
15358     }
15360     /**
15361      * This method is like `_.update` except that it accepts `customizer` which is
15362      * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
15363      * path creation is handled by the method instead. The `customizer` is invoked
15364      * with three arguments: (nsValue, key, nsObject).
15365      *
15366      * **Note:** This method mutates `object`.
15367      *
15368      * @static
15369      * @memberOf _
15370      * @since 4.6.0
15371      * @category Object
15372      * @param {Object} object The object to modify.
15373      * @param {Array|string} path The path of the property to set.
15374      * @param {Function} updater The function to produce the updated value.
15375      * @param {Function} [customizer] The function to customize assigned values.
15376      * @returns {Object} Returns `object`.
15377      * @example
15378      *
15379      * var object = {};
15380      *
15381      * _.updateWith(object, '[0][1]', _.constant('a'), Object);
15382      * // => { '0': { '1': 'a' } }
15383      */
15384     function updateWith(object, path, updater, customizer) {
15385       customizer = typeof customizer == 'function' ? customizer : undefined;
15386       return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
15387     }
15389     /**
15390      * Creates an array of the own enumerable string keyed property values of `object`.
15391      *
15392      * **Note:** Non-object values are coerced to objects.
15393      *
15394      * @static
15395      * @since 0.1.0
15396      * @memberOf _
15397      * @category Object
15398      * @param {Object} object The object to query.
15399      * @returns {Array} Returns the array of property values.
15400      * @example
15401      *
15402      * function Foo() {
15403      *   this.a = 1;
15404      *   this.b = 2;
15405      * }
15406      *
15407      * Foo.prototype.c = 3;
15408      *
15409      * _.values(new Foo);
15410      * // => [1, 2] (iteration order is not guaranteed)
15411      *
15412      * _.values('hi');
15413      * // => ['h', 'i']
15414      */
15415     function values(object) {
15416       return object == null ? [] : baseValues(object, keys(object));
15417     }
15419     /**
15420      * Creates an array of the own and inherited enumerable string keyed property
15421      * values of `object`.
15422      *
15423      * **Note:** Non-object values are coerced to objects.
15424      *
15425      * @static
15426      * @memberOf _
15427      * @since 3.0.0
15428      * @category Object
15429      * @param {Object} object The object to query.
15430      * @returns {Array} Returns the array of property values.
15431      * @example
15432      *
15433      * function Foo() {
15434      *   this.a = 1;
15435      *   this.b = 2;
15436      * }
15437      *
15438      * Foo.prototype.c = 3;
15439      *
15440      * _.valuesIn(new Foo);
15441      * // => [1, 2, 3] (iteration order is not guaranteed)
15442      */
15443     function valuesIn(object) {
15444       return object == null ? [] : baseValues(object, keysIn(object));
15445     }
15447     /*------------------------------------------------------------------------*/
15449     /**
15450      * Clamps `number` within the inclusive `lower` and `upper` bounds.
15451      *
15452      * @static
15453      * @memberOf _
15454      * @since 4.0.0
15455      * @category Number
15456      * @param {number} number The number to clamp.
15457      * @param {number} [lower] The lower bound.
15458      * @param {number} upper The upper bound.
15459      * @returns {number} Returns the clamped number.
15460      * @example
15461      *
15462      * _.clamp(-10, -5, 5);
15463      * // => -5
15464      *
15465      * _.clamp(10, -5, 5);
15466      * // => 5
15467      */
15468     function clamp(number, lower, upper) {
15469       if (upper === undefined) {
15470         upper = lower;
15471         lower = undefined;
15472       }
15473       if (upper !== undefined) {
15474         upper = toNumber(upper);
15475         upper = upper === upper ? upper : 0;
15476       }
15477       if (lower !== undefined) {
15478         lower = toNumber(lower);
15479         lower = lower === lower ? lower : 0;
15480       }
15481       return baseClamp(toNumber(number), lower, upper);
15482     }
15484     /**
15485      * Checks if `n` is between `start` and up to, but not including, `end`. If
15486      * `end` is not specified, it's set to `start` with `start` then set to `0`.
15487      * If `start` is greater than `end` the params are swapped to support
15488      * negative ranges.
15489      *
15490      * @static
15491      * @memberOf _
15492      * @since 3.3.0
15493      * @category Number
15494      * @param {number} number The number to check.
15495      * @param {number} [start=0] The start of the range.
15496      * @param {number} end The end of the range.
15497      * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
15498      * @see _.range, _.rangeRight
15499      * @example
15500      *
15501      * _.inRange(3, 2, 4);
15502      * // => true
15503      *
15504      * _.inRange(4, 8);
15505      * // => true
15506      *
15507      * _.inRange(4, 2);
15508      * // => false
15509      *
15510      * _.inRange(2, 2);
15511      * // => false
15512      *
15513      * _.inRange(1.2, 2);
15514      * // => true
15515      *
15516      * _.inRange(5.2, 4);
15517      * // => false
15518      *
15519      * _.inRange(-3, -2, -6);
15520      * // => true
15521      */
15522     function inRange(number, start, end) {
15523       start = toFinite(start);
15524       if (end === undefined) {
15525         end = start;
15526         start = 0;
15527       } else {
15528         end = toFinite(end);
15529       }
15530       number = toNumber(number);
15531       return baseInRange(number, start, end);
15532     }
15534     /**
15535      * Produces a random number between the inclusive `lower` and `upper` bounds.
15536      * If only one argument is provided a number between `0` and the given number
15537      * is returned. If `floating` is `true`, or either `lower` or `upper` are
15538      * floats, a floating-point number is returned instead of an integer.
15539      *
15540      * **Note:** JavaScript follows the IEEE-754 standard for resolving
15541      * floating-point values which can produce unexpected results.
15542      *
15543      * @static
15544      * @memberOf _
15545      * @since 0.7.0
15546      * @category Number
15547      * @param {number} [lower=0] The lower bound.
15548      * @param {number} [upper=1] The upper bound.
15549      * @param {boolean} [floating] Specify returning a floating-point number.
15550      * @returns {number} Returns the random number.
15551      * @example
15552      *
15553      * _.random(0, 5);
15554      * // => an integer between 0 and 5
15555      *
15556      * _.random(5);
15557      * // => also an integer between 0 and 5
15558      *
15559      * _.random(5, true);
15560      * // => a floating-point number between 0 and 5
15561      *
15562      * _.random(1.2, 5.2);
15563      * // => a floating-point number between 1.2 and 5.2
15564      */
15565     function random(lower, upper, floating) {
15566       if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
15567         upper = floating = undefined;
15568       }
15569       if (floating === undefined) {
15570         if (typeof upper == 'boolean') {
15571           floating = upper;
15572           upper = undefined;
15573         }
15574         else if (typeof lower == 'boolean') {
15575           floating = lower;
15576           lower = undefined;
15577         }
15578       }
15579       if (lower === undefined && upper === undefined) {
15580         lower = 0;
15581         upper = 1;
15582       }
15583       else {
15584         lower = toFinite(lower);
15585         if (upper === undefined) {
15586           upper = lower;
15587           lower = 0;
15588         } else {
15589           upper = toFinite(upper);
15590         }
15591       }
15592       if (lower > upper) {
15593         var temp = lower;
15594         lower = upper;
15595         upper = temp;
15596       }
15597       if (floating || lower % 1 || upper % 1) {
15598         var rand = nativeRandom();
15599         return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
15600       }
15601       return baseRandom(lower, upper);
15602     }
15604     /*------------------------------------------------------------------------*/
15606     /**
15607      * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
15608      *
15609      * @static
15610      * @memberOf _
15611      * @since 3.0.0
15612      * @category String
15613      * @param {string} [string=''] The string to convert.
15614      * @returns {string} Returns the camel cased string.
15615      * @example
15616      *
15617      * _.camelCase('Foo Bar');
15618      * // => 'fooBar'
15619      *
15620      * _.camelCase('--foo-bar--');
15621      * // => 'fooBar'
15622      *
15623      * _.camelCase('__FOO_BAR__');
15624      * // => 'fooBar'
15625      */
15626     var camelCase = createCompounder(function(result, word, index) {
15627       word = word.toLowerCase();
15628       return result + (index ? capitalize(word) : word);
15629     });
15631     /**
15632      * Converts the first character of `string` to upper case and the remaining
15633      * to lower case.
15634      *
15635      * @static
15636      * @memberOf _
15637      * @since 3.0.0
15638      * @category String
15639      * @param {string} [string=''] The string to capitalize.
15640      * @returns {string} Returns the capitalized string.
15641      * @example
15642      *
15643      * _.capitalize('FRED');
15644      * // => 'Fred'
15645      */
15646     function capitalize(string) {
15647       return upperFirst(toString(string).toLowerCase());
15648     }
15650     /**
15651      * Deburrs `string` by converting
15652      * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
15653      * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
15654      * letters to basic Latin letters and removing
15655      * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
15656      *
15657      * @static
15658      * @memberOf _
15659      * @since 3.0.0
15660      * @category String
15661      * @param {string} [string=''] The string to deburr.
15662      * @returns {string} Returns the deburred string.
15663      * @example
15664      *
15665      * _.deburr('déjà vu');
15666      * // => 'deja vu'
15667      */
15668     function deburr(string) {
15669       string = toString(string);
15670       return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
15671     }
15673     /**
15674      * Checks if `string` ends with the given target string.
15675      *
15676      * @static
15677      * @memberOf _
15678      * @since 3.0.0
15679      * @category String
15680      * @param {string} [string=''] The string to inspect.
15681      * @param {string} [target] The string to search for.
15682      * @param {number} [position=string.length] The position to search up to.
15683      * @returns {boolean} Returns `true` if `string` ends with `target`,
15684      *  else `false`.
15685      * @example
15686      *
15687      * _.endsWith('abc', 'c');
15688      * // => true
15689      *
15690      * _.endsWith('abc', 'b');
15691      * // => false
15692      *
15693      * _.endsWith('abc', 'b', 2);
15694      * // => true
15695      */
15696     function endsWith(string, target, position) {
15697       string = toString(string);
15698       target = baseToString(target);
15700       var length = string.length;
15701       position = position === undefined
15702         ? length
15703         : baseClamp(toInteger(position), 0, length);
15705       var end = position;
15706       position -= target.length;
15707       return position >= 0 && string.slice(position, end) == target;
15708     }
15710     /**
15711      * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
15712      * corresponding HTML entities.
15713      *
15714      * **Note:** No other characters are escaped. To escape additional
15715      * characters use a third-party library like [_he_](https://mths.be/he).
15716      *
15717      * Though the ">" character is escaped for symmetry, characters like
15718      * ">" and "/" don't need escaping in HTML and have no special meaning
15719      * unless they're part of a tag or unquoted attribute value. See
15720      * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
15721      * (under "semi-related fun fact") for more details.
15722      *
15723      * When working with HTML you should always
15724      * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
15725      * XSS vectors.
15726      *
15727      * @static
15728      * @since 0.1.0
15729      * @memberOf _
15730      * @category String
15731      * @param {string} [string=''] The string to escape.
15732      * @returns {string} Returns the escaped string.
15733      * @example
15734      *
15735      * _.escape('fred, barney, & pebbles');
15736      * // => 'fred, barney, &amp; pebbles'
15737      */
15738     function escape(string) {
15739       string = toString(string);
15740       return (string && reHasUnescapedHtml.test(string))
15741         ? string.replace(reUnescapedHtml, escapeHtmlChar)
15742         : string;
15743     }
15745     /**
15746      * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
15747      * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
15748      *
15749      * @static
15750      * @memberOf _
15751      * @since 3.0.0
15752      * @category String
15753      * @param {string} [string=''] The string to escape.
15754      * @returns {string} Returns the escaped string.
15755      * @example
15756      *
15757      * _.escapeRegExp('[lodash](https://lodash.com/)');
15758      * // => '\[lodash\]\(https://lodash\.com/\)'
15759      */
15760     function escapeRegExp(string) {
15761       string = toString(string);
15762       return (string && reHasRegExpChar.test(string))
15763         ? string.replace(reRegExpChar, '\\$&')
15764         : string;
15765     }
15767     /**
15768      * Converts `string` to
15769      * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
15770      *
15771      * @static
15772      * @memberOf _
15773      * @since 3.0.0
15774      * @category String
15775      * @param {string} [string=''] The string to convert.
15776      * @returns {string} Returns the kebab cased string.
15777      * @example
15778      *
15779      * _.kebabCase('Foo Bar');
15780      * // => 'foo-bar'
15781      *
15782      * _.kebabCase('fooBar');
15783      * // => 'foo-bar'
15784      *
15785      * _.kebabCase('__FOO_BAR__');
15786      * // => 'foo-bar'
15787      */
15788     var kebabCase = createCompounder(function(result, word, index) {
15789       return result + (index ? '-' : '') + word.toLowerCase();
15790     });
15792     /**
15793      * Converts `string`, as space separated words, to lower case.
15794      *
15795      * @static
15796      * @memberOf _
15797      * @since 4.0.0
15798      * @category String
15799      * @param {string} [string=''] The string to convert.
15800      * @returns {string} Returns the lower cased string.
15801      * @example
15802      *
15803      * _.lowerCase('--Foo-Bar--');
15804      * // => 'foo bar'
15805      *
15806      * _.lowerCase('fooBar');
15807      * // => 'foo bar'
15808      *
15809      * _.lowerCase('__FOO_BAR__');
15810      * // => 'foo bar'
15811      */
15812     var lowerCase = createCompounder(function(result, word, index) {
15813       return result + (index ? ' ' : '') + word.toLowerCase();
15814     });
15816     /**
15817      * Converts the first character of `string` to lower case.
15818      *
15819      * @static
15820      * @memberOf _
15821      * @since 4.0.0
15822      * @category String
15823      * @param {string} [string=''] The string to convert.
15824      * @returns {string} Returns the converted string.
15825      * @example
15826      *
15827      * _.lowerFirst('Fred');
15828      * // => 'fred'
15829      *
15830      * _.lowerFirst('FRED');
15831      * // => 'fRED'
15832      */
15833     var lowerFirst = createCaseFirst('toLowerCase');
15835     /**
15836      * Pads `string` on the left and right sides if it's shorter than `length`.
15837      * Padding characters are truncated if they can't be evenly divided by `length`.
15838      *
15839      * @static
15840      * @memberOf _
15841      * @since 3.0.0
15842      * @category String
15843      * @param {string} [string=''] The string to pad.
15844      * @param {number} [length=0] The padding length.
15845      * @param {string} [chars=' '] The string used as padding.
15846      * @returns {string} Returns the padded string.
15847      * @example
15848      *
15849      * _.pad('abc', 8);
15850      * // => '  abc   '
15851      *
15852      * _.pad('abc', 8, '_-');
15853      * // => '_-abc_-_'
15854      *
15855      * _.pad('abc', 3);
15856      * // => 'abc'
15857      */
15858     function pad(string, length, chars) {
15859       string = toString(string);
15860       length = toInteger(length);
15862       var strLength = length ? stringSize(string) : 0;
15863       if (!length || strLength >= length) {
15864         return string;
15865       }
15866       var mid = (length - strLength) / 2;
15867       return (
15868         createPadding(nativeFloor(mid), chars) +
15869         string +
15870         createPadding(nativeCeil(mid), chars)
15871       );
15872     }
15874     /**
15875      * Pads `string` on the right side if it's shorter than `length`. Padding
15876      * characters are truncated if they exceed `length`.
15877      *
15878      * @static
15879      * @memberOf _
15880      * @since 4.0.0
15881      * @category String
15882      * @param {string} [string=''] The string to pad.
15883      * @param {number} [length=0] The padding length.
15884      * @param {string} [chars=' '] The string used as padding.
15885      * @returns {string} Returns the padded string.
15886      * @example
15887      *
15888      * _.padEnd('abc', 6);
15889      * // => 'abc   '
15890      *
15891      * _.padEnd('abc', 6, '_-');
15892      * // => 'abc_-_'
15893      *
15894      * _.padEnd('abc', 3);
15895      * // => 'abc'
15896      */
15897     function padEnd(string, length, chars) {
15898       string = toString(string);
15899       length = toInteger(length);
15901       var strLength = length ? stringSize(string) : 0;
15902       return (length && strLength < length)
15903         ? (string + createPadding(length - strLength, chars))
15904         : string;
15905     }
15907     /**
15908      * Pads `string` on the left side if it's shorter than `length`. Padding
15909      * characters are truncated if they exceed `length`.
15910      *
15911      * @static
15912      * @memberOf _
15913      * @since 4.0.0
15914      * @category String
15915      * @param {string} [string=''] The string to pad.
15916      * @param {number} [length=0] The padding length.
15917      * @param {string} [chars=' '] The string used as padding.
15918      * @returns {string} Returns the padded string.
15919      * @example
15920      *
15921      * _.padStart('abc', 6);
15922      * // => '   abc'
15923      *
15924      * _.padStart('abc', 6, '_-');
15925      * // => '_-_abc'
15926      *
15927      * _.padStart('abc', 3);
15928      * // => 'abc'
15929      */
15930     function padStart(string, length, chars) {
15931       string = toString(string);
15932       length = toInteger(length);
15934       var strLength = length ? stringSize(string) : 0;
15935       return (length && strLength < length)
15936         ? (createPadding(length - strLength, chars) + string)
15937         : string;
15938     }
15940     /**
15941      * Converts `string` to an integer of the specified radix. If `radix` is
15942      * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
15943      * hexadecimal, in which case a `radix` of `16` is used.
15944      *
15945      * **Note:** This method aligns with the
15946      * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
15947      *
15948      * @static
15949      * @memberOf _
15950      * @since 1.1.0
15951      * @category String
15952      * @param {string} string The string to convert.
15953      * @param {number} [radix=10] The radix to interpret `value` by.
15954      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
15955      * @returns {number} Returns the converted integer.
15956      * @example
15957      *
15958      * _.parseInt('08');
15959      * // => 8
15960      *
15961      * _.map(['6', '08', '10'], _.parseInt);
15962      * // => [6, 8, 10]
15963      */
15964     function parseInt(string, radix, guard) {
15965       if (guard || radix == null) {
15966         radix = 0;
15967       } else if (radix) {
15968         radix = +radix;
15969       }
15970       return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
15971     }
15973     /**
15974      * Repeats the given string `n` times.
15975      *
15976      * @static
15977      * @memberOf _
15978      * @since 3.0.0
15979      * @category String
15980      * @param {string} [string=''] The string to repeat.
15981      * @param {number} [n=1] The number of times to repeat the string.
15982      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
15983      * @returns {string} Returns the repeated string.
15984      * @example
15985      *
15986      * _.repeat('*', 3);
15987      * // => '***'
15988      *
15989      * _.repeat('abc', 2);
15990      * // => 'abcabc'
15991      *
15992      * _.repeat('abc', 0);
15993      * // => ''
15994      */
15995     function repeat(string, n, guard) {
15996       if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
15997         n = 1;
15998       } else {
15999         n = toInteger(n);
16000       }
16001       return baseRepeat(toString(string), n);
16002     }
16004     /**
16005      * Replaces matches for `pattern` in `string` with `replacement`.
16006      *
16007      * **Note:** This method is based on
16008      * [`String#replace`](https://mdn.io/String/replace).
16009      *
16010      * @static
16011      * @memberOf _
16012      * @since 4.0.0
16013      * @category String
16014      * @param {string} [string=''] The string to modify.
16015      * @param {RegExp|string} pattern The pattern to replace.
16016      * @param {Function|string} replacement The match replacement.
16017      * @returns {string} Returns the modified string.
16018      * @example
16019      *
16020      * _.replace('Hi Fred', 'Fred', 'Barney');
16021      * // => 'Hi Barney'
16022      */
16023     function replace() {
16024       var args = arguments,
16025           string = toString(args[0]);
16027       return args.length < 3 ? string : string.replace(args[1], args[2]);
16028     }
16030     /**
16031      * Converts `string` to
16032      * [snake case](https://en.wikipedia.org/wiki/Snake_case).
16033      *
16034      * @static
16035      * @memberOf _
16036      * @since 3.0.0
16037      * @category String
16038      * @param {string} [string=''] The string to convert.
16039      * @returns {string} Returns the snake cased string.
16040      * @example
16041      *
16042      * _.snakeCase('Foo Bar');
16043      * // => 'foo_bar'
16044      *
16045      * _.snakeCase('fooBar');
16046      * // => 'foo_bar'
16047      *
16048      * _.snakeCase('--FOO-BAR--');
16049      * // => 'foo_bar'
16050      */
16051     var snakeCase = createCompounder(function(result, word, index) {
16052       return result + (index ? '_' : '') + word.toLowerCase();
16053     });
16055     /**
16056      * Splits `string` by `separator`.
16057      *
16058      * **Note:** This method is based on
16059      * [`String#split`](https://mdn.io/String/split).
16060      *
16061      * @static
16062      * @memberOf _
16063      * @since 4.0.0
16064      * @category String
16065      * @param {string} [string=''] The string to split.
16066      * @param {RegExp|string} separator The separator pattern to split by.
16067      * @param {number} [limit] The length to truncate results to.
16068      * @returns {Array} Returns the string segments.
16069      * @example
16070      *
16071      * _.split('a-b-c', '-', 2);
16072      * // => ['a', 'b']
16073      */
16074     function split(string, separator, limit) {
16075       if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
16076         separator = limit = undefined;
16077       }
16078       limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
16079       if (!limit) {
16080         return [];
16081       }
16082       string = toString(string);
16083       if (string && (
16084             typeof separator == 'string' ||
16085             (separator != null && !isRegExp(separator))
16086           )) {
16087         separator = baseToString(separator);
16088         if (!separator && hasUnicode(string)) {
16089           return castSlice(stringToArray(string), 0, limit);
16090         }
16091       }
16092       return string.split(separator, limit);
16093     }
16095     /**
16096      * Converts `string` to
16097      * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
16098      *
16099      * @static
16100      * @memberOf _
16101      * @since 3.1.0
16102      * @category String
16103      * @param {string} [string=''] The string to convert.
16104      * @returns {string} Returns the start cased string.
16105      * @example
16106      *
16107      * _.startCase('--foo-bar--');
16108      * // => 'Foo Bar'
16109      *
16110      * _.startCase('fooBar');
16111      * // => 'Foo Bar'
16112      *
16113      * _.startCase('__FOO_BAR__');
16114      * // => 'FOO BAR'
16115      */
16116     var startCase = createCompounder(function(result, word, index) {
16117       return result + (index ? ' ' : '') + upperFirst(word);
16118     });
16120     /**
16121      * Checks if `string` starts with the given target string.
16122      *
16123      * @static
16124      * @memberOf _
16125      * @since 3.0.0
16126      * @category String
16127      * @param {string} [string=''] The string to inspect.
16128      * @param {string} [target] The string to search for.
16129      * @param {number} [position=0] The position to search from.
16130      * @returns {boolean} Returns `true` if `string` starts with `target`,
16131      *  else `false`.
16132      * @example
16133      *
16134      * _.startsWith('abc', 'a');
16135      * // => true
16136      *
16137      * _.startsWith('abc', 'b');
16138      * // => false
16139      *
16140      * _.startsWith('abc', 'b', 1);
16141      * // => true
16142      */
16143     function startsWith(string, target, position) {
16144       string = toString(string);
16145       position = position == null
16146         ? 0
16147         : baseClamp(toInteger(position), 0, string.length);
16149       target = baseToString(target);
16150       return string.slice(position, position + target.length) == target;
16151     }
16153     /**
16154      * Creates a compiled template function that can interpolate data properties
16155      * in "interpolate" delimiters, HTML-escape interpolated data properties in
16156      * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
16157      * properties may be accessed as free variables in the template. If a setting
16158      * object is given, it takes precedence over `_.templateSettings` values.
16159      *
16160      * **Note:** In the development build `_.template` utilizes
16161      * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
16162      * for easier debugging.
16163      *
16164      * For more information on precompiling templates see
16165      * [lodash's custom builds documentation](https://lodash.com/custom-builds).
16166      *
16167      * For more information on Chrome extension sandboxes see
16168      * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
16169      *
16170      * @static
16171      * @since 0.1.0
16172      * @memberOf _
16173      * @category String
16174      * @param {string} [string=''] The template string.
16175      * @param {Object} [options={}] The options object.
16176      * @param {RegExp} [options.escape=_.templateSettings.escape]
16177      *  The HTML "escape" delimiter.
16178      * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
16179      *  The "evaluate" delimiter.
16180      * @param {Object} [options.imports=_.templateSettings.imports]
16181      *  An object to import into the template as free variables.
16182      * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
16183      *  The "interpolate" delimiter.
16184      * @param {string} [options.sourceURL='lodash.templateSources[n]']
16185      *  The sourceURL of the compiled template.
16186      * @param {string} [options.variable='obj']
16187      *  The data object variable name.
16188      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
16189      * @returns {Function} Returns the compiled template function.
16190      * @example
16191      *
16192      * // Use the "interpolate" delimiter to create a compiled template.
16193      * var compiled = _.template('hello <%= user %>!');
16194      * compiled({ 'user': 'fred' });
16195      * // => 'hello fred!'
16196      *
16197      * // Use the HTML "escape" delimiter to escape data property values.
16198      * var compiled = _.template('<b><%- value %></b>');
16199      * compiled({ 'value': '<script>' });
16200      * // => '<b>&lt;script&gt;</b>'
16201      *
16202      * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
16203      * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
16204      * compiled({ 'users': ['fred', 'barney'] });
16205      * // => '<li>fred</li><li>barney</li>'
16206      *
16207      * // Use the internal `print` function in "evaluate" delimiters.
16208      * var compiled = _.template('<% print("hello " + user); %>!');
16209      * compiled({ 'user': 'barney' });
16210      * // => 'hello barney!'
16211      *
16212      * // Use the ES template literal delimiter as an "interpolate" delimiter.
16213      * // Disable support by replacing the "interpolate" delimiter.
16214      * var compiled = _.template('hello ${ user }!');
16215      * compiled({ 'user': 'pebbles' });
16216      * // => 'hello pebbles!'
16217      *
16218      * // Use backslashes to treat delimiters as plain text.
16219      * var compiled = _.template('<%= "\\<%- value %\\>" %>');
16220      * compiled({ 'value': 'ignored' });
16221      * // => '<%- value %>'
16222      *
16223      * // Use the `imports` option to import `jQuery` as `jq`.
16224      * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
16225      * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
16226      * compiled({ 'users': ['fred', 'barney'] });
16227      * // => '<li>fred</li><li>barney</li>'
16228      *
16229      * // Use the `sourceURL` option to specify a custom sourceURL for the template.
16230      * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
16231      * compiled(data);
16232      * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
16233      *
16234      * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
16235      * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
16236      * compiled.source;
16237      * // => function(data) {
16238      * //   var __t, __p = '';
16239      * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
16240      * //   return __p;
16241      * // }
16242      *
16243      * // Use custom template delimiters.
16244      * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
16245      * var compiled = _.template('hello {{ user }}!');
16246      * compiled({ 'user': 'mustache' });
16247      * // => 'hello mustache!'
16248      *
16249      * // Use the `source` property to inline compiled templates for meaningful
16250      * // line numbers in error messages and stack traces.
16251      * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
16252      *   var JST = {\
16253      *     "main": ' + _.template(mainText).source + '\
16254      *   };\
16255      * ');
16256      */
16257     function template(string, options, guard) {
16258       // Based on John Resig's `tmpl` implementation
16259       // (http://ejohn.org/blog/javascript-micro-templating/)
16260       // and Laura Doktorova's doT.js (https://github.com/olado/doT).
16261       var settings = lodash.templateSettings;
16263       if (guard && isIterateeCall(string, options, guard)) {
16264         options = undefined;
16265       }
16266       string = toString(string);
16267       options = assignInWith({}, options, settings, customDefaultsAssignIn);
16269       var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
16270           importsKeys = keys(imports),
16271           importsValues = baseValues(imports, importsKeys);
16273       var isEscaping,
16274           isEvaluating,
16275           index = 0,
16276           interpolate = options.interpolate || reNoMatch,
16277           source = "__p += '";
16279       // Compile the regexp to match each delimiter.
16280       var reDelimiters = RegExp(
16281         (options.escape || reNoMatch).source + '|' +
16282         interpolate.source + '|' +
16283         (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
16284         (options.evaluate || reNoMatch).source + '|$'
16285       , 'g');
16287       // Use a sourceURL for easier debugging.
16288       var sourceURL = '//# sourceURL=' +
16289         ('sourceURL' in options
16290           ? options.sourceURL
16291           : ('lodash.templateSources[' + (++templateCounter) + ']')
16292         ) + '\n';
16294       string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
16295         interpolateValue || (interpolateValue = esTemplateValue);
16297         // Escape characters that can't be included in string literals.
16298         source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
16300         // Replace delimiters with snippets.
16301         if (escapeValue) {
16302           isEscaping = true;
16303           source += "' +\n__e(" + escapeValue + ") +\n'";
16304         }
16305         if (evaluateValue) {
16306           isEvaluating = true;
16307           source += "';\n" + evaluateValue + ";\n__p += '";
16308         }
16309         if (interpolateValue) {
16310           source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
16311         }
16312         index = offset + match.length;
16314         // The JS engine embedded in Adobe products needs `match` returned in
16315         // order to produce the correct `offset` value.
16316         return match;
16317       });
16319       source += "';\n";
16321       // If `variable` is not specified wrap a with-statement around the generated
16322       // code to add the data object to the top of the scope chain.
16323       var variable = options.variable;
16324       if (!variable) {
16325         source = 'with (obj) {\n' + source + '\n}\n';
16326       }
16327       // Cleanup code by stripping empty strings.
16328       source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
16329         .replace(reEmptyStringMiddle, '$1')
16330         .replace(reEmptyStringTrailing, '$1;');
16332       // Frame code as the function body.
16333       source = 'function(' + (variable || 'obj') + ') {\n' +
16334         (variable
16335           ? ''
16336           : 'obj || (obj = {});\n'
16337         ) +
16338         "var __t, __p = ''" +
16339         (isEscaping
16340            ? ', __e = _.escape'
16341            : ''
16342         ) +
16343         (isEvaluating
16344           ? ', __j = Array.prototype.join;\n' +
16345             "function print() { __p += __j.call(arguments, '') }\n"
16346           : ';\n'
16347         ) +
16348         source +
16349         'return __p\n}';
16351       var result = attempt(function() {
16352         return Function(importsKeys, sourceURL + 'return ' + source)
16353           .apply(undefined, importsValues);
16354       });
16356       // Provide the compiled function's source by its `toString` method or
16357       // the `source` property as a convenience for inlining compiled templates.
16358       result.source = source;
16359       if (isError(result)) {
16360         throw result;
16361       }
16362       return result;
16363     }
16365     /**
16366      * Converts `string`, as a whole, to lower case just like
16367      * [String#toLowerCase](https://mdn.io/toLowerCase).
16368      *
16369      * @static
16370      * @memberOf _
16371      * @since 4.0.0
16372      * @category String
16373      * @param {string} [string=''] The string to convert.
16374      * @returns {string} Returns the lower cased string.
16375      * @example
16376      *
16377      * _.toLower('--Foo-Bar--');
16378      * // => '--foo-bar--'
16379      *
16380      * _.toLower('fooBar');
16381      * // => 'foobar'
16382      *
16383      * _.toLower('__FOO_BAR__');
16384      * // => '__foo_bar__'
16385      */
16386     function toLower(value) {
16387       return toString(value).toLowerCase();
16388     }
16390     /**
16391      * Converts `string`, as a whole, to upper case just like
16392      * [String#toUpperCase](https://mdn.io/toUpperCase).
16393      *
16394      * @static
16395      * @memberOf _
16396      * @since 4.0.0
16397      * @category String
16398      * @param {string} [string=''] The string to convert.
16399      * @returns {string} Returns the upper cased string.
16400      * @example
16401      *
16402      * _.toUpper('--foo-bar--');
16403      * // => '--FOO-BAR--'
16404      *
16405      * _.toUpper('fooBar');
16406      * // => 'FOOBAR'
16407      *
16408      * _.toUpper('__foo_bar__');
16409      * // => '__FOO_BAR__'
16410      */
16411     function toUpper(value) {
16412       return toString(value).toUpperCase();
16413     }
16415     /**
16416      * Removes leading and trailing whitespace or specified characters from `string`.
16417      *
16418      * @static
16419      * @memberOf _
16420      * @since 3.0.0
16421      * @category String
16422      * @param {string} [string=''] The string to trim.
16423      * @param {string} [chars=whitespace] The characters to trim.
16424      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
16425      * @returns {string} Returns the trimmed string.
16426      * @example
16427      *
16428      * _.trim('  abc  ');
16429      * // => 'abc'
16430      *
16431      * _.trim('-_-abc-_-', '_-');
16432      * // => 'abc'
16433      *
16434      * _.map(['  foo  ', '  bar  '], _.trim);
16435      * // => ['foo', 'bar']
16436      */
16437     function trim(string, chars, guard) {
16438       string = toString(string);
16439       if (string && (guard || chars === undefined)) {
16440         return string.replace(reTrim, '');
16441       }
16442       if (!string || !(chars = baseToString(chars))) {
16443         return string;
16444       }
16445       var strSymbols = stringToArray(string),
16446           chrSymbols = stringToArray(chars),
16447           start = charsStartIndex(strSymbols, chrSymbols),
16448           end = charsEndIndex(strSymbols, chrSymbols) + 1;
16450       return castSlice(strSymbols, start, end).join('');
16451     }
16453     /**
16454      * Removes trailing whitespace or specified characters from `string`.
16455      *
16456      * @static
16457      * @memberOf _
16458      * @since 4.0.0
16459      * @category String
16460      * @param {string} [string=''] The string to trim.
16461      * @param {string} [chars=whitespace] The characters to trim.
16462      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
16463      * @returns {string} Returns the trimmed string.
16464      * @example
16465      *
16466      * _.trimEnd('  abc  ');
16467      * // => '  abc'
16468      *
16469      * _.trimEnd('-_-abc-_-', '_-');
16470      * // => '-_-abc'
16471      */
16472     function trimEnd(string, chars, guard) {
16473       string = toString(string);
16474       if (string && (guard || chars === undefined)) {
16475         return string.replace(reTrimEnd, '');
16476       }
16477       if (!string || !(chars = baseToString(chars))) {
16478         return string;
16479       }
16480       var strSymbols = stringToArray(string),
16481           end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
16483       return castSlice(strSymbols, 0, end).join('');
16484     }
16486     /**
16487      * Removes leading whitespace or specified characters from `string`.
16488      *
16489      * @static
16490      * @memberOf _
16491      * @since 4.0.0
16492      * @category String
16493      * @param {string} [string=''] The string to trim.
16494      * @param {string} [chars=whitespace] The characters to trim.
16495      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
16496      * @returns {string} Returns the trimmed string.
16497      * @example
16498      *
16499      * _.trimStart('  abc  ');
16500      * // => 'abc  '
16501      *
16502      * _.trimStart('-_-abc-_-', '_-');
16503      * // => 'abc-_-'
16504      */
16505     function trimStart(string, chars, guard) {
16506       string = toString(string);
16507       if (string && (guard || chars === undefined)) {
16508         return string.replace(reTrimStart, '');
16509       }
16510       if (!string || !(chars = baseToString(chars))) {
16511         return string;
16512       }
16513       var strSymbols = stringToArray(string),
16514           start = charsStartIndex(strSymbols, stringToArray(chars));
16516       return castSlice(strSymbols, start).join('');
16517     }
16519     /**
16520      * Truncates `string` if it's longer than the given maximum string length.
16521      * The last characters of the truncated string are replaced with the omission
16522      * string which defaults to "...".
16523      *
16524      * @static
16525      * @memberOf _
16526      * @since 4.0.0
16527      * @category String
16528      * @param {string} [string=''] The string to truncate.
16529      * @param {Object} [options={}] The options object.
16530      * @param {number} [options.length=30] The maximum string length.
16531      * @param {string} [options.omission='...'] The string to indicate text is omitted.
16532      * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
16533      * @returns {string} Returns the truncated string.
16534      * @example
16535      *
16536      * _.truncate('hi-diddly-ho there, neighborino');
16537      * // => 'hi-diddly-ho there, neighbo...'
16538      *
16539      * _.truncate('hi-diddly-ho there, neighborino', {
16540      *   'length': 24,
16541      *   'separator': ' '
16542      * });
16543      * // => 'hi-diddly-ho there,...'
16544      *
16545      * _.truncate('hi-diddly-ho there, neighborino', {
16546      *   'length': 24,
16547      *   'separator': /,? +/
16548      * });
16549      * // => 'hi-diddly-ho there...'
16550      *
16551      * _.truncate('hi-diddly-ho there, neighborino', {
16552      *   'omission': ' [...]'
16553      * });
16554      * // => 'hi-diddly-ho there, neig [...]'
16555      */
16556     function truncate(string, options) {
16557       var length = DEFAULT_TRUNC_LENGTH,
16558           omission = DEFAULT_TRUNC_OMISSION;
16560       if (isObject(options)) {
16561         var separator = 'separator' in options ? options.separator : separator;
16562         length = 'length' in options ? toInteger(options.length) : length;
16563         omission = 'omission' in options ? baseToString(options.omission) : omission;
16564       }
16565       string = toString(string);
16567       var strLength = string.length;
16568       if (hasUnicode(string)) {
16569         var strSymbols = stringToArray(string);
16570         strLength = strSymbols.length;
16571       }
16572       if (length >= strLength) {
16573         return string;
16574       }
16575       var end = length - stringSize(omission);
16576       if (end < 1) {
16577         return omission;
16578       }
16579       var result = strSymbols
16580         ? castSlice(strSymbols, 0, end).join('')
16581         : string.slice(0, end);
16583       if (separator === undefined) {
16584         return result + omission;
16585       }
16586       if (strSymbols) {
16587         end += (result.length - end);
16588       }
16589       if (isRegExp(separator)) {
16590         if (string.slice(end).search(separator)) {
16591           var match,
16592               substring = result;
16594           if (!separator.global) {
16595             separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
16596           }
16597           separator.lastIndex = 0;
16598           while ((match = separator.exec(substring))) {
16599             var newEnd = match.index;
16600           }
16601           result = result.slice(0, newEnd === undefined ? end : newEnd);
16602         }
16603       } else if (string.indexOf(baseToString(separator), end) != end) {
16604         var index = result.lastIndexOf(separator);
16605         if (index > -1) {
16606           result = result.slice(0, index);
16607         }
16608       }
16609       return result + omission;
16610     }
16612     /**
16613      * The inverse of `_.escape`; this method converts the HTML entities
16614      * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
16615      * their corresponding characters.
16616      *
16617      * **Note:** No other HTML entities are unescaped. To unescape additional
16618      * HTML entities use a third-party library like [_he_](https://mths.be/he).
16619      *
16620      * @static
16621      * @memberOf _
16622      * @since 0.6.0
16623      * @category String
16624      * @param {string} [string=''] The string to unescape.
16625      * @returns {string} Returns the unescaped string.
16626      * @example
16627      *
16628      * _.unescape('fred, barney, &amp; pebbles');
16629      * // => 'fred, barney, & pebbles'
16630      */
16631     function unescape(string) {
16632       string = toString(string);
16633       return (string && reHasEscapedHtml.test(string))
16634         ? string.replace(reEscapedHtml, unescapeHtmlChar)
16635         : string;
16636     }
16638     /**
16639      * Converts `string`, as space separated words, to upper case.
16640      *
16641      * @static
16642      * @memberOf _
16643      * @since 4.0.0
16644      * @category String
16645      * @param {string} [string=''] The string to convert.
16646      * @returns {string} Returns the upper cased string.
16647      * @example
16648      *
16649      * _.upperCase('--foo-bar');
16650      * // => 'FOO BAR'
16651      *
16652      * _.upperCase('fooBar');
16653      * // => 'FOO BAR'
16654      *
16655      * _.upperCase('__foo_bar__');
16656      * // => 'FOO BAR'
16657      */
16658     var upperCase = createCompounder(function(result, word, index) {
16659       return result + (index ? ' ' : '') + word.toUpperCase();
16660     });
16662     /**
16663      * Converts the first character of `string` to upper case.
16664      *
16665      * @static
16666      * @memberOf _
16667      * @since 4.0.0
16668      * @category String
16669      * @param {string} [string=''] The string to convert.
16670      * @returns {string} Returns the converted string.
16671      * @example
16672      *
16673      * _.upperFirst('fred');
16674      * // => 'Fred'
16675      *
16676      * _.upperFirst('FRED');
16677      * // => 'FRED'
16678      */
16679     var upperFirst = createCaseFirst('toUpperCase');
16681     /**
16682      * Splits `string` into an array of its words.
16683      *
16684      * @static
16685      * @memberOf _
16686      * @since 3.0.0
16687      * @category String
16688      * @param {string} [string=''] The string to inspect.
16689      * @param {RegExp|string} [pattern] The pattern to match words.
16690      * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
16691      * @returns {Array} Returns the words of `string`.
16692      * @example
16693      *
16694      * _.words('fred, barney, & pebbles');
16695      * // => ['fred', 'barney', 'pebbles']
16696      *
16697      * _.words('fred, barney, & pebbles', /[^, ]+/g);
16698      * // => ['fred', 'barney', '&', 'pebbles']
16699      */
16700     function words(string, pattern, guard) {
16701       string = toString(string);
16702       pattern = guard ? undefined : pattern;
16704       if (pattern === undefined) {
16705         return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
16706       }
16707       return string.match(pattern) || [];
16708     }
16710     /*------------------------------------------------------------------------*/
16712     /**
16713      * Attempts to invoke `func`, returning either the result or the caught error
16714      * object. Any additional arguments are provided to `func` when it's invoked.
16715      *
16716      * @static
16717      * @memberOf _
16718      * @since 3.0.0
16719      * @category Util
16720      * @param {Function} func The function to attempt.
16721      * @param {...*} [args] The arguments to invoke `func` with.
16722      * @returns {*} Returns the `func` result or error object.
16723      * @example
16724      *
16725      * // Avoid throwing errors for invalid selectors.
16726      * var elements = _.attempt(function(selector) {
16727      *   return document.querySelectorAll(selector);
16728      * }, '>_>');
16729      *
16730      * if (_.isError(elements)) {
16731      *   elements = [];
16732      * }
16733      */
16734     var attempt = baseRest(function(func, args) {
16735       try {
16736         return apply(func, undefined, args);
16737       } catch (e) {
16738         return isError(e) ? e : new Error(e);
16739       }
16740     });
16742     /**
16743      * Binds methods of an object to the object itself, overwriting the existing
16744      * method.
16745      *
16746      * **Note:** This method doesn't set the "length" property of bound functions.
16747      *
16748      * @static
16749      * @since 0.1.0
16750      * @memberOf _
16751      * @category Util
16752      * @param {Object} object The object to bind and assign the bound methods to.
16753      * @param {...(string|string[])} methodNames The object method names to bind.
16754      * @returns {Object} Returns `object`.
16755      * @example
16756      *
16757      * var view = {
16758      *   'label': 'docs',
16759      *   'click': function() {
16760      *     console.log('clicked ' + this.label);
16761      *   }
16762      * };
16763      *
16764      * _.bindAll(view, ['click']);
16765      * jQuery(element).on('click', view.click);
16766      * // => Logs 'clicked docs' when clicked.
16767      */
16768     var bindAll = flatRest(function(object, methodNames) {
16769       arrayEach(methodNames, function(key) {
16770         key = toKey(key);
16771         baseAssignValue(object, key, bind(object[key], object));
16772       });
16773       return object;
16774     });
16776     /**
16777      * Creates a function that iterates over `pairs` and invokes the corresponding
16778      * function of the first predicate to return truthy. The predicate-function
16779      * pairs are invoked with the `this` binding and arguments of the created
16780      * function.
16781      *
16782      * @static
16783      * @memberOf _
16784      * @since 4.0.0
16785      * @category Util
16786      * @param {Array} pairs The predicate-function pairs.
16787      * @returns {Function} Returns the new composite function.
16788      * @example
16789      *
16790      * var func = _.cond([
16791      *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
16792      *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
16793      *   [_.stubTrue,                      _.constant('no match')]
16794      * ]);
16795      *
16796      * func({ 'a': 1, 'b': 2 });
16797      * // => 'matches A'
16798      *
16799      * func({ 'a': 0, 'b': 1 });
16800      * // => 'matches B'
16801      *
16802      * func({ 'a': '1', 'b': '2' });
16803      * // => 'no match'
16804      */
16805     function cond(pairs) {
16806       var length = pairs == null ? 0 : pairs.length,
16807           toIteratee = getIteratee();
16809       pairs = !length ? [] : arrayMap(pairs, function(pair) {
16810         if (typeof pair[1] != 'function') {
16811           throw new TypeError(FUNC_ERROR_TEXT);
16812         }
16813         return [toIteratee(pair[0]), pair[1]];
16814       });
16816       return baseRest(function(args) {
16817         var index = -1;
16818         while (++index < length) {
16819           var pair = pairs[index];
16820           if (apply(pair[0], this, args)) {
16821             return apply(pair[1], this, args);
16822           }
16823         }
16824       });
16825     }
16827     /**
16828      * Creates a function that invokes the predicate properties of `source` with
16829      * the corresponding property values of a given object, returning `true` if
16830      * all predicates return truthy, else `false`.
16831      *
16832      * **Note:** The created function is equivalent to `_.conformsTo` with
16833      * `source` partially applied.
16834      *
16835      * @static
16836      * @memberOf _
16837      * @since 4.0.0
16838      * @category Util
16839      * @param {Object} source The object of property predicates to conform to.
16840      * @returns {Function} Returns the new spec function.
16841      * @example
16842      *
16843      * var objects = [
16844      *   { 'a': 2, 'b': 1 },
16845      *   { 'a': 1, 'b': 2 }
16846      * ];
16847      *
16848      * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
16849      * // => [{ 'a': 1, 'b': 2 }]
16850      */
16851     function conforms(source) {
16852       return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
16853     }
16855     /**
16856      * Creates a function that returns `value`.
16857      *
16858      * @static
16859      * @memberOf _
16860      * @since 2.4.0
16861      * @category Util
16862      * @param {*} value The value to return from the new function.
16863      * @returns {Function} Returns the new constant function.
16864      * @example
16865      *
16866      * var objects = _.times(2, _.constant({ 'a': 1 }));
16867      *
16868      * console.log(objects);
16869      * // => [{ 'a': 1 }, { 'a': 1 }]
16870      *
16871      * console.log(objects[0] === objects[1]);
16872      * // => true
16873      */
16874     function constant(value) {
16875       return function() {
16876         return value;
16877       };
16878     }
16880     /**
16881      * Checks `value` to determine whether a default value should be returned in
16882      * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
16883      * or `undefined`.
16884      *
16885      * @static
16886      * @memberOf _
16887      * @since 4.14.0
16888      * @category Util
16889      * @param {*} value The value to check.
16890      * @param {*} defaultValue The default value.
16891      * @returns {*} Returns the resolved value.
16892      * @example
16893      *
16894      * _.defaultTo(1, 10);
16895      * // => 1
16896      *
16897      * _.defaultTo(undefined, 10);
16898      * // => 10
16899      */
16900     function defaultTo(value, defaultValue) {
16901       return (value == null || value !== value) ? defaultValue : value;
16902     }
16904     /**
16905      * Creates a function that returns the result of invoking the given functions
16906      * with the `this` binding of the created function, where each successive
16907      * invocation is supplied the return value of the previous.
16908      *
16909      * @static
16910      * @memberOf _
16911      * @since 3.0.0
16912      * @category Util
16913      * @param {...(Function|Function[])} [funcs] The functions to invoke.
16914      * @returns {Function} Returns the new composite function.
16915      * @see _.flowRight
16916      * @example
16917      *
16918      * function square(n) {
16919      *   return n * n;
16920      * }
16921      *
16922      * var addSquare = _.flow([_.add, square]);
16923      * addSquare(1, 2);
16924      * // => 9
16925      */
16926     var flow = createFlow();
16928     /**
16929      * This method is like `_.flow` except that it creates a function that
16930      * invokes the given functions from right to left.
16931      *
16932      * @static
16933      * @since 3.0.0
16934      * @memberOf _
16935      * @category Util
16936      * @param {...(Function|Function[])} [funcs] The functions to invoke.
16937      * @returns {Function} Returns the new composite function.
16938      * @see _.flow
16939      * @example
16940      *
16941      * function square(n) {
16942      *   return n * n;
16943      * }
16944      *
16945      * var addSquare = _.flowRight([square, _.add]);
16946      * addSquare(1, 2);
16947      * // => 9
16948      */
16949     var flowRight = createFlow(true);
16951     /**
16952      * This method returns the first argument it receives.
16953      *
16954      * @static
16955      * @since 0.1.0
16956      * @memberOf _
16957      * @category Util
16958      * @param {*} value Any value.
16959      * @returns {*} Returns `value`.
16960      * @example
16961      *
16962      * var object = { 'a': 1 };
16963      *
16964      * console.log(_.identity(object) === object);
16965      * // => true
16966      */
16967     function identity(value) {
16968       return value;
16969     }
16971     /**
16972      * Creates a function that invokes `func` with the arguments of the created
16973      * function. If `func` is a property name, the created function returns the
16974      * property value for a given element. If `func` is an array or object, the
16975      * created function returns `true` for elements that contain the equivalent
16976      * source properties, otherwise it returns `false`.
16977      *
16978      * @static
16979      * @since 4.0.0
16980      * @memberOf _
16981      * @category Util
16982      * @param {*} [func=_.identity] The value to convert to a callback.
16983      * @returns {Function} Returns the callback.
16984      * @example
16985      *
16986      * var users = [
16987      *   { 'user': 'barney', 'age': 36, 'active': true },
16988      *   { 'user': 'fred',   'age': 40, 'active': false }
16989      * ];
16990      *
16991      * // The `_.matches` iteratee shorthand.
16992      * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
16993      * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
16994      *
16995      * // The `_.matchesProperty` iteratee shorthand.
16996      * _.filter(users, _.iteratee(['user', 'fred']));
16997      * // => [{ 'user': 'fred', 'age': 40 }]
16998      *
16999      * // The `_.property` iteratee shorthand.
17000      * _.map(users, _.iteratee('user'));
17001      * // => ['barney', 'fred']
17002      *
17003      * // Create custom iteratee shorthands.
17004      * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
17005      *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
17006      *     return func.test(string);
17007      *   };
17008      * });
17009      *
17010      * _.filter(['abc', 'def'], /ef/);
17011      * // => ['def']
17012      */
17013     function iteratee(func) {
17014       return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
17015     }
17017     /**
17018      * Creates a function that performs a partial deep comparison between a given
17019      * object and `source`, returning `true` if the given object has equivalent
17020      * property values, else `false`.
17021      *
17022      * **Note:** The created function is equivalent to `_.isMatch` with `source`
17023      * partially applied.
17024      *
17025      * Partial comparisons will match empty array and empty object `source`
17026      * values against any array or object value, respectively. See `_.isEqual`
17027      * for a list of supported value comparisons.
17028      *
17029      * @static
17030      * @memberOf _
17031      * @since 3.0.0
17032      * @category Util
17033      * @param {Object} source The object of property values to match.
17034      * @returns {Function} Returns the new spec function.
17035      * @example
17036      *
17037      * var objects = [
17038      *   { 'a': 1, 'b': 2, 'c': 3 },
17039      *   { 'a': 4, 'b': 5, 'c': 6 }
17040      * ];
17041      *
17042      * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
17043      * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
17044      */
17045     function matches(source) {
17046       return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
17047     }
17049     /**
17050      * Creates a function that performs a partial deep comparison between the
17051      * value at `path` of a given object to `srcValue`, returning `true` if the
17052      * object value is equivalent, else `false`.
17053      *
17054      * **Note:** Partial comparisons will match empty array and empty object
17055      * `srcValue` values against any array or object value, respectively. See
17056      * `_.isEqual` for a list of supported value comparisons.
17057      *
17058      * @static
17059      * @memberOf _
17060      * @since 3.2.0
17061      * @category Util
17062      * @param {Array|string} path The path of the property to get.
17063      * @param {*} srcValue The value to match.
17064      * @returns {Function} Returns the new spec function.
17065      * @example
17066      *
17067      * var objects = [
17068      *   { 'a': 1, 'b': 2, 'c': 3 },
17069      *   { 'a': 4, 'b': 5, 'c': 6 }
17070      * ];
17071      *
17072      * _.find(objects, _.matchesProperty('a', 4));
17073      * // => { 'a': 4, 'b': 5, 'c': 6 }
17074      */
17075     function matchesProperty(path, srcValue) {
17076       return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
17077     }
17079     /**
17080      * Creates a function that invokes the method at `path` of a given object.
17081      * Any additional arguments are provided to the invoked method.
17082      *
17083      * @static
17084      * @memberOf _
17085      * @since 3.7.0
17086      * @category Util
17087      * @param {Array|string} path The path of the method to invoke.
17088      * @param {...*} [args] The arguments to invoke the method with.
17089      * @returns {Function} Returns the new invoker function.
17090      * @example
17091      *
17092      * var objects = [
17093      *   { 'a': { 'b': _.constant(2) } },
17094      *   { 'a': { 'b': _.constant(1) } }
17095      * ];
17096      *
17097      * _.map(objects, _.method('a.b'));
17098      * // => [2, 1]
17099      *
17100      * _.map(objects, _.method(['a', 'b']));
17101      * // => [2, 1]
17102      */
17103     var method = baseRest(function(path, args) {
17104       return function(object) {
17105         return baseInvoke(object, path, args);
17106       };
17107     });
17109     /**
17110      * The opposite of `_.method`; this method creates a function that invokes
17111      * the method at a given path of `object`. Any additional arguments are
17112      * provided to the invoked method.
17113      *
17114      * @static
17115      * @memberOf _
17116      * @since 3.7.0
17117      * @category Util
17118      * @param {Object} object The object to query.
17119      * @param {...*} [args] The arguments to invoke the method with.
17120      * @returns {Function} Returns the new invoker function.
17121      * @example
17122      *
17123      * var array = _.times(3, _.constant),
17124      *     object = { 'a': array, 'b': array, 'c': array };
17125      *
17126      * _.map(['a[2]', 'c[0]'], _.methodOf(object));
17127      * // => [2, 0]
17128      *
17129      * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
17130      * // => [2, 0]
17131      */
17132     var methodOf = baseRest(function(object, args) {
17133       return function(path) {
17134         return baseInvoke(object, path, args);
17135       };
17136     });
17138     /**
17139      * Adds all own enumerable string keyed function properties of a source
17140      * object to the destination object. If `object` is a function, then methods
17141      * are added to its prototype as well.
17142      *
17143      * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
17144      * avoid conflicts caused by modifying the original.
17145      *
17146      * @static
17147      * @since 0.1.0
17148      * @memberOf _
17149      * @category Util
17150      * @param {Function|Object} [object=lodash] The destination object.
17151      * @param {Object} source The object of functions to add.
17152      * @param {Object} [options={}] The options object.
17153      * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
17154      * @returns {Function|Object} Returns `object`.
17155      * @example
17156      *
17157      * function vowels(string) {
17158      *   return _.filter(string, function(v) {
17159      *     return /[aeiou]/i.test(v);
17160      *   });
17161      * }
17162      *
17163      * _.mixin({ 'vowels': vowels });
17164      * _.vowels('fred');
17165      * // => ['e']
17166      *
17167      * _('fred').vowels().value();
17168      * // => ['e']
17169      *
17170      * _.mixin({ 'vowels': vowels }, { 'chain': false });
17171      * _('fred').vowels();
17172      * // => ['e']
17173      */
17174     function mixin(object, source, options) {
17175       var props = keys(source),
17176           methodNames = baseFunctions(source, props);
17178       if (options == null &&
17179           !(isObject(source) && (methodNames.length || !props.length))) {
17180         options = source;
17181         source = object;
17182         object = this;
17183         methodNames = baseFunctions(source, keys(source));
17184       }
17185       var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
17186           isFunc = isFunction(object);
17188       arrayEach(methodNames, function(methodName) {
17189         var func = source[methodName];
17190         object[methodName] = func;
17191         if (isFunc) {
17192           object.prototype[methodName] = function() {
17193             var chainAll = this.__chain__;
17194             if (chain || chainAll) {
17195               var result = object(this.__wrapped__),
17196                   actions = result.__actions__ = copyArray(this.__actions__);
17198               actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
17199               result.__chain__ = chainAll;
17200               return result;
17201             }
17202             return func.apply(object, arrayPush([this.value()], arguments));
17203           };
17204         }
17205       });
17207       return object;
17208     }
17210     /**
17211      * Reverts the `_` variable to its previous value and returns a reference to
17212      * the `lodash` function.
17213      *
17214      * @static
17215      * @since 0.1.0
17216      * @memberOf _
17217      * @category Util
17218      * @returns {Function} Returns the `lodash` function.
17219      * @example
17220      *
17221      * var lodash = _.noConflict();
17222      */
17223     function noConflict() {
17224       if (root._ === this) {
17225         root._ = oldDash;
17226       }
17227       return this;
17228     }
17230     /**
17231      * This method returns `undefined`.
17232      *
17233      * @static
17234      * @memberOf _
17235      * @since 2.3.0
17236      * @category Util
17237      * @example
17238      *
17239      * _.times(2, _.noop);
17240      * // => [undefined, undefined]
17241      */
17242     function noop() {
17243       // No operation performed.
17244     }
17246     /**
17247      * Creates a function that gets the argument at index `n`. If `n` is negative,
17248      * the nth argument from the end is returned.
17249      *
17250      * @static
17251      * @memberOf _
17252      * @since 4.0.0
17253      * @category Util
17254      * @param {number} [n=0] The index of the argument to return.
17255      * @returns {Function} Returns the new pass-thru function.
17256      * @example
17257      *
17258      * var func = _.nthArg(1);
17259      * func('a', 'b', 'c', 'd');
17260      * // => 'b'
17261      *
17262      * var func = _.nthArg(-2);
17263      * func('a', 'b', 'c', 'd');
17264      * // => 'c'
17265      */
17266     function nthArg(n) {
17267       n = toInteger(n);
17268       return baseRest(function(args) {
17269         return baseNth(args, n);
17270       });
17271     }
17273     /**
17274      * Creates a function that invokes `iteratees` with the arguments it receives
17275      * and returns their results.
17276      *
17277      * @static
17278      * @memberOf _
17279      * @since 4.0.0
17280      * @category Util
17281      * @param {...(Function|Function[])} [iteratees=[_.identity]]
17282      *  The iteratees to invoke.
17283      * @returns {Function} Returns the new function.
17284      * @example
17285      *
17286      * var func = _.over([Math.max, Math.min]);
17287      *
17288      * func(1, 2, 3, 4);
17289      * // => [4, 1]
17290      */
17291     var over = createOver(arrayMap);
17293     /**
17294      * Creates a function that checks if **all** of the `predicates` return
17295      * truthy when invoked with the arguments it receives.
17296      *
17297      * @static
17298      * @memberOf _
17299      * @since 4.0.0
17300      * @category Util
17301      * @param {...(Function|Function[])} [predicates=[_.identity]]
17302      *  The predicates to check.
17303      * @returns {Function} Returns the new function.
17304      * @example
17305      *
17306      * var func = _.overEvery([Boolean, isFinite]);
17307      *
17308      * func('1');
17309      * // => true
17310      *
17311      * func(null);
17312      * // => false
17313      *
17314      * func(NaN);
17315      * // => false
17316      */
17317     var overEvery = createOver(arrayEvery);
17319     /**
17320      * Creates a function that checks if **any** of the `predicates` return
17321      * truthy when invoked with the arguments it receives.
17322      *
17323      * @static
17324      * @memberOf _
17325      * @since 4.0.0
17326      * @category Util
17327      * @param {...(Function|Function[])} [predicates=[_.identity]]
17328      *  The predicates to check.
17329      * @returns {Function} Returns the new function.
17330      * @example
17331      *
17332      * var func = _.overSome([Boolean, isFinite]);
17333      *
17334      * func('1');
17335      * // => true
17336      *
17337      * func(null);
17338      * // => true
17339      *
17340      * func(NaN);
17341      * // => false
17342      */
17343     var overSome = createOver(arraySome);
17345     /**
17346      * Creates a function that returns the value at `path` of a given object.
17347      *
17348      * @static
17349      * @memberOf _
17350      * @since 2.4.0
17351      * @category Util
17352      * @param {Array|string} path The path of the property to get.
17353      * @returns {Function} Returns the new accessor function.
17354      * @example
17355      *
17356      * var objects = [
17357      *   { 'a': { 'b': 2 } },
17358      *   { 'a': { 'b': 1 } }
17359      * ];
17360      *
17361      * _.map(objects, _.property('a.b'));
17362      * // => [2, 1]
17363      *
17364      * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
17365      * // => [1, 2]
17366      */
17367     function property(path) {
17368       return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
17369     }
17371     /**
17372      * The opposite of `_.property`; this method creates a function that returns
17373      * the value at a given path of `object`.
17374      *
17375      * @static
17376      * @memberOf _
17377      * @since 3.0.0
17378      * @category Util
17379      * @param {Object} object The object to query.
17380      * @returns {Function} Returns the new accessor function.
17381      * @example
17382      *
17383      * var array = [0, 1, 2],
17384      *     object = { 'a': array, 'b': array, 'c': array };
17385      *
17386      * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
17387      * // => [2, 0]
17388      *
17389      * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
17390      * // => [2, 0]
17391      */
17392     function propertyOf(object) {
17393       return function(path) {
17394         return object == null ? undefined : baseGet(object, path);
17395       };
17396     }
17398     /**
17399      * Creates an array of numbers (positive and/or negative) progressing from
17400      * `start` up to, but not including, `end`. A step of `-1` is used if a negative
17401      * `start` is specified without an `end` or `step`. If `end` is not specified,
17402      * it's set to `start` with `start` then set to `0`.
17403      *
17404      * **Note:** JavaScript follows the IEEE-754 standard for resolving
17405      * floating-point values which can produce unexpected results.
17406      *
17407      * @static
17408      * @since 0.1.0
17409      * @memberOf _
17410      * @category Util
17411      * @param {number} [start=0] The start of the range.
17412      * @param {number} end The end of the range.
17413      * @param {number} [step=1] The value to increment or decrement by.
17414      * @returns {Array} Returns the range of numbers.
17415      * @see _.inRange, _.rangeRight
17416      * @example
17417      *
17418      * _.range(4);
17419      * // => [0, 1, 2, 3]
17420      *
17421      * _.range(-4);
17422      * // => [0, -1, -2, -3]
17423      *
17424      * _.range(1, 5);
17425      * // => [1, 2, 3, 4]
17426      *
17427      * _.range(0, 20, 5);
17428      * // => [0, 5, 10, 15]
17429      *
17430      * _.range(0, -4, -1);
17431      * // => [0, -1, -2, -3]
17432      *
17433      * _.range(1, 4, 0);
17434      * // => [1, 1, 1]
17435      *
17436      * _.range(0);
17437      * // => []
17438      */
17439     var range = createRange();
17441     /**
17442      * This method is like `_.range` except that it populates values in
17443      * descending order.
17444      *
17445      * @static
17446      * @memberOf _
17447      * @since 4.0.0
17448      * @category Util
17449      * @param {number} [start=0] The start of the range.
17450      * @param {number} end The end of the range.
17451      * @param {number} [step=1] The value to increment or decrement by.
17452      * @returns {Array} Returns the range of numbers.
17453      * @see _.inRange, _.range
17454      * @example
17455      *
17456      * _.rangeRight(4);
17457      * // => [3, 2, 1, 0]
17458      *
17459      * _.rangeRight(-4);
17460      * // => [-3, -2, -1, 0]
17461      *
17462      * _.rangeRight(1, 5);
17463      * // => [4, 3, 2, 1]
17464      *
17465      * _.rangeRight(0, 20, 5);
17466      * // => [15, 10, 5, 0]
17467      *
17468      * _.rangeRight(0, -4, -1);
17469      * // => [-3, -2, -1, 0]
17470      *
17471      * _.rangeRight(1, 4, 0);
17472      * // => [1, 1, 1]
17473      *
17474      * _.rangeRight(0);
17475      * // => []
17476      */
17477     var rangeRight = createRange(true);
17479     /**
17480      * This method returns a new empty array.
17481      *
17482      * @static
17483      * @memberOf _
17484      * @since 4.13.0
17485      * @category Util
17486      * @returns {Array} Returns the new empty array.
17487      * @example
17488      *
17489      * var arrays = _.times(2, _.stubArray);
17490      *
17491      * console.log(arrays);
17492      * // => [[], []]
17493      *
17494      * console.log(arrays[0] === arrays[1]);
17495      * // => false
17496      */
17497     function stubArray() {
17498       return [];
17499     }
17501     /**
17502      * This method returns `false`.
17503      *
17504      * @static
17505      * @memberOf _
17506      * @since 4.13.0
17507      * @category Util
17508      * @returns {boolean} Returns `false`.
17509      * @example
17510      *
17511      * _.times(2, _.stubFalse);
17512      * // => [false, false]
17513      */
17514     function stubFalse() {
17515       return false;
17516     }
17518     /**
17519      * This method returns a new empty object.
17520      *
17521      * @static
17522      * @memberOf _
17523      * @since 4.13.0
17524      * @category Util
17525      * @returns {Object} Returns the new empty object.
17526      * @example
17527      *
17528      * var objects = _.times(2, _.stubObject);
17529      *
17530      * console.log(objects);
17531      * // => [{}, {}]
17532      *
17533      * console.log(objects[0] === objects[1]);
17534      * // => false
17535      */
17536     function stubObject() {
17537       return {};
17538     }
17540     /**
17541      * This method returns an empty string.
17542      *
17543      * @static
17544      * @memberOf _
17545      * @since 4.13.0
17546      * @category Util
17547      * @returns {string} Returns the empty string.
17548      * @example
17549      *
17550      * _.times(2, _.stubString);
17551      * // => ['', '']
17552      */
17553     function stubString() {
17554       return '';
17555     }
17557     /**
17558      * This method returns `true`.
17559      *
17560      * @static
17561      * @memberOf _
17562      * @since 4.13.0
17563      * @category Util
17564      * @returns {boolean} Returns `true`.
17565      * @example
17566      *
17567      * _.times(2, _.stubTrue);
17568      * // => [true, true]
17569      */
17570     function stubTrue() {
17571       return true;
17572     }
17574     /**
17575      * Invokes the iteratee `n` times, returning an array of the results of
17576      * each invocation. The iteratee is invoked with one argument; (index).
17577      *
17578      * @static
17579      * @since 0.1.0
17580      * @memberOf _
17581      * @category Util
17582      * @param {number} n The number of times to invoke `iteratee`.
17583      * @param {Function} [iteratee=_.identity] The function invoked per iteration.
17584      * @returns {Array} Returns the array of results.
17585      * @example
17586      *
17587      * _.times(3, String);
17588      * // => ['0', '1', '2']
17589      *
17590      *  _.times(4, _.constant(0));
17591      * // => [0, 0, 0, 0]
17592      */
17593     function times(n, iteratee) {
17594       n = toInteger(n);
17595       if (n < 1 || n > MAX_SAFE_INTEGER) {
17596         return [];
17597       }
17598       var index = MAX_ARRAY_LENGTH,
17599           length = nativeMin(n, MAX_ARRAY_LENGTH);
17601       iteratee = getIteratee(iteratee);
17602       n -= MAX_ARRAY_LENGTH;
17604       var result = baseTimes(length, iteratee);
17605       while (++index < n) {
17606         iteratee(index);
17607       }
17608       return result;
17609     }
17611     /**
17612      * Converts `value` to a property path array.
17613      *
17614      * @static
17615      * @memberOf _
17616      * @since 4.0.0
17617      * @category Util
17618      * @param {*} value The value to convert.
17619      * @returns {Array} Returns the new property path array.
17620      * @example
17621      *
17622      * _.toPath('a.b.c');
17623      * // => ['a', 'b', 'c']
17624      *
17625      * _.toPath('a[0].b.c');
17626      * // => ['a', '0', 'b', 'c']
17627      */
17628     function toPath(value) {
17629       if (isArray(value)) {
17630         return arrayMap(value, toKey);
17631       }
17632       return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
17633     }
17635     /**
17636      * Generates a unique ID. If `prefix` is given, the ID is appended to it.
17637      *
17638      * @static
17639      * @since 0.1.0
17640      * @memberOf _
17641      * @category Util
17642      * @param {string} [prefix=''] The value to prefix the ID with.
17643      * @returns {string} Returns the unique ID.
17644      * @example
17645      *
17646      * _.uniqueId('contact_');
17647      * // => 'contact_104'
17648      *
17649      * _.uniqueId();
17650      * // => '105'
17651      */
17652     function uniqueId(prefix) {
17653       var id = ++idCounter;
17654       return toString(prefix) + id;
17655     }
17657     /*------------------------------------------------------------------------*/
17659     /**
17660      * Adds two numbers.
17661      *
17662      * @static
17663      * @memberOf _
17664      * @since 3.4.0
17665      * @category Math
17666      * @param {number} augend The first number in an addition.
17667      * @param {number} addend The second number in an addition.
17668      * @returns {number} Returns the total.
17669      * @example
17670      *
17671      * _.add(6, 4);
17672      * // => 10
17673      */
17674     var add = createMathOperation(function(augend, addend) {
17675       return augend + addend;
17676     }, 0);
17678     /**
17679      * Computes `number` rounded up to `precision`.
17680      *
17681      * @static
17682      * @memberOf _
17683      * @since 3.10.0
17684      * @category Math
17685      * @param {number} number The number to round up.
17686      * @param {number} [precision=0] The precision to round up to.
17687      * @returns {number} Returns the rounded up number.
17688      * @example
17689      *
17690      * _.ceil(4.006);
17691      * // => 5
17692      *
17693      * _.ceil(6.004, 2);
17694      * // => 6.01
17695      *
17696      * _.ceil(6040, -2);
17697      * // => 6100
17698      */
17699     var ceil = createRound('ceil');
17701     /**
17702      * Divide two numbers.
17703      *
17704      * @static
17705      * @memberOf _
17706      * @since 4.7.0
17707      * @category Math
17708      * @param {number} dividend The first number in a division.
17709      * @param {number} divisor The second number in a division.
17710      * @returns {number} Returns the quotient.
17711      * @example
17712      *
17713      * _.divide(6, 4);
17714      * // => 1.5
17715      */
17716     var divide = createMathOperation(function(dividend, divisor) {
17717       return dividend / divisor;
17718     }, 1);
17720     /**
17721      * Computes `number` rounded down to `precision`.
17722      *
17723      * @static
17724      * @memberOf _
17725      * @since 3.10.0
17726      * @category Math
17727      * @param {number} number The number to round down.
17728      * @param {number} [precision=0] The precision to round down to.
17729      * @returns {number} Returns the rounded down number.
17730      * @example
17731      *
17732      * _.floor(4.006);
17733      * // => 4
17734      *
17735      * _.floor(0.046, 2);
17736      * // => 0.04
17737      *
17738      * _.floor(4060, -2);
17739      * // => 4000
17740      */
17741     var floor = createRound('floor');
17743     /**
17744      * Computes the maximum value of `array`. If `array` is empty or falsey,
17745      * `undefined` is returned.
17746      *
17747      * @static
17748      * @since 0.1.0
17749      * @memberOf _
17750      * @category Math
17751      * @param {Array} array The array to iterate over.
17752      * @returns {*} Returns the maximum value.
17753      * @example
17754      *
17755      * _.max([4, 2, 8, 6]);
17756      * // => 8
17757      *
17758      * _.max([]);
17759      * // => undefined
17760      */
17761     function max(array) {
17762       return (array && array.length)
17763         ? baseExtremum(array, identity, baseGt)
17764         : undefined;
17765     }
17767     /**
17768      * This method is like `_.max` except that it accepts `iteratee` which is
17769      * invoked for each element in `array` to generate the criterion by which
17770      * the value is ranked. The iteratee is invoked with one argument: (value).
17771      *
17772      * @static
17773      * @memberOf _
17774      * @since 4.0.0
17775      * @category Math
17776      * @param {Array} array The array to iterate over.
17777      * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
17778      * @returns {*} Returns the maximum value.
17779      * @example
17780      *
17781      * var objects = [{ 'n': 1 }, { 'n': 2 }];
17782      *
17783      * _.maxBy(objects, function(o) { return o.n; });
17784      * // => { 'n': 2 }
17785      *
17786      * // The `_.property` iteratee shorthand.
17787      * _.maxBy(objects, 'n');
17788      * // => { 'n': 2 }
17789      */
17790     function maxBy(array, iteratee) {
17791       return (array && array.length)
17792         ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
17793         : undefined;
17794     }
17796     /**
17797      * Computes the mean of the values in `array`.
17798      *
17799      * @static
17800      * @memberOf _
17801      * @since 4.0.0
17802      * @category Math
17803      * @param {Array} array The array to iterate over.
17804      * @returns {number} Returns the mean.
17805      * @example
17806      *
17807      * _.mean([4, 2, 8, 6]);
17808      * // => 5
17809      */
17810     function mean(array) {
17811       return baseMean(array, identity);
17812     }
17814     /**
17815      * This method is like `_.mean` except that it accepts `iteratee` which is
17816      * invoked for each element in `array` to generate the value to be averaged.
17817      * The iteratee is invoked with one argument: (value).
17818      *
17819      * @static
17820      * @memberOf _
17821      * @since 4.7.0
17822      * @category Math
17823      * @param {Array} array The array to iterate over.
17824      * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
17825      * @returns {number} Returns the mean.
17826      * @example
17827      *
17828      * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
17829      *
17830      * _.meanBy(objects, function(o) { return o.n; });
17831      * // => 5
17832      *
17833      * // The `_.property` iteratee shorthand.
17834      * _.meanBy(objects, 'n');
17835      * // => 5
17836      */
17837     function meanBy(array, iteratee) {
17838       return baseMean(array, getIteratee(iteratee, 2));
17839     }
17841     /**
17842      * Computes the minimum value of `array`. If `array` is empty or falsey,
17843      * `undefined` is returned.
17844      *
17845      * @static
17846      * @since 0.1.0
17847      * @memberOf _
17848      * @category Math
17849      * @param {Array} array The array to iterate over.
17850      * @returns {*} Returns the minimum value.
17851      * @example
17852      *
17853      * _.min([4, 2, 8, 6]);
17854      * // => 2
17855      *
17856      * _.min([]);
17857      * // => undefined
17858      */
17859     function min(array) {
17860       return (array && array.length)
17861         ? baseExtremum(array, identity, baseLt)
17862         : undefined;
17863     }
17865     /**
17866      * This method is like `_.min` except that it accepts `iteratee` which is
17867      * invoked for each element in `array` to generate the criterion by which
17868      * the value is ranked. The iteratee is invoked with one argument: (value).
17869      *
17870      * @static
17871      * @memberOf _
17872      * @since 4.0.0
17873      * @category Math
17874      * @param {Array} array The array to iterate over.
17875      * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
17876      * @returns {*} Returns the minimum value.
17877      * @example
17878      *
17879      * var objects = [{ 'n': 1 }, { 'n': 2 }];
17880      *
17881      * _.minBy(objects, function(o) { return o.n; });
17882      * // => { 'n': 1 }
17883      *
17884      * // The `_.property` iteratee shorthand.
17885      * _.minBy(objects, 'n');
17886      * // => { 'n': 1 }
17887      */
17888     function minBy(array, iteratee) {
17889       return (array && array.length)
17890         ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
17891         : undefined;
17892     }
17894     /**
17895      * Multiply two numbers.
17896      *
17897      * @static
17898      * @memberOf _
17899      * @since 4.7.0
17900      * @category Math
17901      * @param {number} multiplier The first number in a multiplication.
17902      * @param {number} multiplicand The second number in a multiplication.
17903      * @returns {number} Returns the product.
17904      * @example
17905      *
17906      * _.multiply(6, 4);
17907      * // => 24
17908      */
17909     var multiply = createMathOperation(function(multiplier, multiplicand) {
17910       return multiplier * multiplicand;
17911     }, 1);
17913     /**
17914      * Computes `number` rounded to `precision`.
17915      *
17916      * @static
17917      * @memberOf _
17918      * @since 3.10.0
17919      * @category Math
17920      * @param {number} number The number to round.
17921      * @param {number} [precision=0] The precision to round to.
17922      * @returns {number} Returns the rounded number.
17923      * @example
17924      *
17925      * _.round(4.006);
17926      * // => 4
17927      *
17928      * _.round(4.006, 2);
17929      * // => 4.01
17930      *
17931      * _.round(4060, -2);
17932      * // => 4100
17933      */
17934     var round = createRound('round');
17936     /**
17937      * Subtract two numbers.
17938      *
17939      * @static
17940      * @memberOf _
17941      * @since 4.0.0
17942      * @category Math
17943      * @param {number} minuend The first number in a subtraction.
17944      * @param {number} subtrahend The second number in a subtraction.
17945      * @returns {number} Returns the difference.
17946      * @example
17947      *
17948      * _.subtract(6, 4);
17949      * // => 2
17950      */
17951     var subtract = createMathOperation(function(minuend, subtrahend) {
17952       return minuend - subtrahend;
17953     }, 0);
17955     /**
17956      * Computes the sum of the values in `array`.
17957      *
17958      * @static
17959      * @memberOf _
17960      * @since 3.4.0
17961      * @category Math
17962      * @param {Array} array The array to iterate over.
17963      * @returns {number} Returns the sum.
17964      * @example
17965      *
17966      * _.sum([4, 2, 8, 6]);
17967      * // => 20
17968      */
17969     function sum(array) {
17970       return (array && array.length)
17971         ? baseSum(array, identity)
17972         : 0;
17973     }
17975     /**
17976      * This method is like `_.sum` except that it accepts `iteratee` which is
17977      * invoked for each element in `array` to generate the value to be summed.
17978      * The iteratee is invoked with one argument: (value).
17979      *
17980      * @static
17981      * @memberOf _
17982      * @since 4.0.0
17983      * @category Math
17984      * @param {Array} array The array to iterate over.
17985      * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
17986      * @returns {number} Returns the sum.
17987      * @example
17988      *
17989      * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
17990      *
17991      * _.sumBy(objects, function(o) { return o.n; });
17992      * // => 20
17993      *
17994      * // The `_.property` iteratee shorthand.
17995      * _.sumBy(objects, 'n');
17996      * // => 20
17997      */
17998     function sumBy(array, iteratee) {
17999       return (array && array.length)
18000         ? baseSum(array, getIteratee(iteratee, 2))
18001         : 0;
18002     }
18004     /*------------------------------------------------------------------------*/
18006     // Add methods that return wrapped values in chain sequences.
18007     lodash.after = after;
18008     lodash.ary = ary;
18009     lodash.assign = assign;
18010     lodash.assignIn = assignIn;
18011     lodash.assignInWith = assignInWith;
18012     lodash.assignWith = assignWith;
18013     lodash.at = at;
18014     lodash.before = before;
18015     lodash.bind = bind;
18016     lodash.bindAll = bindAll;
18017     lodash.bindKey = bindKey;
18018     lodash.castArray = castArray;
18019     lodash.chain = chain;
18020     lodash.chunk = chunk;
18021     lodash.compact = compact;
18022     lodash.concat = concat;
18023     lodash.cond = cond;
18024     lodash.conforms = conforms;
18025     lodash.constant = constant;
18026     lodash.countBy = countBy;
18027     lodash.create = create;
18028     lodash.curry = curry;
18029     lodash.curryRight = curryRight;
18030     lodash.debounce = debounce;
18031     lodash.defaults = defaults;
18032     lodash.defaultsDeep = defaultsDeep;
18033     lodash.defer = defer;
18034     lodash.delay = delay;
18035     lodash.difference = difference;
18036     lodash.differenceBy = differenceBy;
18037     lodash.differenceWith = differenceWith;
18038     lodash.drop = drop;
18039     lodash.dropRight = dropRight;
18040     lodash.dropRightWhile = dropRightWhile;
18041     lodash.dropWhile = dropWhile;
18042     lodash.fill = fill;
18043     lodash.filter = filter;
18044     lodash.flatMap = flatMap;
18045     lodash.flatMapDeep = flatMapDeep;
18046     lodash.flatMapDepth = flatMapDepth;
18047     lodash.flatten = flatten;
18048     lodash.flattenDeep = flattenDeep;
18049     lodash.flattenDepth = flattenDepth;
18050     lodash.flip = flip;
18051     lodash.flow = flow;
18052     lodash.flowRight = flowRight;
18053     lodash.fromPairs = fromPairs;
18054     lodash.functions = functions;
18055     lodash.functionsIn = functionsIn;
18056     lodash.groupBy = groupBy;
18057     lodash.initial = initial;
18058     lodash.intersection = intersection;
18059     lodash.intersectionBy = intersectionBy;
18060     lodash.intersectionWith = intersectionWith;
18061     lodash.invert = invert;
18062     lodash.invertBy = invertBy;
18063     lodash.invokeMap = invokeMap;
18064     lodash.iteratee = iteratee;
18065     lodash.keyBy = keyBy;
18066     lodash.keys = keys;
18067     lodash.keysIn = keysIn;
18068     lodash.map = map;
18069     lodash.mapKeys = mapKeys;
18070     lodash.mapValues = mapValues;
18071     lodash.matches = matches;
18072     lodash.matchesProperty = matchesProperty;
18073     lodash.memoize = memoize;
18074     lodash.merge = merge;
18075     lodash.mergeWith = mergeWith;
18076     lodash.method = method;
18077     lodash.methodOf = methodOf;
18078     lodash.mixin = mixin;
18079     lodash.negate = negate;
18080     lodash.nthArg = nthArg;
18081     lodash.omit = omit;
18082     lodash.omitBy = omitBy;
18083     lodash.once = once;
18084     lodash.orderBy = orderBy;
18085     lodash.over = over;
18086     lodash.overArgs = overArgs;
18087     lodash.overEvery = overEvery;
18088     lodash.overSome = overSome;
18089     lodash.partial = partial;
18090     lodash.partialRight = partialRight;
18091     lodash.partition = partition;
18092     lodash.pick = pick;
18093     lodash.pickBy = pickBy;
18094     lodash.property = property;
18095     lodash.propertyOf = propertyOf;
18096     lodash.pull = pull;
18097     lodash.pullAll = pullAll;
18098     lodash.pullAllBy = pullAllBy;
18099     lodash.pullAllWith = pullAllWith;
18100     lodash.pullAt = pullAt;
18101     lodash.range = range;
18102     lodash.rangeRight = rangeRight;
18103     lodash.rearg = rearg;
18104     lodash.reject = reject;
18105     lodash.remove = remove;
18106     lodash.rest = rest;
18107     lodash.reverse = reverse;
18108     lodash.sampleSize = sampleSize;
18109     lodash.set = set;
18110     lodash.setWith = setWith;
18111     lodash.shuffle = shuffle;
18112     lodash.slice = slice;
18113     lodash.sortBy = sortBy;
18114     lodash.sortedUniq = sortedUniq;
18115     lodash.sortedUniqBy = sortedUniqBy;
18116     lodash.split = split;
18117     lodash.spread = spread;
18118     lodash.tail = tail;
18119     lodash.take = take;
18120     lodash.takeRight = takeRight;
18121     lodash.takeRightWhile = takeRightWhile;
18122     lodash.takeWhile = takeWhile;
18123     lodash.tap = tap;
18124     lodash.throttle = throttle;
18125     lodash.thru = thru;
18126     lodash.toArray = toArray;
18127     lodash.toPairs = toPairs;
18128     lodash.toPairsIn = toPairsIn;
18129     lodash.toPath = toPath;
18130     lodash.toPlainObject = toPlainObject;
18131     lodash.transform = transform;
18132     lodash.unary = unary;
18133     lodash.union = union;
18134     lodash.unionBy = unionBy;
18135     lodash.unionWith = unionWith;
18136     lodash.uniq = uniq;
18137     lodash.uniqBy = uniqBy;
18138     lodash.uniqWith = uniqWith;
18139     lodash.unset = unset;
18140     lodash.unzip = unzip;
18141     lodash.unzipWith = unzipWith;
18142     lodash.update = update;
18143     lodash.updateWith = updateWith;
18144     lodash.values = values;
18145     lodash.valuesIn = valuesIn;
18146     lodash.without = without;
18147     lodash.words = words;
18148     lodash.wrap = wrap;
18149     lodash.xor = xor;
18150     lodash.xorBy = xorBy;
18151     lodash.xorWith = xorWith;
18152     lodash.zip = zip;
18153     lodash.zipObject = zipObject;
18154     lodash.zipObjectDeep = zipObjectDeep;
18155     lodash.zipWith = zipWith;
18157     // Add aliases.
18158     lodash.entries = toPairs;
18159     lodash.entriesIn = toPairsIn;
18160     lodash.extend = assignIn;
18161     lodash.extendWith = assignInWith;
18163     // Add methods to `lodash.prototype`.
18164     mixin(lodash, lodash);
18166     /*------------------------------------------------------------------------*/
18168     // Add methods that return unwrapped values in chain sequences.
18169     lodash.add = add;
18170     lodash.attempt = attempt;
18171     lodash.camelCase = camelCase;
18172     lodash.capitalize = capitalize;
18173     lodash.ceil = ceil;
18174     lodash.clamp = clamp;
18175     lodash.clone = clone;
18176     lodash.cloneDeep = cloneDeep;
18177     lodash.cloneDeepWith = cloneDeepWith;
18178     lodash.cloneWith = cloneWith;
18179     lodash.conformsTo = conformsTo;
18180     lodash.deburr = deburr;
18181     lodash.defaultTo = defaultTo;
18182     lodash.divide = divide;
18183     lodash.endsWith = endsWith;
18184     lodash.eq = eq;
18185     lodash.escape = escape;
18186     lodash.escapeRegExp = escapeRegExp;
18187     lodash.every = every;
18188     lodash.find = find;
18189     lodash.findIndex = findIndex;
18190     lodash.findKey = findKey;
18191     lodash.findLast = findLast;
18192     lodash.findLastIndex = findLastIndex;
18193     lodash.findLastKey = findLastKey;
18194     lodash.floor = floor;
18195     lodash.forEach = forEach;
18196     lodash.forEachRight = forEachRight;
18197     lodash.forIn = forIn;
18198     lodash.forInRight = forInRight;
18199     lodash.forOwn = forOwn;
18200     lodash.forOwnRight = forOwnRight;
18201     lodash.get = get;
18202     lodash.gt = gt;
18203     lodash.gte = gte;
18204     lodash.has = has;
18205     lodash.hasIn = hasIn;
18206     lodash.head = head;
18207     lodash.identity = identity;
18208     lodash.includes = includes;
18209     lodash.indexOf = indexOf;
18210     lodash.inRange = inRange;
18211     lodash.invoke = invoke;
18212     lodash.isArguments = isArguments;
18213     lodash.isArray = isArray;
18214     lodash.isArrayBuffer = isArrayBuffer;
18215     lodash.isArrayLike = isArrayLike;
18216     lodash.isArrayLikeObject = isArrayLikeObject;
18217     lodash.isBoolean = isBoolean;
18218     lodash.isBuffer = isBuffer;
18219     lodash.isDate = isDate;
18220     lodash.isElement = isElement;
18221     lodash.isEmpty = isEmpty;
18222     lodash.isEqual = isEqual;
18223     lodash.isEqualWith = isEqualWith;
18224     lodash.isError = isError;
18225     lodash.isFinite = isFinite;
18226     lodash.isFunction = isFunction;
18227     lodash.isInteger = isInteger;
18228     lodash.isLength = isLength;
18229     lodash.isMap = isMap;
18230     lodash.isMatch = isMatch;
18231     lodash.isMatchWith = isMatchWith;
18232     lodash.isNaN = isNaN;
18233     lodash.isNative = isNative;
18234     lodash.isNil = isNil;
18235     lodash.isNull = isNull;
18236     lodash.isNumber = isNumber;
18237     lodash.isObject = isObject;
18238     lodash.isObjectLike = isObjectLike;
18239     lodash.isPlainObject = isPlainObject;
18240     lodash.isRegExp = isRegExp;
18241     lodash.isSafeInteger = isSafeInteger;
18242     lodash.isSet = isSet;
18243     lodash.isString = isString;
18244     lodash.isSymbol = isSymbol;
18245     lodash.isTypedArray = isTypedArray;
18246     lodash.isUndefined = isUndefined;
18247     lodash.isWeakMap = isWeakMap;
18248     lodash.isWeakSet = isWeakSet;
18249     lodash.join = join;
18250     lodash.kebabCase = kebabCase;
18251     lodash.last = last;
18252     lodash.lastIndexOf = lastIndexOf;
18253     lodash.lowerCase = lowerCase;
18254     lodash.lowerFirst = lowerFirst;
18255     lodash.lt = lt;
18256     lodash.lte = lte;
18257     lodash.max = max;
18258     lodash.maxBy = maxBy;
18259     lodash.mean = mean;
18260     lodash.meanBy = meanBy;
18261     lodash.min = min;
18262     lodash.minBy = minBy;
18263     lodash.stubArray = stubArray;
18264     lodash.stubFalse = stubFalse;
18265     lodash.stubObject = stubObject;
18266     lodash.stubString = stubString;
18267     lodash.stubTrue = stubTrue;
18268     lodash.multiply = multiply;
18269     lodash.nth = nth;
18270     lodash.noConflict = noConflict;
18271     lodash.noop = noop;
18272     lodash.now = now;
18273     lodash.pad = pad;
18274     lodash.padEnd = padEnd;
18275     lodash.padStart = padStart;
18276     lodash.parseInt = parseInt;
18277     lodash.random = random;
18278     lodash.reduce = reduce;
18279     lodash.reduceRight = reduceRight;
18280     lodash.repeat = repeat;
18281     lodash.replace = replace;
18282     lodash.result = result;
18283     lodash.round = round;
18284     lodash.runInContext = runInContext;
18285     lodash.sample = sample;
18286     lodash.size = size;
18287     lodash.snakeCase = snakeCase;
18288     lodash.some = some;
18289     lodash.sortedIndex = sortedIndex;
18290     lodash.sortedIndexBy = sortedIndexBy;
18291     lodash.sortedIndexOf = sortedIndexOf;
18292     lodash.sortedLastIndex = sortedLastIndex;
18293     lodash.sortedLastIndexBy = sortedLastIndexBy;
18294     lodash.sortedLastIndexOf = sortedLastIndexOf;
18295     lodash.startCase = startCase;
18296     lodash.startsWith = startsWith;
18297     lodash.subtract = subtract;
18298     lodash.sum = sum;
18299     lodash.sumBy = sumBy;
18300     lodash.template = template;
18301     lodash.times = times;
18302     lodash.toFinite = toFinite;
18303     lodash.toInteger = toInteger;
18304     lodash.toLength = toLength;
18305     lodash.toLower = toLower;
18306     lodash.toNumber = toNumber;
18307     lodash.toSafeInteger = toSafeInteger;
18308     lodash.toString = toString;
18309     lodash.toUpper = toUpper;
18310     lodash.trim = trim;
18311     lodash.trimEnd = trimEnd;
18312     lodash.trimStart = trimStart;
18313     lodash.truncate = truncate;
18314     lodash.unescape = unescape;
18315     lodash.uniqueId = uniqueId;
18316     lodash.upperCase = upperCase;
18317     lodash.upperFirst = upperFirst;
18319     // Add aliases.
18320     lodash.each = forEach;
18321     lodash.eachRight = forEachRight;
18322     lodash.first = head;
18324     mixin(lodash, (function() {
18325       var source = {};
18326       baseForOwn(lodash, function(func, methodName) {
18327         if (!hasOwnProperty.call(lodash.prototype, methodName)) {
18328           source[methodName] = func;
18329         }
18330       });
18331       return source;
18332     }()), { 'chain': false });
18334     /*------------------------------------------------------------------------*/
18336     /**
18337      * The semantic version number.
18338      *
18339      * @static
18340      * @memberOf _
18341      * @type {string}
18342      */
18343     lodash.VERSION = VERSION;
18345     // Assign default placeholders.
18346     arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
18347       lodash[methodName].placeholder = lodash;
18348     });
18350     // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
18351     arrayEach(['drop', 'take'], function(methodName, index) {
18352       LazyWrapper.prototype[methodName] = function(n) {
18353         n = n === undefined ? 1 : nativeMax(toInteger(n), 0);
18355         var result = (this.__filtered__ && !index)
18356           ? new LazyWrapper(this)
18357           : this.clone();
18359         if (result.__filtered__) {
18360           result.__takeCount__ = nativeMin(n, result.__takeCount__);
18361         } else {
18362           result.__views__.push({
18363             'size': nativeMin(n, MAX_ARRAY_LENGTH),
18364             'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
18365           });
18366         }
18367         return result;
18368       };
18370       LazyWrapper.prototype[methodName + 'Right'] = function(n) {
18371         return this.reverse()[methodName](n).reverse();
18372       };
18373     });
18375     // Add `LazyWrapper` methods that accept an `iteratee` value.
18376     arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
18377       var type = index + 1,
18378           isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
18380       LazyWrapper.prototype[methodName] = function(iteratee) {
18381         var result = this.clone();
18382         result.__iteratees__.push({
18383           'iteratee': getIteratee(iteratee, 3),
18384           'type': type
18385         });
18386         result.__filtered__ = result.__filtered__ || isFilter;
18387         return result;
18388       };
18389     });
18391     // Add `LazyWrapper` methods for `_.head` and `_.last`.
18392     arrayEach(['head', 'last'], function(methodName, index) {
18393       var takeName = 'take' + (index ? 'Right' : '');
18395       LazyWrapper.prototype[methodName] = function() {
18396         return this[takeName](1).value()[0];
18397       };
18398     });
18400     // Add `LazyWrapper` methods for `_.initial` and `_.tail`.
18401     arrayEach(['initial', 'tail'], function(methodName, index) {
18402       var dropName = 'drop' + (index ? '' : 'Right');
18404       LazyWrapper.prototype[methodName] = function() {
18405         return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
18406       };
18407     });
18409     LazyWrapper.prototype.compact = function() {
18410       return this.filter(identity);
18411     };
18413     LazyWrapper.prototype.find = function(predicate) {
18414       return this.filter(predicate).head();
18415     };
18417     LazyWrapper.prototype.findLast = function(predicate) {
18418       return this.reverse().find(predicate);
18419     };
18421     LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
18422       if (typeof path == 'function') {
18423         return new LazyWrapper(this);
18424       }
18425       return this.map(function(value) {
18426         return baseInvoke(value, path, args);
18427       });
18428     });
18430     LazyWrapper.prototype.reject = function(predicate) {
18431       return this.filter(negate(getIteratee(predicate)));
18432     };
18434     LazyWrapper.prototype.slice = function(start, end) {
18435       start = toInteger(start);
18437       var result = this;
18438       if (result.__filtered__ && (start > 0 || end < 0)) {
18439         return new LazyWrapper(result);
18440       }
18441       if (start < 0) {
18442         result = result.takeRight(-start);
18443       } else if (start) {
18444         result = result.drop(start);
18445       }
18446       if (end !== undefined) {
18447         end = toInteger(end);
18448         result = end < 0 ? result.dropRight(-end) : result.take(end - start);
18449       }
18450       return result;
18451     };
18453     LazyWrapper.prototype.takeRightWhile = function(predicate) {
18454       return this.reverse().takeWhile(predicate).reverse();
18455     };
18457     LazyWrapper.prototype.toArray = function() {
18458       return this.take(MAX_ARRAY_LENGTH);
18459     };
18461     // Add `LazyWrapper` methods to `lodash.prototype`.
18462     baseForOwn(LazyWrapper.prototype, function(func, methodName) {
18463       var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
18464           isTaker = /^(?:head|last)$/.test(methodName),
18465           lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
18466           retUnwrapped = isTaker || /^find/.test(methodName);
18468       if (!lodashFunc) {
18469         return;
18470       }
18471       lodash.prototype[methodName] = function() {
18472         var value = this.__wrapped__,
18473             args = isTaker ? [1] : arguments,
18474             isLazy = value instanceof LazyWrapper,
18475             iteratee = args[0],
18476             useLazy = isLazy || isArray(value);
18478         var interceptor = function(value) {
18479           var result = lodashFunc.apply(lodash, arrayPush([value], args));
18480           return (isTaker && chainAll) ? result[0] : result;
18481         };
18483         if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
18484           // Avoid lazy use if the iteratee has a "length" value other than `1`.
18485           isLazy = useLazy = false;
18486         }
18487         var chainAll = this.__chain__,
18488             isHybrid = !!this.__actions__.length,
18489             isUnwrapped = retUnwrapped && !chainAll,
18490             onlyLazy = isLazy && !isHybrid;
18492         if (!retUnwrapped && useLazy) {
18493           value = onlyLazy ? value : new LazyWrapper(this);
18494           var result = func.apply(value, args);
18495           result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
18496           return new LodashWrapper(result, chainAll);
18497         }
18498         if (isUnwrapped && onlyLazy) {
18499           return func.apply(this, args);
18500         }
18501         result = this.thru(interceptor);
18502         return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
18503       };
18504     });
18506     // Add `Array` methods to `lodash.prototype`.
18507     arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
18508       var func = arrayProto[methodName],
18509           chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
18510           retUnwrapped = /^(?:pop|shift)$/.test(methodName);
18512       lodash.prototype[methodName] = function() {
18513         var args = arguments;
18514         if (retUnwrapped && !this.__chain__) {
18515           var value = this.value();
18516           return func.apply(isArray(value) ? value : [], args);
18517         }
18518         return this[chainName](function(value) {
18519           return func.apply(isArray(value) ? value : [], args);
18520         });
18521       };
18522     });
18524     // Map minified method names to their real names.
18525     baseForOwn(LazyWrapper.prototype, function(func, methodName) {
18526       var lodashFunc = lodash[methodName];
18527       if (lodashFunc) {
18528         var key = (lodashFunc.name + ''),
18529             names = realNames[key] || (realNames[key] = []);
18531         names.push({ 'name': methodName, 'func': lodashFunc });
18532       }
18533     });
18535     realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{
18536       'name': 'wrapper',
18537       'func': undefined
18538     }];
18540     // Add methods to `LazyWrapper`.
18541     LazyWrapper.prototype.clone = lazyClone;
18542     LazyWrapper.prototype.reverse = lazyReverse;
18543     LazyWrapper.prototype.value = lazyValue;
18545     // Add chain sequence methods to the `lodash` wrapper.
18546     lodash.prototype.at = wrapperAt;
18547     lodash.prototype.chain = wrapperChain;
18548     lodash.prototype.commit = wrapperCommit;
18549     lodash.prototype.next = wrapperNext;
18550     lodash.prototype.plant = wrapperPlant;
18551     lodash.prototype.reverse = wrapperReverse;
18552     lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
18554     // Add lazy aliases.
18555     lodash.prototype.first = lodash.prototype.head;
18557     if (symIterator) {
18558       lodash.prototype[symIterator] = wrapperToIterator;
18559     }
18560     return lodash;
18561   });
18563   /*--------------------------------------------------------------------------*/
18565   // Export lodash.
18566   var _ = runInContext();
18568   // Some AMD build optimizers, like r.js, check for condition patterns like:
18569   if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
18570     // Expose Lodash on the global object to prevent errors when Lodash is
18571     // loaded by a script tag in the presence of an AMD loader.
18572     // See http://requirejs.org/docs/errors.html#mismatch for more details.
18573     // Use `_.noConflict` to remove Lodash from the global object.
18574     root._ = _;
18576     // Define as an anonymous module so, through path mapping, it can be
18577     // referenced as the "underscore" module.
18578     define(function() {
18579       return _;
18580     });
18581   }
18582   // Check for `exports` after `define` in case a build optimizer adds it.
18583   else if (freeModule) {
18584     // Export for Node.js.
18585     (freeModule.exports = _)._ = _;
18586     // Export for CommonJS support.
18587     freeExports._ = _;
18588   }
18589   else {
18590     // Export to the global object.
18591     root._ = _;
18592   }
18593 }.call(this));
18595 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
18596 },{}],14:[function(require,module,exports){
18598  * Lexical analysis and token construction.
18599  */
18601 "use strict";
18603 var _      = require("lodash");
18604 var events = require("events");
18605 var reg    = require("./reg.js");
18606 var state  = require("./state.js").state;
18608 var unicodeData = require("../data/ascii-identifier-data.js");
18609 var asciiIdentifierStartTable = unicodeData.asciiIdentifierStartTable;
18610 var asciiIdentifierPartTable = unicodeData.asciiIdentifierPartTable;
18611 var nonAsciiIdentifierStartTable = require("../data/non-ascii-identifier-start.js");
18612 var nonAsciiIdentifierPartTable = require("../data/non-ascii-identifier-part-only.js");
18613 // Loading of this module is deferred as an optimization for ES2015 input
18614 var es5IdentifierNames;
18616 // Some of these token types are from JavaScript Parser API
18617 // while others are specific to JSHint parser.
18618 // JS Parser API: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API
18620 var Token = {
18621   Identifier: 1,
18622   Punctuator: 2,
18623   NumericLiteral: 3,
18624   StringLiteral: 4,
18625   Comment: 5,
18626   Keyword: 6,
18627   RegExp: 9,
18628   TemplateHead: 10,
18629   TemplateMiddle: 11,
18630   TemplateTail: 12,
18631   NoSubstTemplate: 13
18634 var Context = {
18635   Block: 1,
18636   Template: 2
18639 function isHex(str) {
18640   return /^[0-9a-fA-F]+$/.test(str);
18643 function isHexDigit(str) {
18644   return str.length === 1 && isHex(str);
18647 // Object that handles postponed lexing verifications that checks the parsed
18648 // environment state.
18650 function asyncTrigger() {
18651   var _checks = [];
18653   return {
18654     push: function(fn) {
18655       _checks.push(fn);
18656     },
18658     check: function() {
18659       for (var check = 0; check < _checks.length; ++check) {
18660         _checks[check]();
18661       }
18663       _checks.splice(0, _checks.length);
18664     }
18665   };
18669  * Lexer for JSHint.
18671  * This object does a char-by-char scan of the provided source code
18672  * and produces a sequence of tokens.
18674  *   var lex = new Lexer("var i = 0;");
18675  *   lex.start();
18676  *   lex.token(); // returns the next token
18678  * You have to use the token() method to move the lexer forward
18679  * but you don't have to use its return value to get tokens. In addition
18680  * to token() method returning the next token, the Lexer object also
18681  * emits events.
18683  *   lex.on("Identifier", function(data) {
18684  *     if (data.name.indexOf("_") >= 0) {
18685  *       // Produce a warning.
18686  *     }
18687  *   });
18689  * Note that the token() method returns tokens in a JSLint-compatible
18690  * format while the event emitter uses a slightly modified version of
18691  * Mozilla's JavaScript Parser API. Eventually, we will move away from
18692  * JSLint format.
18693  */
18694 function Lexer(source) {
18695   var lines = source;
18697   if (typeof lines === "string") {
18698     lines = lines
18699       .replace(/\r\n/g, "\n")
18700       .replace(/\r/g, "\n")
18701       .split("\n");
18702   }
18704   // If the first line is a shebang (#!), make it a blank and move on.
18705   // Shebangs are used by Node scripts.
18707   if (lines[0] && lines[0].substr(0, 2) === "#!") {
18708     if (lines[0].indexOf("node") !== -1) {
18709       state.option.node = true;
18710     }
18711     lines[0] = "";
18712   }
18714   this.emitter = new events.EventEmitter();
18715   this.source = source;
18716   this.setLines(lines);
18717   this.prereg = true;
18719   this.line = 0;
18720   this.char = 1;
18721   this.from = 1;
18722   this.input = "";
18723   this.inComment = false;
18724   this.context = [];
18725   this.templateStarts = [];
18727   for (var i = 0; i < state.option.indent; i += 1) {
18728     state.tab += " ";
18729   }
18732 Lexer.prototype = {
18733   _lines: [],
18735   inContext: function(ctxType) {
18736     return this.context.length > 0 && this.context[this.context.length - 1].type === ctxType;
18737   },
18739   pushContext: function(ctxType) {
18740     this.context.push({ type: ctxType });
18741   },
18743   popContext: function() {
18744     return this.context.pop();
18745   },
18747   currentContext: function() {
18748     return this.context.length > 0 && this.context[this.context.length - 1];
18749   },
18751   getLines: function() {
18752     this._lines = state.lines;
18753     return this._lines;
18754   },
18756   setLines: function(val) {
18757     this._lines = val;
18758     state.lines = this._lines;
18759   },
18761   /*
18762    * Return the next i character without actually moving the
18763    * char pointer.
18764    */
18765   peek: function(i) {
18766     return this.input.charAt(i || 0);
18767   },
18769   /*
18770    * Move the char pointer forward i times.
18771    */
18772   skip: function(i) {
18773     i = i || 1;
18774     this.char += i;
18775     this.input = this.input.slice(i);
18776   },
18778   /*
18779    * Subscribe to a token event. The API for this method is similar
18780    * Underscore.js i.e. you can subscribe to multiple events with
18781    * one call:
18782    *
18783    *   lex.on("Identifier Number", function(data) {
18784    *     // ...
18785    *   });
18786    */
18787   on: function(names, listener) {
18788     names.split(" ").forEach(function(name) {
18789       this.emitter.on(name, listener);
18790     }.bind(this));
18791   },
18793   /*
18794    * Trigger a token event. All arguments will be passed to each
18795    * listener.
18796    */
18797   trigger: function() {
18798     this.emitter.emit.apply(this.emitter, Array.prototype.slice.call(arguments));
18799   },
18801   /*
18802    * Postpone a token event. the checking condition is set as
18803    * last parameter, and the trigger function is called in a
18804    * stored callback. To be later called using the check() function
18805    * by the parser. This avoids parser's peek() to give the lexer
18806    * a false context.
18807    */
18808   triggerAsync: function(type, args, checks, fn) {
18809     checks.push(function() {
18810       if (fn()) {
18811         this.trigger(type, args);
18812       }
18813     }.bind(this));
18814   },
18816   /*
18817    * Extract a punctuator out of the next sequence of characters
18818    * or return 'null' if its not possible.
18819    *
18820    * This method's implementation was heavily influenced by the
18821    * scanPunctuator function in the Esprima parser's source code.
18822    */
18823   scanPunctuator: function() {
18824     var ch1 = this.peek();
18825     var ch2, ch3, ch4;
18827     switch (ch1) {
18828     // Most common single-character punctuators
18829     case ".":
18830       if ((/^[0-9]$/).test(this.peek(1))) {
18831         return null;
18832       }
18833       if (this.peek(1) === "." && this.peek(2) === ".") {
18834         return {
18835           type: Token.Punctuator,
18836           value: "..."
18837         };
18838       }
18839       /* falls through */
18840     case "(":
18841     case ")":
18842     case ";":
18843     case ",":
18844     case "[":
18845     case "]":
18846     case ":":
18847     case "~":
18848     case "?":
18849       return {
18850         type: Token.Punctuator,
18851         value: ch1
18852       };
18854     // A block/object opener
18855     case "{":
18856       this.pushContext(Context.Block);
18857       return {
18858         type: Token.Punctuator,
18859         value: ch1
18860       };
18862     // A block/object closer
18863     case "}":
18864       if (this.inContext(Context.Block)) {
18865         this.popContext();
18866       }
18867       return {
18868         type: Token.Punctuator,
18869         value: ch1
18870       };
18872     // A pound sign (for Node shebangs)
18873     case "#":
18874       return {
18875         type: Token.Punctuator,
18876         value: ch1
18877       };
18879     // We're at the end of input
18880     case "":
18881       return null;
18882     }
18884     // Peek more characters
18886     ch2 = this.peek(1);
18887     ch3 = this.peek(2);
18888     ch4 = this.peek(3);
18890     // 4-character punctuator: >>>=
18892     if (ch1 === ">" && ch2 === ">" && ch3 === ">" && ch4 === "=") {
18893       return {
18894         type: Token.Punctuator,
18895         value: ">>>="
18896       };
18897     }
18899     // 3-character punctuators: === !== >>> <<= >>=
18901     if (ch1 === "=" && ch2 === "=" && ch3 === "=") {
18902       return {
18903         type: Token.Punctuator,
18904         value: "==="
18905       };
18906     }
18908     if (ch1 === "!" && ch2 === "=" && ch3 === "=") {
18909       return {
18910         type: Token.Punctuator,
18911         value: "!=="
18912       };
18913     }
18915     if (ch1 === ">" && ch2 === ">" && ch3 === ">") {
18916       return {
18917         type: Token.Punctuator,
18918         value: ">>>"
18919       };
18920     }
18922     if (ch1 === "<" && ch2 === "<" && ch3 === "=") {
18923       return {
18924         type: Token.Punctuator,
18925         value: "<<="
18926       };
18927     }
18929     if (ch1 === ">" && ch2 === ">" && ch3 === "=") {
18930       return {
18931         type: Token.Punctuator,
18932         value: ">>="
18933       };
18934     }
18936     // Fat arrow punctuator
18937     if (ch1 === "=" && ch2 === ">") {
18938       return {
18939         type: Token.Punctuator,
18940         value: ch1 + ch2
18941       };
18942     }
18944     // 2-character punctuators: <= >= == != ++ -- << >> && ||
18945     // += -= *= %= &= |= ^= /=
18946     if (ch1 === ch2 && ("+-<>&|".indexOf(ch1) >= 0)) {
18947       return {
18948         type: Token.Punctuator,
18949         value: ch1 + ch2
18950       };
18951     }
18953     if ("<>=!+-*%&|^/".indexOf(ch1) >= 0) {
18954       if (ch2 === "=") {
18955         return {
18956           type: Token.Punctuator,
18957           value: ch1 + ch2
18958         };
18959       }
18961       return {
18962         type: Token.Punctuator,
18963         value: ch1
18964       };
18965     }
18967     return null;
18968   },
18970   /*
18971    * Extract a comment out of the next sequence of characters and/or
18972    * lines or return 'null' if its not possible. Since comments can
18973    * span across multiple lines this method has to move the char
18974    * pointer.
18975    *
18976    * In addition to normal JavaScript comments (// and /*) this method
18977    * also recognizes JSHint- and JSLint-specific comments such as
18978    * /*jshint, /*jslint, /*globals and so on.
18979    */
18980   scanComments: function(checks) {
18981     var ch1 = this.peek();
18982     var ch2 = this.peek(1);
18983     var rest = this.input.substr(2);
18984     var startLine = this.line;
18985     var startChar = this.char;
18986     var self = this;
18988     // Create a comment token object and make sure it
18989     // has all the data JSHint needs to work with special
18990     // comments.
18992     function commentToken(label, body, opt) {
18993       var special = ["jshint", "jslint", "members", "member", "globals", "global", "exported"];
18994       var isSpecial = false;
18995       var value = label + body;
18996       var commentType = "plain";
18997       opt = opt || {};
18999       if (opt.isMultiline) {
19000         value += "*/";
19001       }
19003       body = body.replace(/\n/g, " ");
19005       if (label === "/*" && reg.fallsThrough.test(body)) {
19006         isSpecial = true;
19007         commentType = "falls through";
19008       }
19010       special.forEach(function(str) {
19011         if (isSpecial) {
19012           return;
19013         }
19015         // Don't recognize any special comments other than jshint for single-line
19016         // comments. This introduced many problems with legit comments.
19017         if (label === "//" && str !== "jshint") {
19018           return;
19019         }
19021         if (body.charAt(str.length) === " " && body.substr(0, str.length) === str) {
19022           isSpecial = true;
19023           label = label + str;
19024           body = body.substr(str.length);
19025         }
19027         if (!isSpecial && body.charAt(0) === " " && body.charAt(str.length + 1) === " " &&
19028           body.substr(1, str.length) === str) {
19029           isSpecial = true;
19030           label = label + " " + str;
19031           body = body.substr(str.length + 1);
19032         }
19034         // To handle rarer case when special word is separated from label by
19035         // multiple spaces or tabs
19036         var strIndex = body.indexOf(str);
19037         if (!isSpecial && strIndex >= 0 && body.charAt(strIndex + str.length) === " ") {
19038           var isAllWhitespace = body.substr(0, strIndex).trim().length === 0;
19039           if (isAllWhitespace) {
19040             isSpecial = true;
19041             body = body.substr(str.length + strIndex);
19042           }
19043         }
19045         if (!isSpecial) {
19046           return;
19047         }
19049         switch (str) {
19050         case "member":
19051           commentType = "members";
19052           break;
19053         case "global":
19054           commentType = "globals";
19055           break;
19056         default:
19057           var options = body.split(":").map(function(v) {
19058             return v.replace(/^\s+/, "").replace(/\s+$/, "");
19059           });
19061           if (options.length === 2) {
19062             switch (options[0]) {
19063             case "ignore":
19064               switch (options[1]) {
19065               case "start":
19066                 self.ignoringLinterErrors = true;
19067                 isSpecial = false;
19068                 break;
19069               case "end":
19070                 self.ignoringLinterErrors = false;
19071                 isSpecial = false;
19072                 break;
19073               }
19074             }
19075           }
19077           commentType = str;
19078         }
19079       });
19081       return {
19082         type: Token.Comment,
19083         commentType: commentType,
19084         value: value,
19085         body: body,
19086         isSpecial: isSpecial,
19087         isMalformed: opt.isMalformed || false
19088       };
19089     }
19091     // End of unbegun comment. Raise an error and skip that input.
19092     if (ch1 === "*" && ch2 === "/") {
19093       this.trigger("error", {
19094         code: "E018",
19095         line: startLine,
19096         character: startChar
19097       });
19099       this.skip(2);
19100       return null;
19101     }
19103     // Comments must start either with // or /*
19104     if (ch1 !== "/" || (ch2 !== "*" && ch2 !== "/")) {
19105       return null;
19106     }
19108     // One-line comment
19109     if (ch2 === "/") {
19110       this.skip(this.input.length); // Skip to the EOL.
19111       return commentToken("//", rest);
19112     }
19114     var body = "";
19116     /* Multi-line comment */
19117     if (ch2 === "*") {
19118       this.inComment = true;
19119       this.skip(2);
19121       while (this.peek() !== "*" || this.peek(1) !== "/") {
19122         if (this.peek() === "") { // End of Line
19123           body += "\n";
19125           // If we hit EOF and our comment is still unclosed,
19126           // trigger an error and end the comment implicitly.
19127           if (!this.nextLine(checks)) {
19128             this.trigger("error", {
19129               code: "E017",
19130               line: startLine,
19131               character: startChar
19132             });
19134             this.inComment = false;
19135             return commentToken("/*", body, {
19136               isMultiline: true,
19137               isMalformed: true
19138             });
19139           }
19140         } else {
19141           body += this.peek();
19142           this.skip();
19143         }
19144       }
19146       this.skip(2);
19147       this.inComment = false;
19148       return commentToken("/*", body, { isMultiline: true });
19149     }
19150   },
19152   /*
19153    * Extract a keyword out of the next sequence of characters or
19154    * return 'null' if its not possible.
19155    */
19156   scanKeyword: function() {
19157     var result = /^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input);
19158     var keywords = [
19159       "if", "in", "do", "var", "for", "new",
19160       "try", "let", "this", "else", "case",
19161       "void", "with", "enum", "while", "break",
19162       "catch", "throw", "const", "yield", "class",
19163       "super", "return", "typeof", "delete",
19164       "switch", "export", "import", "default",
19165       "finally", "extends", "function", "continue",
19166       "debugger", "instanceof", "true", "false", "null"
19167     ];
19169     if (result && keywords.indexOf(result[0]) >= 0) {
19170       return {
19171         type: Token.Keyword,
19172         value: result[0]
19173       };
19174     }
19176     return null;
19177   },
19179   /*
19180    * Extract a JavaScript identifier out of the next sequence of
19181    * characters or return 'null' if its not possible.
19182    */
19183   scanIdentifier: function(checks) {
19184     var id = "";
19185     var index = 0;
19186     var char, value;
19188     function isNonAsciiIdentifierStart(code) {
19189       return nonAsciiIdentifierStartTable.indexOf(code) > -1;
19190     }
19192     function isNonAsciiIdentifierPart(code) {
19193       return isNonAsciiIdentifierStart(code) || nonAsciiIdentifierPartTable.indexOf(code) > -1;
19194     }
19196     var readUnicodeEscapeSequence = function() {
19197       /*jshint validthis:true */
19198       index += 1;
19200       if (this.peek(index) !== "u") {
19201         return null;
19202       }
19204       var sequence = this.peek(index + 1) + this.peek(index + 2) +
19205         this.peek(index + 3) + this.peek(index + 4);
19206       var code;
19208       if (isHex(sequence)) {
19209         code = parseInt(sequence, 16);
19211         if (asciiIdentifierPartTable[code] || isNonAsciiIdentifierPart(code)) {
19212           index += 5;
19213           return "\\u" + sequence;
19214         }
19216         return null;
19217       }
19219       return null;
19220     }.bind(this);
19222     var getIdentifierStart = function() {
19223       /*jshint validthis:true */
19224       var chr = this.peek(index);
19225       var code = chr.charCodeAt(0);
19227       if (code === 92) {
19228         return readUnicodeEscapeSequence();
19229       }
19231       if (code < 128) {
19232         if (asciiIdentifierStartTable[code]) {
19233           index += 1;
19234           return chr;
19235         }
19237         return null;
19238       }
19240       if (isNonAsciiIdentifierStart(code)) {
19241         index += 1;
19242         return chr;
19243       }
19245       return null;
19246     }.bind(this);
19248     var getIdentifierPart = function() {
19249       /*jshint validthis:true */
19250       var chr = this.peek(index);
19251       var code = chr.charCodeAt(0);
19253       if (code === 92) {
19254         return readUnicodeEscapeSequence();
19255       }
19257       if (code < 128) {
19258         if (asciiIdentifierPartTable[code]) {
19259           index += 1;
19260           return chr;
19261         }
19263         return null;
19264       }
19266       if (isNonAsciiIdentifierPart(code)) {
19267         index += 1;
19268         return chr;
19269       }
19271       return null;
19272     }.bind(this);
19274     function removeEscapeSequences(id) {
19275       return id.replace(/\\u([0-9a-fA-F]{4})/g, function(m0, codepoint) {
19276         return String.fromCharCode(parseInt(codepoint, 16));
19277       });
19278     }
19280     char = getIdentifierStart();
19281     if (char === null) {
19282       return null;
19283     }
19285     id = char;
19286     for (;;) {
19287       char = getIdentifierPart();
19289       if (char === null) {
19290         break;
19291       }
19293       id += char;
19294     }
19296     value = removeEscapeSequences(id);
19298     if (!state.inES6(true)) {
19299       es5IdentifierNames = require("../data/es5-identifier-names.js");
19301       if (!es5IdentifierNames.test(value)) {
19302         this.triggerAsync(
19303           "warning",
19304           {
19305             code: "W119",
19306             line: this.line,
19307             character: this.char,
19308             data: ["unicode 8", "6"]
19309           },
19310           checks,
19311           function() { return true; }
19312         );
19313       }
19314     }
19316     return {
19317       type: Token.Identifier,
19318       value: value,
19319       text: id,
19320       tokenLength: id.length
19321     };
19322   },
19324   /*
19325    * Extract a numeric literal out of the next sequence of
19326    * characters or return 'null' if its not possible. This method
19327    * supports all numeric literals described in section 7.8.3
19328    * of the EcmaScript 5 specification.
19329    *
19330    * This method's implementation was heavily influenced by the
19331    * scanNumericLiteral function in the Esprima parser's source code.
19332    */
19333   scanNumericLiteral: function(checks) {
19334     var index = 0;
19335     var value = "";
19336     var length = this.input.length;
19337     var char = this.peek(index);
19338     var isAllowedDigit = isDecimalDigit;
19339     var base = 10;
19340     var isLegacy = false;
19342     function isDecimalDigit(str) {
19343       return (/^[0-9]$/).test(str);
19344     }
19346     function isOctalDigit(str) {
19347       return (/^[0-7]$/).test(str);
19348     }
19350     function isBinaryDigit(str) {
19351       return (/^[01]$/).test(str);
19352     }
19354     function isIdentifierStart(ch) {
19355       return (ch === "$") || (ch === "_") || (ch === "\\") ||
19356         (ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z");
19357     }
19359     // Numbers must start either with a decimal digit or a point.
19361     if (char !== "." && !isDecimalDigit(char)) {
19362       return null;
19363     }
19365     if (char !== ".") {
19366       value = this.peek(index);
19367       index += 1;
19368       char = this.peek(index);
19370       if (value === "0") {
19371         // Base-16 numbers.
19372         if (char === "x" || char === "X") {
19373           isAllowedDigit = isHexDigit;
19374           base = 16;
19376           index += 1;
19377           value += char;
19378         }
19380         // Base-8 numbers.
19381         if (char === "o" || char === "O") {
19382           isAllowedDigit = isOctalDigit;
19383           base = 8;
19385           if (!state.inES6(true)) {
19386             this.triggerAsync(
19387               "warning",
19388               {
19389                 code: "W119",
19390                 line: this.line,
19391                 character: this.char,
19392                 data: [ "Octal integer literal", "6" ]
19393               },
19394               checks,
19395               function() { return true; }
19396             );
19397           }
19399           index += 1;
19400           value += char;
19401         }
19403         // Base-2 numbers.
19404         if (char === "b" || char === "B") {
19405           isAllowedDigit = isBinaryDigit;
19406           base = 2;
19408           if (!state.inES6(true)) {
19409             this.triggerAsync(
19410               "warning",
19411               {
19412                 code: "W119",
19413                 line: this.line,
19414                 character: this.char,
19415                 data: [ "Binary integer literal", "6" ]
19416               },
19417               checks,
19418               function() { return true; }
19419             );
19420           }
19422           index += 1;
19423           value += char;
19424         }
19426         // Legacy base-8 numbers.
19427         if (isOctalDigit(char)) {
19428           isAllowedDigit = isOctalDigit;
19429           base = 8;
19430           isLegacy = true;
19432           index += 1;
19433           value += char;
19434         }
19436         // Decimal numbers that start with '0' such as '09' are illegal
19437         // but we still parse them and return as malformed.
19439         if (!isOctalDigit(char) && isDecimalDigit(char)) {
19440           index += 1;
19441           value += char;
19442         }
19443       }
19445       while (index < length) {
19446         char = this.peek(index);
19448         // Numbers like '019' (note the 9) are not valid octals
19449         // but we still parse them and mark as malformed.
19450         if (!(isLegacy && isDecimalDigit(char)) && !isAllowedDigit(char)) {
19451           break;
19452         }
19453         value += char;
19454         index += 1;
19455       }
19457       if (isAllowedDigit !== isDecimalDigit) {
19458         if (!isLegacy && value.length <= 2) { // 0x
19459           return {
19460             type: Token.NumericLiteral,
19461             value: value,
19462             isMalformed: true
19463           };
19464         }
19466         if (index < length) {
19467           char = this.peek(index);
19468           if (isIdentifierStart(char)) {
19469             return null;
19470           }
19471         }
19473         return {
19474           type: Token.NumericLiteral,
19475           value: value,
19476           base: base,
19477           isLegacy: isLegacy,
19478           isMalformed: false
19479         };
19480       }
19481     }
19483     // Decimal digits.
19485     if (char === ".") {
19486       value += char;
19487       index += 1;
19489       while (index < length) {
19490         char = this.peek(index);
19491         if (!isDecimalDigit(char)) {
19492           break;
19493         }
19494         value += char;
19495         index += 1;
19496       }
19497     }
19499     // Exponent part.
19501     if (char === "e" || char === "E") {
19502       value += char;
19503       index += 1;
19504       char = this.peek(index);
19506       if (char === "+" || char === "-") {
19507         value += this.peek(index);
19508         index += 1;
19509       }
19511       char = this.peek(index);
19512       if (isDecimalDigit(char)) {
19513         value += char;
19514         index += 1;
19516         while (index < length) {
19517           char = this.peek(index);
19518           if (!isDecimalDigit(char)) {
19519             break;
19520           }
19521           value += char;
19522           index += 1;
19523         }
19524       } else {
19525         return null;
19526       }
19527     }
19529     if (index < length) {
19530       char = this.peek(index);
19531       if (isIdentifierStart(char)) {
19532         return null;
19533       }
19534     }
19536     return {
19537       type: Token.NumericLiteral,
19538       value: value,
19539       base: base,
19540       isMalformed: !isFinite(value)
19541     };
19542   },
19545   // Assumes previously parsed character was \ (=== '\\') and was not skipped.
19546   scanEscapeSequence: function(checks) {
19547     var allowNewLine = false;
19548     var jump = 1;
19549     this.skip();
19550     var char = this.peek();
19552     switch (char) {
19553     case "'":
19554       this.triggerAsync("warning", {
19555         code: "W114",
19556         line: this.line,
19557         character: this.char,
19558         data: [ "\\'" ]
19559       }, checks, function() {return state.jsonMode; });
19560       break;
19561     case "b":
19562       char = "\\b";
19563       break;
19564     case "f":
19565       char = "\\f";
19566       break;
19567     case "n":
19568       char = "\\n";
19569       break;
19570     case "r":
19571       char = "\\r";
19572       break;
19573     case "t":
19574       char = "\\t";
19575       break;
19576     case "0":
19577       char = "\\0";
19579       // Octal literals fail in strict mode.
19580       // Check if the number is between 00 and 07.
19581       var n = parseInt(this.peek(1), 10);
19582       this.triggerAsync("warning", {
19583         code: "W115",
19584         line: this.line,
19585         character: this.char
19586       }, checks,
19587       function() { return n >= 0 && n <= 7 && state.isStrict(); });
19588       break;
19589     case "1":
19590     case "2":
19591     case "3":
19592     case "4":
19593     case "5":
19594     case "6":
19595     case "7":
19596       char = "\\" + char;
19597       this.triggerAsync("warning", {
19598         code: "W115",
19599         line: this.line,
19600         character: this.char
19601       }, checks,
19602       function() { return state.isStrict(); });
19603       break;
19604     case "u":
19605       var sequence = this.input.substr(1, 4);
19606       var code = parseInt(sequence, 16);
19607       if (!isHex(sequence)) {
19608         // This condition unequivocally describes a syntax error.
19609         // TODO: Re-factor as an "error" (not a "warning").
19610         this.trigger("warning", {
19611           code: "W052",
19612           line: this.line,
19613           character: this.char,
19614           data: [ "u" + sequence ]
19615         });
19616       }
19617       char = String.fromCharCode(code);
19618       jump = 5;
19619       break;
19620     case "v":
19621       this.triggerAsync("warning", {
19622         code: "W114",
19623         line: this.line,
19624         character: this.char,
19625         data: [ "\\v" ]
19626       }, checks, function() { return state.jsonMode; });
19628       char = "\v";
19629       break;
19630     case "x":
19631       var  x = parseInt(this.input.substr(1, 2), 16);
19633       this.triggerAsync("warning", {
19634         code: "W114",
19635         line: this.line,
19636         character: this.char,
19637         data: [ "\\x-" ]
19638       }, checks, function() { return state.jsonMode; });
19640       char = String.fromCharCode(x);
19641       jump = 3;
19642       break;
19643     case "\\":
19644       char = "\\\\";
19645       break;
19646     case "\"":
19647       char = "\\\"";
19648       break;
19649     case "/":
19650       break;
19651     case "":
19652       allowNewLine = true;
19653       char = "";
19654       break;
19655     }
19657     return { char: char, jump: jump, allowNewLine: allowNewLine };
19658   },
19660   /*
19661    * Extract a template literal out of the next sequence of characters
19662    * and/or lines or return 'null' if its not possible. Since template
19663    * literals can span across multiple lines, this method has to move
19664    * the char pointer.
19665    */
19666   scanTemplateLiteral: function(checks) {
19667     var tokenType;
19668     var value = "";
19669     var ch;
19670     var startLine = this.line;
19671     var startChar = this.char;
19672     var depth = this.templateStarts.length;
19674     if (this.peek() === "`") {
19675       if (!state.inES6(true)) {
19676         this.triggerAsync(
19677           "warning",
19678           {
19679             code: "W119",
19680             line: this.line,
19681             character: this.char,
19682             data: ["template literal syntax", "6"]
19683           },
19684           checks,
19685           function() { return true; }
19686         );
19687       }
19688       // Template must start with a backtick.
19689       tokenType = Token.TemplateHead;
19690       this.templateStarts.push({ line: this.line, char: this.char });
19691       depth = this.templateStarts.length;
19692       this.skip(1);
19693       this.pushContext(Context.Template);
19694     } else if (this.inContext(Context.Template) && this.peek() === "}") {
19695       // If we're in a template context, and we have a '}', lex a TemplateMiddle.
19696       tokenType = Token.TemplateMiddle;
19697     } else {
19698       // Go lex something else.
19699       return null;
19700     }
19702     while (this.peek() !== "`") {
19703       while ((ch = this.peek()) === "") {
19704         value += "\n";
19705         if (!this.nextLine(checks)) {
19706           // Unclosed template literal --- point to the starting "`"
19707           var startPos = this.templateStarts.pop();
19708           this.trigger("error", {
19709             code: "E052",
19710             line: startPos.line,
19711             character: startPos.char
19712           });
19713           return {
19714             type: tokenType,
19715             value: value,
19716             startLine: startLine,
19717             startChar: startChar,
19718             isUnclosed: true,
19719             depth: depth,
19720             context: this.popContext()
19721           };
19722         }
19723       }
19725       if (ch === '$' && this.peek(1) === '{') {
19726         value += '${';
19727         this.skip(2);
19728         return {
19729           type: tokenType,
19730           value: value,
19731           startLine: startLine,
19732           startChar: startChar,
19733           isUnclosed: false,
19734           depth: depth,
19735           context: this.currentContext()
19736         };
19737       } else if (ch === '\\') {
19738         var escape = this.scanEscapeSequence(checks);
19739         value += escape.char;
19740         this.skip(escape.jump);
19741       } else if (ch !== '`') {
19742         // Otherwise, append the value and continue.
19743         value += ch;
19744         this.skip(1);
19745       }
19746     }
19748     // Final value is either NoSubstTemplate or TemplateTail
19749     tokenType = tokenType === Token.TemplateHead ? Token.NoSubstTemplate : Token.TemplateTail;
19750     this.skip(1);
19751     this.templateStarts.pop();
19753     return {
19754       type: tokenType,
19755       value: value,
19756       startLine: startLine,
19757       startChar: startChar,
19758       isUnclosed: false,
19759       depth: depth,
19760       context: this.popContext()
19761     };
19762   },
19764   /*
19765    * Extract a string out of the next sequence of characters and/or
19766    * lines or return 'null' if its not possible. Since strings can
19767    * span across multiple lines this method has to move the char
19768    * pointer.
19769    *
19770    * This method recognizes pseudo-multiline JavaScript strings:
19771    *
19772    *   var str = "hello\
19773    *   world";
19774    */
19775   scanStringLiteral: function(checks) {
19776     /*jshint loopfunc:true */
19777     var quote = this.peek();
19779     // String must start with a quote.
19780     if (quote !== "\"" && quote !== "'") {
19781       return null;
19782     }
19784     // In JSON strings must always use double quotes.
19785     this.triggerAsync("warning", {
19786       code: "W108",
19787       line: this.line,
19788       character: this.char // +1?
19789     }, checks, function() { return state.jsonMode && quote !== "\""; });
19791     var value = "";
19792     var startLine = this.line;
19793     var startChar = this.char;
19794     var allowNewLine = false;
19796     this.skip();
19798     while (this.peek() !== quote) {
19799       if (this.peek() === "") { // End Of Line
19801         // If an EOL is not preceded by a backslash, show a warning
19802         // and proceed like it was a legit multi-line string where
19803         // author simply forgot to escape the newline symbol.
19804         //
19805         // Another approach is to implicitly close a string on EOL
19806         // but it generates too many false positives.
19808         if (!allowNewLine) {
19809           // This condition unequivocally describes a syntax error.
19810           // TODO: Emit error E029 and remove W112.
19811           this.trigger("warning", {
19812             code: "W112",
19813             line: this.line,
19814             character: this.char
19815           });
19816         } else {
19817           allowNewLine = false;
19819           // Otherwise show a warning if multistr option was not set.
19820           // For JSON, show warning no matter what.
19822           this.triggerAsync("warning", {
19823             code: "W043",
19824             line: this.line,
19825             character: this.char
19826           }, checks, function() { return !state.option.multistr; });
19828           this.triggerAsync("warning", {
19829             code: "W042",
19830             line: this.line,
19831             character: this.char
19832           }, checks, function() { return state.jsonMode && state.option.multistr; });
19833         }
19835         // If we get an EOF inside of an unclosed string, show an
19836         // error and implicitly close it at the EOF point.
19838         if (!this.nextLine(checks)) {
19839           return {
19840             type: Token.StringLiteral,
19841             value: value,
19842             startLine: startLine,
19843             startChar: startChar,
19844             isUnclosed: true,
19845             quote: quote
19846           };
19847         }
19849       } else { // Any character other than End Of Line
19851         allowNewLine = false;
19852         var char = this.peek();
19853         var jump = 1; // A length of a jump, after we're done
19854                       // parsing this character.
19856         if (char < " ") {
19857           // Warn about a control character in a string.
19858           this.triggerAsync(
19859             "warning",
19860             {
19861               code: "W113",
19862               line: this.line,
19863               character: this.char,
19864               data: [ "<non-printable>" ]
19865             },
19866             checks,
19867             function() { return true; }
19868           );
19869         }
19871         // Special treatment for some escaped characters.
19872         if (char === "\\") {
19873           var parsed = this.scanEscapeSequence(checks);
19874           char = parsed.char;
19875           jump = parsed.jump;
19876           allowNewLine = parsed.allowNewLine;
19877         }
19879         // If char is the empty string, end of the line has been reached. In
19880         // this case, `this.char` should not be incremented so that warnings
19881         // and errors reported in the subsequent loop iteration have the
19882         // correct character column offset.
19883         if (char !== "") {
19884           value += char;
19885           this.skip(jump);
19886         }
19887       }
19888     }
19890     this.skip();
19891     return {
19892       type: Token.StringLiteral,
19893       value: value,
19894       startLine: startLine,
19895       startChar: startChar,
19896       isUnclosed: false,
19897       quote: quote
19898     };
19899   },
19901   /*
19902    * Extract a regular expression out of the next sequence of
19903    * characters and/or lines or return 'null' if its not possible.
19904    *
19905    * This method is platform dependent: it accepts almost any
19906    * regular expression values but then tries to compile and run
19907    * them using system's RegExp object. This means that there are
19908    * rare edge cases where one JavaScript engine complains about
19909    * your regular expression while others don't.
19910    */
19911   scanRegExp: function(checks) {
19912     var index = 0;
19913     var length = this.input.length;
19914     var char = this.peek();
19915     var value = char;
19916     var body = "";
19917     var flags = [];
19918     var malformed = false;
19919     var isCharSet = false;
19920     var terminated, malformedDesc;
19922     var scanUnexpectedChars = function() {
19923       // Unexpected control character
19924       if (char < " ") {
19925         malformed = true;
19926         this.triggerAsync(
19927           "warning",
19928           {
19929             code: "W048",
19930             line: this.line,
19931             character: this.char
19932           },
19933           checks,
19934           function() { return true; }
19935         );
19936       }
19938       // Unexpected escaped character
19939       if (char === "<") {
19940         malformed = true;
19941         this.triggerAsync(
19942           "warning",
19943           {
19944             code: "W049",
19945             line: this.line,
19946             character: this.char,
19947             data: [ char ]
19948           },
19949           checks,
19950           function() { return true; }
19951         );
19952       }
19953     }.bind(this);
19955     // Regular expressions must start with '/'
19956     if (!this.prereg || char !== "/") {
19957       return null;
19958     }
19960     index += 1;
19961     terminated = false;
19963     // Try to get everything in between slashes. A couple of
19964     // cases aside (see scanUnexpectedChars) we don't really
19965     // care whether the resulting expression is valid or not.
19966     // We will check that later using the RegExp object.
19968     while (index < length) {
19969       char = this.peek(index);
19970       value += char;
19971       body += char;
19973       if (isCharSet) {
19974         if (char === "]") {
19975           if (this.peek(index - 1) !== "\\" || this.peek(index - 2) === "\\") {
19976             isCharSet = false;
19977           }
19978         }
19980         if (char === "\\") {
19981           index += 1;
19982           char = this.peek(index);
19983           body += char;
19984           value += char;
19986           scanUnexpectedChars();
19987         }
19989         index += 1;
19990         continue;
19991       }
19993       if (char === "\\") {
19994         index += 1;
19995         char = this.peek(index);
19996         body += char;
19997         value += char;
19999         scanUnexpectedChars();
20001         if (char === "/") {
20002           index += 1;
20003           continue;
20004         }
20006         if (char === "[") {
20007           index += 1;
20008           continue;
20009         }
20010       }
20012       if (char === "[") {
20013         isCharSet = true;
20014         index += 1;
20015         continue;
20016       }
20018       if (char === "/") {
20019         body = body.substr(0, body.length - 1);
20020         terminated = true;
20021         index += 1;
20022         break;
20023       }
20025       index += 1;
20026     }
20028     // A regular expression that was never closed is an
20029     // error from which we cannot recover.
20031     if (!terminated) {
20032       this.trigger("error", {
20033         code: "E015",
20034         line: this.line,
20035         character: this.from
20036       });
20038       return void this.trigger("fatal", {
20039         line: this.line,
20040         from: this.from
20041       });
20042     }
20044     // Parse flags (if any).
20046     while (index < length) {
20047       char = this.peek(index);
20048       if (!/[gimy]/.test(char)) {
20049         break;
20050       }
20051       if (char === "y") {
20052         if (!state.inES6(true)) {
20053           this.triggerAsync(
20054             "warning",
20055             {
20056               code: "W119",
20057               line: this.line,
20058               character: this.char,
20059               data: [ "Sticky RegExp flag", "6" ]
20060             },
20061             checks,
20062             function() { return true; }
20063           );
20064         }
20065         if (value.indexOf("y") > -1) {
20066           malformedDesc = "Duplicate RegExp flag";
20067         }
20068       } else {
20069         flags.push(char);
20070       }
20071       value += char;
20072       index += 1;
20073     }
20075     // Check regular expression for correctness.
20077     try {
20078       new RegExp(body, flags.join(""));
20079     } catch (err) {
20080       /**
20081        * Because JSHint relies on the current engine's RegExp parser to
20082        * validate RegExp literals, the description (exposed as the "data"
20083        * property on the error object) is platform dependent.
20084        */
20085       malformedDesc = err.message;
20086     }
20088     if (malformedDesc) {
20089       malformed = true;
20090       this.trigger("error", {
20091         code: "E016",
20092         line: this.line,
20093         character: this.char,
20094         data: [ malformedDesc ]
20095       });
20096     }
20098     return {
20099       type: Token.RegExp,
20100       value: value,
20101       isMalformed: malformed
20102     };
20103   },
20105   /*
20106    * Scan for any occurrence of non-breaking spaces. Non-breaking spaces
20107    * can be mistakenly typed on OS X with option-space. Non UTF-8 web
20108    * pages with non-breaking pages produce syntax errors.
20109    */
20110   scanNonBreakingSpaces: function() {
20111     return state.option.nonbsp ?
20112       this.input.search(/(\u00A0)/) : -1;
20113   },
20115   /*
20116    * Produce the next raw token or return 'null' if no tokens can be matched.
20117    * This method skips over all space characters.
20118    */
20119   next: function(checks) {
20120     this.from = this.char;
20122     // Move to the next non-space character.
20123     while (reg.whitespace.test(this.peek())) {
20124       this.from += 1;
20125       this.skip();
20126     }
20128     // Methods that work with multi-line structures and move the
20129     // character pointer.
20131     var match = this.scanComments(checks) ||
20132       this.scanStringLiteral(checks) ||
20133       this.scanTemplateLiteral(checks);
20135     if (match) {
20136       return match;
20137     }
20139     // Methods that don't move the character pointer.
20141     match =
20142       this.scanRegExp(checks) ||
20143       this.scanPunctuator() ||
20144       this.scanKeyword() ||
20145       this.scanIdentifier(checks) ||
20146       this.scanNumericLiteral(checks);
20148     if (match) {
20149       this.skip(match.tokenLength || match.value.length);
20150       return match;
20151     }
20153     // No token could be matched, give up.
20155     return null;
20156   },
20158   /*
20159    * Switch to the next line and reset all char pointers. Once
20160    * switched, this method also checks for other minor warnings.
20161    */
20162   nextLine: function(checks) {
20163     var char;
20165     if (this.line >= this.getLines().length) {
20166       return false;
20167     }
20169     this.input = this.getLines()[this.line];
20170     this.line += 1;
20171     this.char = 1;
20172     this.from = 1;
20174     var inputTrimmed = this.input.trim();
20176     var startsWith = function() {
20177       return _.some(arguments, function(prefix) {
20178         return inputTrimmed.indexOf(prefix) === 0;
20179       });
20180     };
20182     var endsWith = function() {
20183       return _.some(arguments, function(suffix) {
20184         return inputTrimmed.indexOf(suffix, inputTrimmed.length - suffix.length) !== -1;
20185       });
20186     };
20188     // If we are ignoring linter errors, replace the input with empty string
20189     // if it doesn't already at least start or end a multi-line comment
20190     if (this.ignoringLinterErrors === true) {
20191       if (!startsWith("/*", "//") && !(this.inComment && endsWith("*/"))) {
20192         this.input = "";
20193       }
20194     }
20196     char = this.scanNonBreakingSpaces();
20197     if (char >= 0) {
20198       this.triggerAsync(
20199         "warning",
20200         { code: "W125", line: this.line, character: char + 1 },
20201         checks,
20202         function() { return true; }
20203       );
20204     }
20206     this.input = this.input.replace(/\t/g, state.tab);
20208     // If there is a limit on line length, warn when lines get too
20209     // long.
20211     if (!this.ignoringLinterErrors && state.option.maxlen &&
20212       state.option.maxlen < this.input.length) {
20213       var inComment = this.inComment ||
20214         startsWith.call(inputTrimmed, "//") ||
20215         startsWith.call(inputTrimmed, "/*");
20217       var shouldTriggerError = !inComment || !reg.maxlenException.test(inputTrimmed);
20219       if (shouldTriggerError) {
20220         this.triggerAsync(
20221           "warning",
20222           { code: "W101", line: this.line, character: this.input.length },
20223           checks,
20224           function() { return true; }
20225         );
20226       }
20227     }
20229     return true;
20230   },
20232   /*
20233    * Produce the next token. This function is called by advance() to get
20234    * the next token. It returns a token in a JSLint-compatible format.
20235    */
20236   token: function() {
20237     /*jshint loopfunc:true */
20238     var checks = asyncTrigger();
20239     var token;
20242     function isReserved(token, isProperty) {
20243       // At present all current identifiers have reserved set.
20244       // Preserving check anyway, for future-proofing.
20245       /* istanbul ignore if */
20246       if (!token.reserved) {
20247         return false;
20248       }
20249       var meta = token.meta;
20251       if (meta && meta.isFutureReservedWord && state.inES5()) {
20252         // ES3 FutureReservedWord in an ES5 environment.
20253         if (!meta.es5) {
20254           return false;
20255         }
20257         // Some ES5 FutureReservedWord identifiers are active only
20258         // within a strict mode environment.
20259         if (meta.strictOnly) {
20260           if (!state.option.strict && !state.isStrict()) {
20261             return false;
20262           }
20263         }
20265         if (isProperty) {
20266           return false;
20267         }
20268       }
20270       return true;
20271     }
20273     // Produce a token object.
20274     var create = function(type, value, isProperty, token) {
20275       /*jshint validthis:true */
20276       var obj;
20278       if (type !== "(endline)" && type !== "(end)") {
20279         this.prereg = false;
20280       }
20282       if (type === "(punctuator)") {
20283         switch (value) {
20284         case ".":
20285         case ")":
20286         case "~":
20287         case "#":
20288         case "]":
20289         case "}":
20290         case "++":
20291         case "--":
20292           this.prereg = false;
20293           break;
20294         default:
20295           this.prereg = true;
20296         }
20298         obj = Object.create(state.syntax[value] || state.syntax["(error)"]);
20299       }
20301       if (type === "(identifier)") {
20302         if (value === "return" || value === "case" || value === "yield" ||
20303             value === "typeof" || value === "instanceof" || value === "void") {
20304           this.prereg = true;
20305         }
20307         if (_.has(state.syntax, value)) {
20308           obj = Object.create(state.syntax[value]);
20309           // If this can't be a reserved keyword, reset the object.
20310           if (!isReserved(obj, isProperty && type === "(identifier)")) {
20311             obj = null;
20312           }
20313         }
20314       }
20316       if (type === "(template)" || type === "(template middle)") {
20317         this.prereg = true;
20318       }
20320       if (!obj) {
20321         obj = Object.create(state.syntax[type]);
20322       }
20324       obj.identifier = (type === "(identifier)");
20325       obj.type = obj.type || type;
20326       obj.value = value;
20327       obj.line = this.line;
20328       obj.character = this.char;
20329       obj.from = this.from;
20330       if (obj.identifier && token) obj.raw_text = token.text || token.value;
20331       if (token && token.startLine && token.startLine !== this.line) {
20332         obj.startLine = token.startLine;
20333       }
20334       if (token && token.context) {
20335         // Context of current token
20336         obj.context = token.context;
20337       }
20338       if (token && token.depth) {
20339         // Nested template depth
20340         obj.depth = token.depth;
20341       }
20342       if (token && token.isUnclosed) {
20343         // Mark token as unclosed string / template literal
20344         obj.isUnclosed = token.isUnclosed;
20345       }
20347       if (isProperty && obj.identifier) {
20348         obj.isProperty = isProperty;
20349       }
20351       obj.check = checks.check;
20353       return obj;
20354     }.bind(this);
20356     for (;;) {
20357       if (!this.input.length) {
20358         if (this.nextLine(checks)) {
20359           return create("(endline)", "");
20360         }
20362         if (this.exhausted) {
20363           return null;
20364         }
20366         this.exhausted = true;
20367         return create("(end)", "");
20368       }
20370       token = this.next(checks);
20372       if (!token) {
20373         if (this.input.length) {
20374           // Unexpected character.
20375           this.trigger("error", {
20376             code: "E024",
20377             line: this.line,
20378             character: this.char,
20379             data: [ this.peek() ]
20380           });
20382           this.input = "";
20383         }
20385         continue;
20386       }
20388       switch (token.type) {
20389       case Token.StringLiteral:
20390         this.triggerAsync("String", {
20391           line: this.line,
20392           char: this.char,
20393           from: this.from,
20394           startLine: token.startLine,
20395           startChar: token.startChar,
20396           value: token.value,
20397           quote: token.quote
20398         }, checks, function() { return true; });
20400         return create("(string)", token.value, null, token);
20402       case Token.TemplateHead:
20403         this.trigger("TemplateHead", {
20404           line: this.line,
20405           char: this.char,
20406           from: this.from,
20407           startLine: token.startLine,
20408           startChar: token.startChar,
20409           value: token.value
20410         });
20411         return create("(template)", token.value, null, token);
20413       case Token.TemplateMiddle:
20414         this.trigger("TemplateMiddle", {
20415           line: this.line,
20416           char: this.char,
20417           from: this.from,
20418           startLine: token.startLine,
20419           startChar: token.startChar,
20420           value: token.value
20421         });
20422         return create("(template middle)", token.value, null, token);
20424       case Token.TemplateTail:
20425         this.trigger("TemplateTail", {
20426           line: this.line,
20427           char: this.char,
20428           from: this.from,
20429           startLine: token.startLine,
20430           startChar: token.startChar,
20431           value: token.value
20432         });
20433         return create("(template tail)", token.value, null, token);
20435       case Token.NoSubstTemplate:
20436         this.trigger("NoSubstTemplate", {
20437           line: this.line,
20438           char: this.char,
20439           from: this.from,
20440           startLine: token.startLine,
20441           startChar: token.startChar,
20442           value: token.value
20443         });
20444         return create("(no subst template)", token.value, null, token);
20446       case Token.Identifier:
20447         this.triggerAsync("Identifier", {
20448           line: this.line,
20449           char: this.char,
20450           from: this.from,
20451           name: token.value,
20452           raw_name: token.text,
20453           isProperty: state.tokens.curr.id === "."
20454         }, checks, function() { return true; });
20456         /* falls through */
20457       case Token.Keyword:
20458         return create("(identifier)", token.value, state.tokens.curr.id === ".", token);
20460       case Token.NumericLiteral:
20461         if (token.isMalformed) {
20462           // This condition unequivocally describes a syntax error.
20463           // TODO: Re-factor as an "error" (not a "warning").
20464           this.trigger("warning", {
20465             code: "W045",
20466             line: this.line,
20467             character: this.char,
20468             data: [ token.value ]
20469           });
20470         }
20472         this.triggerAsync("warning", {
20473           code: "W114",
20474           line: this.line,
20475           character: this.char,
20476           data: [ "0x-" ]
20477         }, checks, function() { return token.base === 16 && state.jsonMode; });
20479         this.triggerAsync("warning", {
20480           code: "W115",
20481           line: this.line,
20482           character: this.char
20483         }, checks, function() {
20484           return state.isStrict() && token.base === 8 && token.isLegacy;
20485         });
20487         this.trigger("Number", {
20488           line: this.line,
20489           char: this.char,
20490           from: this.from,
20491           value: token.value,
20492           base: token.base,
20493           isMalformed: token.isMalformed
20494         });
20496         return create("(number)", token.value);
20498       case Token.RegExp:
20499         return create("(regexp)", token.value);
20501       case Token.Comment:
20502         if (token.isSpecial) {
20503           return {
20504             id: '(comment)',
20505             value: token.value,
20506             body: token.body,
20507             type: token.commentType,
20508             isSpecial: token.isSpecial,
20509             line: this.line,
20510             character: this.char,
20511             from: this.from
20512           };
20513         }
20515         break;
20517       default:
20518         return create("(punctuator)", token.value);
20519       }
20520     }
20521   }
20524 exports.Lexer = Lexer;
20525 exports.Context = Context;
20527 },{"../data/ascii-identifier-data.js":1,"../data/es5-identifier-names.js":2,"../data/non-ascii-identifier-part-only.js":3,"../data/non-ascii-identifier-start.js":4,"./reg.js":18,"./state.js":20,"events":6,"lodash":13}],15:[function(require,module,exports){
20528 "use strict";
20530 var _ = require("lodash");
20532 var errors = {
20533   // JSHint options
20534   E001: "Bad option: '{a}'.",
20535   E002: "Bad option value.",
20537   // JSHint input
20538   E003: "Expected a JSON value.",
20539   E004: "Input is neither a string nor an array of strings.",
20540   E005: "Input is empty.",
20541   E006: "Unexpected early end of program.",
20543   // Strict mode
20544   E007: "Missing \"use strict\" statement.",
20545   E008: "Strict violation.",
20546   E009: "Option 'validthis' can't be used in a global scope.",
20547   E010: "'with' is not allowed in strict mode.",
20549   // Constants
20550   E011: "'{a}' has already been declared.",
20551   E012: "const '{a}' is initialized to 'undefined'.",
20552   E013: "Attempting to override '{a}' which is a constant.",
20554   // Regular expressions
20555   E014: "A regular expression literal can be confused with '/='.",
20556   E015: "Unclosed regular expression.",
20557   E016: "Invalid regular expression.",
20559   // Tokens
20560   E017: "Unclosed comment.",
20561   E018: "Unbegun comment.",
20562   E019: "Unmatched '{a}'.",
20563   E020: "Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.",
20564   E021: "Expected '{a}' and instead saw '{b}'.",
20565   E022: "Line breaking error '{a}'.",
20566   E023: "Missing '{a}'.",
20567   E024: "Unexpected '{a}'.",
20568   E025: "Missing ':' on a case clause.",
20569   E026: "Missing '}' to match '{' from line {a}.",
20570   E027: "Missing ']' to match '[' from line {a}.",
20571   E028: "Illegal comma.",
20572   E029: "Unclosed string.",
20574   // Everything else
20575   E030: "Expected an identifier and instead saw '{a}'.",
20576   E031: "Bad assignment.", // FIXME: Rephrase
20577   E032: "Expected a small integer or 'false' and instead saw '{a}'.",
20578   E033: "Expected an operator and instead saw '{a}'.",
20579   E034: "get/set are ES5 features.",
20580   E035: "Missing property name.",
20581   E036: "Expected to see a statement and instead saw a block.",
20582   E037: null,
20583   E038: null,
20584   E039: "Function declarations are not invocable. Wrap the whole function invocation in parens.",
20585   E040: "Each value should have its own case label.",
20586   E041: "Unrecoverable syntax error.",
20587   E042: "Stopping.",
20588   E043: "Too many errors.",
20589   E044: null,
20590   E045: "Invalid for each loop.",
20591   E046: "Yield expressions may only occur within generator functions.",
20592   E047: null,
20593   E048: "{a} declaration not directly within block.",
20594   E049: "A {a} cannot be named '{b}'.",
20595   E050: "Mozilla requires the yield expression to be parenthesized here.",
20596   E051: null,
20597   E052: "Unclosed template literal.",
20598   E053: "{a} declarations are only allowed at the top level of module scope.",
20599   E054: "Class properties must be methods. Expected '(' but instead saw '{a}'.",
20600   E055: "The '{a}' option cannot be set after any executable code.",
20601   E056: "'{a}' was used before it was declared, which is illegal for '{b}' variables.",
20602   E057: "Invalid meta property: '{a}.{b}'.",
20603   E058: "Missing semicolon.",
20604   E059: "Incompatible values for the '{a}' and '{b}' linting options.",
20605   E060: "Non-callable values cannot be used as the second operand to instanceof.",
20606   E061: "Invalid position for 'yield' expression (consider wrapping in parenthesis).",
20607   E062: "Rest parameter does not a support default value.",
20608   E063: "Super property may only be used within method bodies.",
20609   E064: "Super call may only be used within class method bodies."
20612 var warnings = {
20613   W001: "'hasOwnProperty' is a really bad name.",
20614   W002: "Value of '{a}' may be overwritten in IE 8 and earlier.",
20615   W003: "'{a}' was used before it was defined.",
20616   W004: "'{a}' is already defined.",
20617   W005: "A dot following a number can be confused with a decimal point.",
20618   W006: "Confusing minuses.",
20619   W007: "Confusing plusses.",
20620   W008: "A leading decimal point can be confused with a dot: '{a}'.",
20621   W009: "The array literal notation [] is preferable.",
20622   W010: "The object literal notation {} is preferable.",
20623   W011: null,
20624   W012: null,
20625   W013: null,
20626   W014: "Misleading line break before '{a}'; readers may interpret this as an expression boundary.",
20627   W015: null,
20628   W016: "Unexpected use of '{a}'.",
20629   W017: "Bad operand.",
20630   W018: "Confusing use of '{a}'.",
20631   W019: "Use the isNaN function to compare with NaN.",
20632   W020: "Read only.",
20633   W021: "Reassignment of '{a}', which is a {b}. " +
20634     "Use 'var' or 'let' to declare bindings that may change.",
20635   W022: "Do not assign to the exception parameter.",
20636   W023: null,
20637   W024: "Expected an identifier and instead saw '{a}' (a reserved word).",
20638   W025: "Missing name in function declaration.",
20639   W026: "Inner functions should be listed at the top of the outer function.",
20640   W027: "Unreachable '{a}' after '{b}'.",
20641   W028: "Label '{a}' on {b} statement.",
20642   W030: "Expected an assignment or function call and instead saw an expression.",
20643   W031: "Do not use 'new' for side effects.",
20644   W032: "Unnecessary semicolon.",
20645   W033: "Missing semicolon.",
20646   W034: "Unnecessary directive \"{a}\".",
20647   W035: "Empty block.",
20648   W036: "Unexpected /*member '{a}'.",
20649   W037: "'{a}' is a statement label.",
20650   W038: "'{a}' used out of scope.",
20651   W039: "'{a}' is not allowed.",
20652   W040: "If a strict mode function is executed using function invocation, " +
20653     "its 'this' value will be undefined.",
20654   W041: null,
20655   W042: "Avoid EOL escaping.",
20656   W043: "Bad escaping of EOL. Use option multistr if needed.",
20657   W044: "Bad or unnecessary escaping.", /* TODO(caitp): remove W044 */
20658   W045: "Bad number '{a}'.",
20659   W046: "Don't use extra leading zeros '{a}'.",
20660   W047: "A trailing decimal point can be confused with a dot: '{a}'.",
20661   W048: "Unexpected control character in regular expression.",
20662   W049: "Unexpected escaped character '{a}' in regular expression.",
20663   W050: "JavaScript URL.",
20664   W051: "Variables should not be deleted.",
20665   W052: "Unexpected '{a}'.",
20666   W053: "Do not use {a} as a constructor.",
20667   W054: "The Function constructor is a form of eval.",
20668   W055: "A constructor name should start with an uppercase letter.",
20669   W056: "Bad constructor.",
20670   W057: "Weird construction. Is 'new' necessary?",
20671   W058: "Missing '()' invoking a constructor.",
20672   W059: "Avoid arguments.{a}.",
20673   W060: "document.write can be a form of eval.",
20674   W061: "eval can be harmful.",
20675   W062: "Wrap an immediate function invocation in parens " +
20676     "to assist the reader in understanding that the expression " +
20677     "is the result of a function, and not the function itself.",
20678   W063: "Math is not a function.",
20679   W064: "Missing 'new' prefix when invoking a constructor.",
20680   W065: "Missing radix parameter.",
20681   W066: "Implied eval. Consider passing a function instead of a string.",
20682   W067: "Bad invocation.",
20683   W068: "Wrapping non-IIFE function literals in parens is unnecessary.",
20684   W069: "['{a}'] is better written in dot notation.",
20685   W070: "Extra comma. (it breaks older versions of IE)",
20686   W071: "This function has too many statements. ({a})",
20687   W072: "This function has too many parameters. ({a})",
20688   W073: "Blocks are nested too deeply. ({a})",
20689   W074: "This function's cyclomatic complexity is too high. ({a})",
20690   W075: "Duplicate {a} '{b}'.",
20691   W076: "Unexpected parameter '{a}' in get {b} function.",
20692   W077: "Expected a single parameter in set {a} function.",
20693   W078: "Setter is defined without getter.",
20694   W079: "Redefinition of '{a}'.",
20695   W080: "It's not necessary to initialize '{a}' to 'undefined'.",
20696   W081: null,
20697   W082: "Function declarations should not be placed in blocks. " +
20698     "Use a function expression or move the statement to the top of " +
20699     "the outer function.",
20700   W083: "Functions declared within loops referencing an outer scoped " +
20701     "variable may lead to confusing semantics. ({a})",
20702   W084: "Expected a conditional expression and instead saw an assignment.",
20703   W085: "Don't use 'with'.",
20704   W086: "Expected a 'break' statement before '{a}'.",
20705   W087: "Forgotten 'debugger' statement?",
20706   W088: "Creating global 'for' variable. Should be 'for (var {a} ...'.",
20707   W089: "The body of a for in should be wrapped in an if statement to filter " +
20708     "unwanted properties from the prototype.",
20709   W090: "'{a}' is not a statement label.",
20710   W091: null,
20711   W093: "Did you mean to return a conditional instead of an assignment?",
20712   W094: "Unexpected comma.",
20713   W095: "Expected a string and instead saw {a}.",
20714   W096: "The '{a}' key may produce unexpected results.",
20715   W097: "Use the function form of \"use strict\".",
20716   W098: "'{a}' is defined but never used.",
20717   W099: null,
20718   W100: null,
20719   W101: "Line is too long.",
20720   W102: null,
20721   W103: "The '{a}' property is deprecated.",
20722   W104: "'{a}' is available in ES{b} (use 'esversion: {b}') or Mozilla JS extensions (use moz).",
20723   W105: "Unexpected {a} in '{b}'.",
20724   W106: "Identifier '{a}' is not in camel case.",
20725   W107: "Script URL.",
20726   W108: "Strings must use doublequote.",
20727   W109: "Strings must use singlequote.",
20728   W110: "Mixed double and single quotes.",
20729   W112: "Unclosed string.",
20730   W113: "Control character in string: {a}.",
20731   W114: "Avoid {a}.",
20732   W115: "Octal literals are not allowed in strict mode.",
20733   W116: "Expected '{a}' and instead saw '{b}'.",
20734   W117: "'{a}' is not defined.",
20735   W118: "'{a}' is only available in Mozilla JavaScript extensions (use moz option).",
20736   W119: "'{a}' is only available in ES{b} (use 'esversion: {b}').",
20737   W120: "You might be leaking a variable ({a}) here.",
20738   W121: "Extending prototype of native object: '{a}'.",
20739   W122: "Invalid typeof value '{a}'",
20740   W123: "'{a}' is already defined in outer scope.",
20741   W124: "A generator function should contain at least one yield expression.",
20742   W125: "This line contains non-breaking spaces: http://jshint.com/docs/options/#nonbsp",
20743   W126: "Unnecessary grouping operator.",
20744   W127: "Unexpected use of a comma operator.",
20745   W128: "Empty array elements require elision=true.",
20746   W129: "'{a}' is defined in a future version of JavaScript. Use a " +
20747     "different variable name to avoid migration issues.",
20748   W130: "Invalid element after rest element.",
20749   W131: "Invalid parameter after rest parameter.",
20750   W132: "`var` declarations are forbidden. Use `let` or `const` instead.",
20751   W133: "Invalid for-{a} loop left-hand-side: {b}.",
20752   W134: "The '{a}' option is only available when linting ECMAScript {b} code.",
20753   W135: "{a} may not be supported by non-browser environments.",
20754   W136: "'{a}' must be in function scope.",
20755   W137: "Empty destructuring: this is unnecessary and can be removed.",
20756   W138: "Regular parameters should not come after default parameters.",
20757   W139: "Function expressions should not be used as the second operand to instanceof.",
20758   W140: "Missing comma.",
20759   W141: "Empty {a}: this is unnecessary and can be removed.",
20760   W142: "Empty {a}: consider replacing with `import '{b}';`.",
20761   W143: "Assignment to properties of a mapped arguments object may cause " +
20762     "unexpected changes to formal parameters."
20765 var info = {
20766   I001: "Comma warnings can be turned off with 'laxcomma'.",
20767   I002: null,
20768   I003: "ES5 option is now set per default"
20771 exports.errors = {};
20772 exports.warnings = {};
20773 exports.info = {};
20775 _.each(errors, function(desc, code) {
20776   exports.errors[code] = { code: code, desc: desc };
20779 _.each(warnings, function(desc, code) {
20780   exports.warnings[code] = { code: code, desc: desc };
20783 _.each(info, function(desc, code) {
20784   exports.info[code] = { code: code, desc: desc };
20787 },{"lodash":13}],16:[function(require,module,exports){
20788 "use strict";
20790 function NameStack() {
20791   this._stack = [];
20794 Object.defineProperty(NameStack.prototype, "length", {
20795   get: function() {
20796     return this._stack.length;
20797   }
20801  * Create a new entry in the stack. Useful for tracking names across
20802  * expressions.
20803  */
20804 NameStack.prototype.push = function() {
20805   this._stack.push(null);
20809  * Discard the most recently-created name on the stack.
20810  */
20811 NameStack.prototype.pop = function() {
20812   this._stack.pop();
20816  * Update the most recent name on the top of the stack.
20818  * @param {object} token The token to consider as the source for the most
20819  *                       recent name.
20820  */
20821 NameStack.prototype.set = function(token) {
20822   this._stack[this.length - 1] = token;
20826  * Generate a string representation of the most recent name.
20828  * @returns {string}
20829  */
20830 NameStack.prototype.infer = function() {
20831   var nameToken = this._stack[this.length - 1];
20832   var prefix = "";
20833   var type;
20835   // During expected operation, the topmost entry on the stack will only
20836   // reflect the current function's name when the function is declared without
20837   // the `function` keyword (i.e. for in-line accessor methods). In other
20838   // cases, the `function` expression itself will introduce an empty entry on
20839   // the top of the stack, and this should be ignored.
20840   if (!nameToken || nameToken.type === "class") {
20841     nameToken = this._stack[this.length - 2];
20842   }
20844   if (!nameToken) {
20845     return "(empty)";
20846   }
20848   type = nameToken.type;
20850   if (type !== "(string)" && type !== "(number)" && type !== "(identifier)" && type !== "default") {
20851     return "(expression)";
20852   }
20854   if (nameToken.accessorType) {
20855     prefix = nameToken.accessorType + " ";
20856   }
20858   return prefix + nameToken.value;
20861 module.exports = NameStack;
20863 },{}],17:[function(require,module,exports){
20864 "use strict";
20866 // These are the JSHint boolean options.
20867 exports.bool = {
20868   enforcing: {
20870     /**
20871      * This option prohibits the use of bitwise operators such as `^` (XOR),
20872      * `|` (OR) and others. Bitwise operators are very rare in JavaScript
20873      * programs and quite often `&` is simply a mistyped `&&`.
20874      */
20875     bitwise     : true,
20877     /**
20878      *
20879      * This options prohibits overwriting prototypes of native objects such as
20880      * `Array`, `Date` and so on.
20881      *
20882      *     // jshint freeze:true
20883      *     Array.prototype.count = function (value) { return 4; };
20884      *     // -> Warning: Extending prototype of native object: 'Array'.
20885      */
20886     freeze      : true,
20888     /**
20889      * This option allows you to force all variable names to use either
20890      * camelCase style or UPPER_CASE with underscores.
20891      *
20892      * @deprecated JSHint is limiting its scope to issues of code correctness.
20893      *             If you would like to enforce rules relating to code style,
20894      *             check out [the JSCS
20895      *             project](https://github.com/jscs-dev/node-jscs).
20896      */
20897     camelcase   : true,
20899     /**
20900      * This option requires you to always put curly braces around blocks in
20901      * loops and conditionals. JavaScript allows you to omit curly braces when
20902      * the block consists of only one statement, for example:
20903      *
20904      *     while (day)
20905      *       shuffle();
20906      *
20907      * However, in some circumstances, it can lead to bugs (you'd think that
20908      * `sleep()` is a part of the loop while in reality it is not):
20909      *
20910      *     while (day)
20911      *       shuffle();
20912      *       sleep();
20913      */
20914     curly       : true,
20916     /**
20917      * This options prohibits the use of `==` and `!=` in favor of `===` and
20918      * `!==`. The former try to coerce values before comparing them which can
20919      * lead to some unexpected results. The latter don't do any coercion so
20920      * they are generally safer. If you would like to learn more about type
20921      * coercion in JavaScript, we recommend [Truth, Equality and
20922      * JavaScript](http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/)
20923      * by Angus Croll.
20924      */
20925     eqeqeq      : true,
20927     /**
20928      * This option enables warnings about the use of identifiers which are
20929      * defined in future versions of JavaScript. Although overwriting them has
20930      * no effect in contexts where they are not implemented, this practice can
20931      * cause issues when migrating codebases to newer versions of the language.
20932      */
20933     futurehostile: true,
20935     /**
20936      * This option tells JSHint that your code needs to adhere to ECMAScript 3
20937      * specification. Use this option if you need your program to be executable
20938      * in older browsers—such as Internet Explorer 6/7/8/9—and other legacy
20939      * JavaScript environments.
20940      *
20941      * @deprecated Use `esversion: 3` instead.
20942      */
20943     es3         : true,
20945     /**
20946      * This option enables syntax first defined in [the ECMAScript 5.1
20947      * specification](http://es5.github.io/). This includes allowing reserved
20948      * keywords as object properties.
20949      *
20950      * @deprecated Use `esversion: 5` instead.
20951      */
20952     es5         : true,
20954     /**
20955      * This option requires all `for in` loops to filter object's items. The
20956      * for in statement allows for looping through the names of all of the
20957      * properties of an object including those inherited through the prototype
20958      * chain. This behavior can lead to unexpected items in your object so it
20959      * is generally safer to always filter inherited properties out as shown in
20960      * the example:
20961      *
20962      *     for (key in obj) {
20963      *       if (obj.hasOwnProperty(key)) {
20964      *         // We are sure that obj[key] belongs to the object and was not inherited.
20965      *       }
20966      *     }
20967      *
20968      * For more in-depth understanding of `for in` loops in JavaScript, read
20969      * [Exploring JavaScript for-in
20970      * loops](http://javascriptweblog.wordpress.com/2011/01/04/exploring-javascript-for-in-loops/)
20971      * by Angus Croll.
20972      */
20973     forin       : true,
20975     /**
20976      * This option prohibits the use of immediate function invocations without
20977      * wrapping them in parentheses. Wrapping parentheses assists readers of
20978      * your code in understanding that the expression is the result of a
20979      * function, and not the function itself.
20980      *
20981      * @deprecated JSHint is limiting its scope to issues of code correctness.
20982      *             If you would like to enforce rules relating to code style,
20983      *             check out [the JSCS
20984      *             project](https://github.com/jscs-dev/node-jscs).
20985      */
20986     immed       : true,
20988     /**
20989      * This option requires you to capitalize names of constructor functions.
20990      * Capitalizing functions that are intended to be used with `new` operator
20991      * is just a convention that helps programmers to visually distinguish
20992      * constructor functions from other types of functions to help spot
20993      * mistakes when using `this`.
20994      *
20995      * Not doing so won't break your code in any browsers or environments but
20996      * it will be a bit harder to figure out—by reading the code—if the
20997      * function was supposed to be used with or without new. And this is
20998      * important because when the function that was intended to be used with
20999      * `new` is used without it, `this` will point to the global object instead
21000      * of a new object.
21001      *
21002      * @deprecated JSHint is limiting its scope to issues of code correctness.
21003      *             If you would like to enforce rules relating to code style,
21004      *             check out [the JSCS
21005      *             project](https://github.com/jscs-dev/node-jscs).
21006      */
21007     newcap      : true,
21009     /**
21010      * This option prohibits the use of `arguments.caller` and
21011      * `arguments.callee`.  Both `.caller` and `.callee` make quite a few
21012      * optimizations impossible so they were deprecated in future versions of
21013      * JavaScript. In fact, ECMAScript 5 forbids the use of `arguments.callee`
21014      * in strict mode.
21015      */
21016     noarg       : true,
21018     /**
21019      * This option prohibits the use of the comma operator. When misused, the
21020      * comma operator can obscure the value of a statement and promote
21021      * incorrect code.
21022      */
21023     nocomma     : true,
21025     /**
21026      * This option warns when you have an empty block in your code. JSLint was
21027      * originally warning for all empty blocks and we simply made it optional.
21028      * There were no studies reporting that empty blocks in JavaScript break
21029      * your code in any way.
21030      *
21031      * @deprecated JSHint is limiting its scope to issues of code correctness.
21032      *             If you would like to enforce rules relating to code style,
21033      *             check out [the JSCS
21034      *             project](https://github.com/jscs-dev/node-jscs).
21035      */
21036     noempty     : true,
21038     /**
21039      * This option warns about "non-breaking whitespace" characters. These
21040      * characters can be entered with option-space on Mac computers and have a
21041      * potential of breaking non-UTF8 web pages.
21042      */
21043     nonbsp      : true,
21045     /**
21046      * This option prohibits the use of constructor functions for side-effects.
21047      * Some people like to call constructor functions without assigning its
21048      * result to any variable:
21049      *
21050      *     new MyConstructor();
21051      *
21052      * There is no advantage in this approach over simply calling
21053      * `MyConstructor` since the object that the operator `new` creates isn't
21054      * used anywhere so you should generally avoid constructors like this one.
21055      */
21056     nonew       : true,
21058     /**
21059      * This option prohibits the use of explicitly undeclared variables. This
21060      * option is very useful for spotting leaking and mistyped variables.
21061      *
21062      *     // jshint undef:true
21063      *
21064      *     function test() {
21065      *       var myVar = 'Hello, World';
21066      *       console.log(myvar); // Oops, typoed here. JSHint with undef will complain
21067      *     }
21068      *
21069      * If your variable is defined in another file, you can use the `global`
21070      * directive to tell JSHint about it.
21071      */
21072     undef       : true,
21074     /**
21075      * This option prohibits the use of the grouping operator when it is not
21076      * strictly required. Such usage commonly reflects a misunderstanding of
21077      * unary operators, for example:
21078      *
21079      *     // jshint singleGroups: true
21080      *
21081      *     delete(obj.attr); // Warning: Unnecessary grouping operator.
21082      */
21083     singleGroups: false,
21085     /**
21086      * When set to true, the use of VariableStatements are forbidden.
21087      * For example:
21088      *
21089      *     // jshint varstmt: true
21090      *
21091      *     var a; // Warning: `var` declarations are forbidden. Use `let` or `const` instead.
21092      */
21093     varstmt: false,
21095     /**
21096      * This option is a short hand for the most strict JSHint configuration as
21097      * available in JSHint version 2.6.3. It enables all enforcing options and
21098      * disables all relaxing options that were defined in that release.
21099      *
21100      * @deprecated The option cannot be maintained without automatically opting
21101      *             users in to new features. This can lead to unexpected
21102      *             warnings/errors in when upgrading between minor versions of
21103      *             JSHint.
21104      */
21105     enforceall : false,
21107     /**
21108      * This option warns when a comma is not placed after the last element in an
21109      * array or object literal. Due to bugs in old versions of IE, trailing
21110      * commas used to be discouraged, but since ES5 their semantics were
21111      * standardized. (See
21112      * [#11.1.4](http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.4) and
21113      * [#11.1.5](http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5).)
21114      * Now, they help to prevent the same [visual
21115      * ambiguities](http://www.ecma-international.org/ecma-262/5.1/#sec-7.9.2)
21116      * that the strict usage of semicolons helps prevent.
21117      *
21118      * For example, this code might have worked last Tuesday:
21119      *
21120      *     [
21121      *         b + c
21122      *     ].forEach(print);
21123      *
21124      * But if one adds an element to the array and forgets to compensate for the
21125      * missing comma, no syntax error is thrown, and a linter cannot determine
21126      * if this was a mistake or an intentional function invocation.
21127      *
21128      *     [
21129      *         b + c
21130      *         (d + e)
21131      *     ].forEach(print);
21132      *
21133      * If one always appends a list item with a comma, this ambiguity cannot
21134      * occur:
21135      *
21136      *     [
21137      *         b + c,
21138      *     ].forEach(print);
21139      *
21140      *     [
21141      *         b + c,
21142      *         (d + e),
21143      *     ].forEach(print);
21144      */
21145     trailingcomma: false
21146   },
21147   relaxing: {
21149     /**
21150      * This option suppresses warnings about missing semicolons. There is a lot
21151      * of FUD about semicolon spread by quite a few people in the community.
21152      * The common myths are that semicolons are required all the time (they are
21153      * not) and that they are unreliable. JavaScript has rules about semicolons
21154      * which are followed by *all* browsers so it is up to you to decide
21155      * whether you should or should not use semicolons in your code.
21156      *
21157      * For more information about semicolons in JavaScript read [An Open Letter
21158      * to JavaScript Leaders Regarding
21159      * Semicolons](http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding)
21160      * by Isaac Schlueter and [JavaScript Semicolon
21161      * Insertion](http://inimino.org/~inimino/blog/javascript_semicolons).
21162      */
21163     asi         : true,
21165     /**
21166      * This option suppresses warnings about multi-line strings. Multi-line
21167      * strings can be dangerous in JavaScript because all hell breaks loose if
21168      * you accidentally put a whitespace in between the escape character (`\`)
21169      * and a new line.
21170      *
21171      * Note that even though this option allows correct multi-line strings, it
21172      * still warns about multi-line strings without escape characters or with
21173      * anything in between the escape character and a whitespace.
21174      *
21175      *     // jshint multistr:true
21176      *
21177      *     var text = "Hello\
21178      *     World"; // All good.
21179      *
21180      *     text = "Hello
21181      *     World"; // Warning, no escape character.
21182      *
21183      *     text = "Hello\
21184      *     World"; // Warning, there is a space after \
21185      *
21186      * @deprecated JSHint is limiting its scope to issues of code correctness.
21187      *             If you would like to enforce rules relating to code style,
21188      *             check out [the JSCS
21189      *             project](https://github.com/jscs-dev/node-jscs).
21190      */
21191     multistr    : true,
21193     /**
21194      * This option suppresses warnings about the `debugger` statements in your
21195      * code.
21196      */
21197     debug       : true,
21199     /**
21200      * This option suppresses warnings about the use of assignments in cases
21201      * where comparisons are expected. More often than not, code like `if (a =
21202      * 10) {}` is a typo. However, it can be useful in cases like this one:
21203      *
21204      *     for (var i = 0, person; person = people[i]; i++) {}
21205      *
21206      * You can silence this error on a per-use basis by surrounding the assignment
21207      * with parenthesis, such as:
21208      *
21209      *     for (var i = 0, person; (person = people[i]); i++) {}
21210      */
21211     boss        : true,
21213     /**
21214      * This option suppresses warnings about the use of `eval`. The use of
21215      * `eval` is discouraged because it can make your code vulnerable to
21216      * various injection attacks and it makes it hard for JavaScript
21217      * interpreter to do certain optimizations.
21218     */
21219     evil        : true,
21221     /**
21222      * This option suppresses warnings about declaring variables inside
21223      * of control structures while accessing them later from the outside.
21224      * Even though identifiers declared with `var` have two real scopes—global
21225      * and function—such practice leads to confusion among people new to
21226      * the language and hard-to-debug bugs. This is why, by default, JSHint
21227      * warns about variables that are used outside of their intended scope.
21228      *
21229      *     function test() {
21230      *       if (true) {
21231      *         var x = 0;
21232      *       }
21233      *
21234      *       x += 1; // Default: 'x' used out of scope.
21235      *                 // No warning when funcscope:true
21236      *     }
21237      */
21238     funcscope   : true,
21240     /**
21241      * This option suppresses warnings about the use of global strict mode.
21242      * Global strict mode can break third-party widgets so it is not
21243      * recommended.
21244      *
21245      * For more info about strict mode see the `strict` option.
21246      *
21247      * @deprecated Use `strict: "global"`.
21248      */
21249     globalstrict: true,
21251     /**
21252      * This option suppresses warnings about the `__iterator__` property. This
21253      * property is not supported by all browsers so use it carefully.
21254      */
21255     iterator    : true,
21257      /**
21258      * This option suppresses warnings about invalid `typeof` operator values.
21259      * This operator has only [a limited set of possible return
21260      * values](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof).
21261      * By default, JSHint warns when you compare its result with an invalid
21262      * value which often can be a typo.
21263      *
21264      *     // 'fuction' instead of 'function'
21265      *     if (typeof a == "fuction") { // Invalid typeof value 'fuction'
21266      *       // ...
21267      *     }
21268      *
21269      * Do not use this option unless you're absolutely sure you don't want
21270      * these checks.
21271      */
21272     notypeof    : true,
21274     /**
21275      * This option prohibits the use of unary increment and decrement
21276      * operators.  Some people think that `++` and `--` reduces the quality of
21277      * their coding styles and there are programming languages—such as
21278      * Python—that go completely without these operators.
21279      */
21280     plusplus    : true,
21282     /**
21283      * This option suppresses warnings about the `__proto__` property.
21284      */
21285     proto       : true,
21287     /**
21288      * This option suppresses warnings about the use of script-targeted
21289      * URLs—such as `javascript:...`.
21290      */
21291     scripturl   : true,
21293     /**
21294      * This option suppresses warnings about using `[]` notation when it can be
21295      * expressed in dot notation: `person['name']` vs. `person.name`.
21296      *
21297      * @deprecated JSHint is limiting its scope to issues of code correctness.
21298      *             If you would like to enforce rules relating to code style,
21299      *             check out [the JSCS
21300      *             project](https://github.com/jscs-dev/node-jscs).
21301      */
21302     sub         : true,
21304     /**
21305      * This option suppresses warnings about "weird" constructions like
21306      * `new function () { ... }` and `new Object;`. Such constructions are
21307      * sometimes used to produce singletons in JavaScript:
21308      *
21309      *     var singleton = new function() {
21310      *       var privateVar;
21311      *
21312      *       this.publicMethod  = function () {}
21313      *       this.publicMethod2 = function () {}
21314      *     };
21315      */
21316     supernew    : true,
21318     /**
21319      * This option suppresses most of the warnings about possibly unsafe line
21320      * breakings in your code. It doesn't suppress warnings about comma-first
21321      * coding style. To suppress those you have to use `laxcomma` (see below).
21322      *
21323      * @deprecated JSHint is limiting its scope to issues of code correctness.
21324      *             If you would like to enforce rules relating to code style,
21325      *             check out [the JSCS
21326      *             project](https://github.com/jscs-dev/node-jscs).
21327      */
21328     laxbreak    : true,
21330     /**
21331      * This option suppresses warnings about comma-first coding style:
21332      *
21333      *     var obj = {
21334      *         name: 'Anton'
21335      *       , handle: 'valueof'
21336      *       , role: 'SW Engineer'
21337      *     };
21338      *
21339      * @deprecated JSHint is limiting its scope to issues of code correctness.
21340      *             If you would like to enforce rules relating to code style,
21341      *             check out [the JSCS
21342      *             project](https://github.com/jscs-dev/node-jscs).
21343      */
21344     laxcomma    : true,
21346     /**
21347      * This option suppresses warnings about possible strict violations when
21348      * the code is running in strict mode and you use `this` in a
21349      * non-constructor function. You should use this option—in a function scope
21350      * only—when you are positive that your use of `this` is valid in the
21351      * strict mode (for example, if you call your function using
21352      * `Function.call`).
21353      *
21354      * **Note:** This option can be used only inside of a function scope.
21355      * JSHint will fail with an error if you will try to set this option
21356      * globally.
21357      */
21358     validthis   : true,
21360     /**
21361      * This option suppresses warnings about the use of the `with` statement.
21362      * The semantics of the `with` statement can cause confusion among
21363      * developers and accidental definition of global variables.
21364      *
21365      * More info:
21366      *
21367      * * [with Statement Considered
21368      *   Harmful](http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/)
21369      */
21370     withstmt    : true,
21372     /**
21373      * This options tells JSHint that your code uses Mozilla JavaScript
21374      * extensions. Unless you develop specifically for the Firefox web browser
21375      * you don't need this option.
21376      *
21377      * More info:
21378      *
21379      * * [New in JavaScript
21380      *   1.7](https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7)
21381      */
21382     moz         : true,
21384     /**
21385      * This option suppresses warnings about generator functions with no
21386      * `yield` statement in them.
21387      */
21388     noyield     : true,
21390     /**
21391      * This option suppresses warnings about `== null` comparisons. Such
21392      * comparisons are often useful when you want to check if a variable is
21393      * `null` or `undefined`.
21394      */
21395     eqnull      : true,
21397     /**
21398      * This option suppresses warnings about missing semicolons, but only when
21399      * the semicolon is omitted for the last statement in a one-line block:
21400      *
21401      *     var name = (function() { return 'Anton' }());
21402      *
21403      * This is a very niche use case that is useful only when you use automatic
21404      * JavaScript code generators.
21405      */
21406     lastsemic   : true,
21408     /**
21409      * This option suppresses warnings about functions inside of loops.
21410      * Defining functions inside of loops can lead to bugs such as this one:
21411      *
21412      *     var nums = [];
21413      *
21414      *     for (var i = 0; i < 10; i++) {
21415      *       nums[i] = function (j) {
21416      *         return i + j;
21417      *       };
21418      *     }
21419      *
21420      *     nums[0](2); // Prints 12 instead of 2
21421      *
21422      * To fix the code above you need to copy the value of `i`:
21423      *
21424      *     var nums = [];
21425      *
21426      *     for (var i = 0; i < 10; i++) {
21427      *       (function (i) {
21428      *         nums[i] = function (j) {
21429      *             return i + j;
21430      *         };
21431      *       }(i));
21432      *     }
21433      */
21434     loopfunc    : true,
21436     /**
21437      * This option suppresses warnings about the use of expressions where
21438      * normally you would expect to see assignments or function calls. Most of
21439      * the time, such code is a typo. However, it is not forbidden by the spec
21440      * and that's why this warning is optional.
21441      */
21442     expr        : true,
21444     /**
21445      * This option tells JSHint that your code uses ECMAScript 6 specific
21446      * syntax. Note that not all browsers implement these features.
21447      *
21448      * More info:
21449      *
21450      * * [Specification for ECMAScript
21451      *   6](http://www.ecma-international.org/ecma-262/6.0/index.html)
21452      *
21453      * @deprecated Use `esversion: 6` instead.
21454      */
21455     esnext      : true,
21457     /**
21458      * This option tells JSHint that your code uses ES3 array elision elements,
21459      * or empty elements (for example, `[1, , , 4, , , 7]`).
21460      */
21461     elision     : true,
21462   },
21464   // Third party globals
21465   environments: {
21467     /**
21468      * This option defines globals exposed by the
21469      * [MooTools](http://mootools.net/) JavaScript framework.
21470      */
21471     mootools    : true,
21473     /**
21474      * This option defines globals exposed by
21475      * [CouchDB](http://couchdb.apache.org/). CouchDB is a document-oriented
21476      * database that can be queried and indexed in a MapReduce fashion using
21477      * JavaScript.
21478      */
21479     couch       : true,
21481     /**
21482      * This option defines globals exposed by [the Jasmine unit testing
21483      * framework](https://jasmine.github.io/).
21484      */
21485     jasmine     : true,
21487     /**
21488      * This option defines globals exposed by the [jQuery](http://jquery.com/)
21489      * JavaScript library.
21490      */
21491     jquery      : true,
21493     /**
21494      * This option defines globals available when your code is running inside
21495      * of the Node runtime environment. [Node.js](http://nodejs.org/) is a
21496      * server-side JavaScript environment that uses an asynchronous
21497      * event-driven model. This option also skips some warnings that make sense
21498      * in the browser environments but don't make sense in Node such as
21499      * file-level `use strict` pragmas and `console.log` statements.
21500      */
21501     node        : true,
21503     /**
21504      * This option defines globals exposed by [the QUnit unit testing
21505      * framework](http://qunitjs.com/).
21506      */
21507     qunit       : true,
21509     /**
21510      * This option defines globals available when your code is running inside
21511      * of the Rhino runtime environment. [Rhino](http://www.mozilla.org/rhino/)
21512      * is an open-source implementation of JavaScript written entirely in Java.
21513      */
21514     rhino       : true,
21516     /**
21517      * This option defines globals exposed by [the ShellJS
21518      * library](http://documentup.com/arturadib/shelljs).
21519      */
21520     shelljs     : true,
21522     /**
21523      * This option defines globals exposed by the
21524      * [Prototype](http://www.prototypejs.org/) JavaScript framework.
21525      */
21526     prototypejs : true,
21528     /**
21529      * This option defines globals exposed by the [YUI](http://yuilibrary.com/)
21530      * JavaScript framework.
21531      */
21532     yui         : true,
21534     /**
21535      * This option defines globals exposed by the "BDD" and "TDD" UIs of the
21536      * [Mocha unit testing framework](http://mochajs.org/).
21537      */
21538     mocha       : true,
21540     /**
21541      * This option informs JSHint that the input code describes an ECMAScript 6
21542      * module. All module code is interpreted as strict mode code.
21543      */
21544     module      : true,
21546     /**
21547      * This option defines globals available when your code is running as a
21548      * script for the [Windows Script
21549      * Host](http://en.wikipedia.org/wiki/Windows_Script_Host).
21550      */
21551     wsh         : true,
21553     /**
21554      * This option defines globals available when your code is running inside
21555      * of a Web Worker. [Web
21556      * Workers](https://developer.mozilla.org/en/Using_web_workers) provide a
21557      * simple means for web content to run scripts in background threads.
21558      */
21559     worker      : true,
21561     /**
21562      * This option defines non-standard but widely adopted globals such as
21563      * `escape` and `unescape`.
21564      */
21565     nonstandard : true,
21567     /**
21568      * This option defines globals exposed by modern browsers: all the way from
21569      * good old `document` and `navigator` to the HTML5 `FileReader` and other
21570      * new developments in the browser world.
21571      *
21572      * **Note:** This option doesn't expose variables like `alert` or
21573      * `console`. See option `devel` for more information.
21574      */
21575     browser     : true,
21577     /**
21578      * This option defines globals available when using [the Browserify
21579      * tool](http://browserify.org/) to build a project.
21580      */
21581     browserify  : true,
21583     /**
21584      * This option defines globals that are usually used for logging poor-man's
21585      * debugging: `console`, `alert`, etc. It is usually a good idea to not
21586      * ship them in production because, for example, `console.log` breaks in
21587      * legacy versions of Internet Explorer.
21588      */
21589     devel       : true,
21591     /**
21592      * This option defines globals exposed by the [Dojo
21593      * Toolkit](http://dojotoolkit.org/).
21594      */
21595     dojo        : true,
21597     /**
21598      * This option defines globals for typed array constructors.
21599      *
21600      * More info:
21601      *
21602      * * [JavaScript typed
21603      *   arrays](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays)
21604      */
21605     typed       : true,
21607     /**
21608      * This option defines globals available when your core is running inside
21609      * of the PhantomJS runtime environment. [PhantomJS](http://phantomjs.org/)
21610      * is a headless WebKit scriptable with a JavaScript API. It has fast and
21611      * native support for various web standards: DOM handling, CSS selector,
21612      * JSON, Canvas, and SVG.
21613      */
21614     phantom     : true
21615   },
21617   // Obsolete options
21618   obsolete: {
21619     onecase     : true, // if one case switch statements should be allowed
21620     regexp      : true, // if the . should not be allowed in regexp literals
21621     regexdash   : true  // if unescaped first/last dash (-) inside brackets
21622                         // should be tolerated
21623   }
21626 // These are the JSHint options that can take any value
21627 // (we use this object to detect invalid options)
21628 exports.val = {
21630   /**
21631    * This option lets you set the maximum length of a line.
21632    *
21633    * @deprecated JSHint is limiting its scope to issues of code correctness. If
21634    *             you would like to enforce rules relating to code style, check
21635    *             out [the JSCS project](https://github.com/jscs-dev/node-jscs).
21636    */
21637   maxlen       : false,
21639   /**
21640    * This option sets a specific tab width for your code.
21641    *
21642    * @deprecated JSHint is limiting its scope to issues of code correctness. If
21643    *             you would like to enforce rules relating to code style, check
21644    *             out [the JSCS project](https://github.com/jscs-dev/node-jscs).
21645    */
21646   indent       : false,
21648   /**
21649    * This options allows you to set the maximum amount of warnings JSHint will
21650    * produce before giving up. Default is 50.
21651    */
21652   maxerr       : false,
21654   /**
21655    * This option allows you to control which variables JSHint considers to be
21656    * implicitly defined in the environment. Configure it with an array of
21657    * string values. Prefixing a variable name with a hyphen (-) character will
21658    * remove that name from the collection of predefined variables.
21659    *
21660    * JSHint will consider variables declared in this way to be read-only.
21661    *
21662    * This option cannot be specified in-line; it may only be used via the
21663    * JavaScript API or from an external configuration file.
21664    */
21665   predef       : false,
21667   /**
21668    * This option can be used to specify a white list of global variables that
21669    * are not formally defined in the source code. This is most useful when
21670    * combined with the `undef` option in order to suppress warnings for
21671    * project-specific global variables.
21672    *
21673    * Setting an entry to `true` enables reading and writing to that variable.
21674    * Setting it to `false` will trigger JSHint to consider that variable
21675    * read-only.
21676    *
21677    * See also the "environment" options: a set of options to be used as short
21678    * hand for enabling global variables defined in common JavaScript
21679    * environments.
21680    *
21681    * To configure `globals` within an individual file, see [Inline
21682    * Configuration](http://jshint.com/docs/#inline-configuration).
21683    */
21684   globals      : false,
21686   /**
21687    * This option enforces the consistency of quotation marks used throughout
21688    * your code. It accepts three values: `true` if you don't want to enforce
21689    * one particular style but want some consistency, `"single"` if you want to
21690    * allow only single quotes and `"double"` if you want to allow only double
21691    * quotes.
21692    *
21693    * @deprecated JSHint is limiting its scope to issues of code correctness. If
21694    *             you would like to enforce rules relating to code style, check
21695    *             out [the JSCS project](https://github.com/jscs-dev/node-jscs).
21696    */
21697   quotmark     : false,
21699   scope        : false,
21701   /**
21702    * This option lets you set the max number of statements allowed per function:
21703    *
21704    *     // jshint maxstatements:4
21705    *
21706    *     function main() {
21707    *       var i = 0;
21708    *       var j = 0;
21709    *
21710    *       // Function declarations count as one statement. Their bodies
21711    *       // don't get taken into account for the outer function.
21712    *       function inner() {
21713    *         var i2 = 1;
21714    *         var j2 = 1;
21715    *
21716    *         return i2 + j2;
21717    *       }
21718    *
21719    *       j = i + j;
21720    *       return j; // JSHint: Too many statements per function. (5)
21721    *     }
21722    */
21723   maxstatements: false,
21725   /**
21726    * This option lets you control how nested do you want your blocks to be:
21727    *
21728    *     // jshint maxdepth:2
21729    *
21730    *     function main(meaning) {
21731    *       var day = true;
21732    *
21733    *       if (meaning === 42) {
21734    *         while (day) {
21735    *           shuffle();
21736    *
21737    *           if (tired) { // JSHint: Blocks are nested too deeply (3).
21738    *               sleep();
21739    *           }
21740    *         }
21741    *       }
21742    *     }
21743    */
21744   maxdepth     : false,
21746   /**
21747    * This option lets you set the max number of formal parameters allowed per
21748    * function:
21749    *
21750    *     // jshint maxparams:3
21751    *
21752    *     function login(request, onSuccess) {
21753    *       // ...
21754    *     }
21755    *
21756    *     // JSHint: Too many parameters per function (4).
21757    *     function logout(request, isManual, whereAmI, onSuccess) {
21758    *       // ...
21759    *     }
21760    */
21761   maxparams    : false,
21763   /**
21764    * This option lets you control cyclomatic complexity throughout your code.
21765    * Cyclomatic complexity measures the number of linearly independent paths
21766    * through a program's source code. Read more about [cyclomatic complexity on
21767    * Wikipedia](http://en.wikipedia.org/wiki/Cyclomatic_complexity).
21768    */
21769   maxcomplexity: false,
21771   /**
21772    * This option suppresses warnings about variable shadowing i.e. declaring a
21773    * variable that had been already declared somewhere in the outer scope.
21774    *
21775    * - "inner"  - check for variables defined in the same scope only
21776    * - "outer"  - check for variables defined in outer scopes as well
21777    * - false    - same as inner
21778    * - true     - allow variable shadowing
21779    */
21780   shadow       : false,
21782   /**
21783    * This option requires the code to run in ECMAScript 5's strict mode.
21784    * [Strict mode](https://developer.mozilla.org/en/JavaScript/Strict_mode)
21785    * is a way to opt in to a restricted variant of JavaScript. Strict mode
21786    * eliminates some JavaScript pitfalls that didn't cause errors by changing
21787    * them to produce errors.  It also fixes mistakes that made it difficult
21788    * for the JavaScript engines to perform certain optimizations.
21789    *
21790    * - "global"  - there must be a `"use strict";` directive at global level
21791    * - "implied" - lint the code as if there is the `"use strict";` directive
21792    * - false     - disable warnings about strict mode
21793    * - true      - there must be a `"use strict";` directive at function level;
21794    *               this is preferable for scripts intended to be loaded in web
21795    *               browsers directly because enabling strict mode globally
21796    *               could adversely effect other scripts running on the same
21797    *               page
21798    */
21799   strict      : true,
21801   /**
21802    * This option warns when you define and never use your variables. It is very
21803    * useful for general code cleanup, especially when used in addition to
21804    * `undef`.
21805    *
21806    *     // jshint unused:true
21807    *
21808    *     function test(a, b) {
21809    *       var c, d = 2;
21810    *
21811    *       return a + d;
21812    *     }
21813    *
21814    *     test(1, 2);
21815    *
21816    *     // Line 3: 'b' was defined but never used.
21817    *     // Line 4: 'c' was defined but never used.
21818    *
21819    * In addition to that, this option will warn you about unused global
21820    * variables declared via the `global` directive.
21821    *
21822    * When set to `true`, unused parameters that are followed by a used
21823    * parameter will not produce warnings. This option can be set to `vars` to
21824    * only check for variables, not function parameters, or `strict` to check
21825    * all variables and parameters.
21826    */
21827   unused       : true,
21829   /**
21830    * This option prohibits the use of a variable before it was defined.
21831    * JavaScript has function scope only and, in addition to that, all variables
21832    * are always moved—or hoisted— to the top of the function. This behavior can
21833    * lead to some very nasty bugs and that's why it is safer to always use
21834    * variable only after they have been explicitly defined.
21835    *
21836    * Setting this option to "nofunc" will allow function declarations to be
21837    * ignored.
21838    *
21839    * For more in-depth understanding of scoping and hoisting in JavaScript,
21840    * read [JavaScript Scoping and
21841    * Hoisting](http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting)
21842    * by Ben Cherry.
21843    */
21844   latedef      : false,
21846   ignore       : false, // start/end ignoring lines of code, bypassing the lexer
21847                         //   start    - start ignoring lines, including the current line
21848                         //   end      - stop ignoring lines, starting on the next line
21849                         //   line     - ignore warnings / errors for just a single line
21850                         //              (this option does not bypass the lexer)
21852   ignoreDelimiters: false, // array of start/end delimiters used to ignore
21853                            // certain chunks from code
21855   /**
21856    * This option is used to specify the ECMAScript version to which the code
21857    * must adhere. It can assume one of the following values:
21858    *  - `3` - If you need your program to be executable
21859    *    in older browsers—such as Internet Explorer 6/7/8/9—and other legacy
21860    *    JavaScript environments
21861    *  - `5` - To enable syntax first defined in [the ECMAScript 5.1
21862    *    specification](http://www.ecma-international.org/ecma-262/5.1/index.html).
21863    *    This includes allowing reserved keywords as object properties.
21864    *  - `6` - To tell JSHint that your code uses [ECMAScript
21865    *    6](http://www.ecma-international.org/ecma-262/6.0/index.html) specific
21866    *    syntax. Note that not all browsers implement them.
21867    */
21868   esversion: 5
21871 // These are JSHint boolean options which are shared with JSLint
21872 // where the definition in JSHint is opposite JSLint
21873 exports.inverted = {
21874   bitwise : true,
21875   forin   : true,
21876   newcap  : true,
21877   plusplus: true,
21878   regexp  : true,
21879   undef   : true,
21881   // Inverted and renamed, use JSHint name here
21882   eqeqeq  : true,
21883   strict  : true
21886 exports.validNames = Object.keys(exports.val)
21887   .concat(Object.keys(exports.bool.relaxing))
21888   .concat(Object.keys(exports.bool.enforcing))
21889   .concat(Object.keys(exports.bool.obsolete))
21890   .concat(Object.keys(exports.bool.environments));
21892 // These are JSHint boolean options which are shared with JSLint
21893 // where the name has been changed but the effect is unchanged
21894 exports.renamed = {
21895   eqeq   : "eqeqeq",
21896   windows: "wsh",
21897   sloppy : "strict"
21900 exports.removed = {
21901   nomen: true,
21902   onevar: true,
21903   passfail: true,
21904   white: true,
21905   gcl: true,
21906   smarttabs: true,
21907   trailing: true
21910 // Add options here which should not be automatically enforced by
21911 // `enforceall`.
21912 exports.noenforceall = {
21913   varstmt: true,
21914   strict: true
21917 },{}],18:[function(require,module,exports){
21919  * Regular expressions. Some of these are stupidly long.
21920  */
21922 /*jshint maxlen:1000 */
21924 "use strict";
21926 // Unsafe comment or string (ax)
21927 exports.unsafeString =
21928   /@cc|<\/?|script|\]\s*\]|<\s*!|&lt/i;
21930 // Characters in strings that need escaping (nx and nxg)
21931 exports.needEsc =
21932   /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/;
21934 exports.needEscGlobal =
21935   /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
21937 // Star slash (lx)
21938 exports.starSlash = /\*\//;
21940 // Identifier (ix)
21941 exports.identifier = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/;
21943 // JavaScript URL (jx)
21944 exports.javascriptURL = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i;
21946 // Catches /* falls through */ comments (ft)
21947 exports.fallsThrough = /^\s*falls?\sthrough\s*$/;
21949 // very conservative rule (eg: only one space between the start of the comment and the first character)
21950 // to relax the maxlen option
21951 exports.maxlenException = /^(?:(?:\/\/|\/\*|\*) ?)?[^ ]+$/;
21953 // Node.js releases prior to version 8 include a version of the V8 engine which
21954 // incorrectly interprets the character class escape `\s`. The following
21955 // regular expression may be replaced with `/\s/` when JSHint removes support
21956 // for Node.js versions prior to 8.
21957 // Source:
21958 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
21959 exports.whitespace = /[ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]/;
21961 },{}],19:[function(require,module,exports){
21962 "use strict";
21964 var _      = require("lodash");
21965 var events = require("events");
21967 // Used to denote membership in lookup tables (a primitive value such as `true`
21968 // would be silently rejected for the property name "__proto__" in some
21969 // environments)
21970 var marker = {};
21973  * Creates a scope manager that handles variables and labels, storing usages
21974  * and resolving when variables are used and undefined
21975  */
21976 var scopeManager = function(state, predefined, exported, declared) {
21978   var _current;
21979   var _scopeStack = [];
21981   function _newScope(type) {
21982     _current = {
21983       "(labels)": Object.create(null),
21984       "(usages)": Object.create(null),
21985       "(breakLabels)": Object.create(null),
21986       "(parent)": _current,
21987       "(type)": type,
21988       "(params)": (type === "functionparams" || type === "catchparams") ? [] : null
21989     };
21990     _scopeStack.push(_current);
21991   }
21993   _newScope("global");
21994   _current["(predefined)"] = predefined;
21996   var _currentFunctBody = _current; // this is the block after the params = function
21998   var usedPredefinedAndGlobals = Object.create(null);
21999   var impliedGlobals = Object.create(null);
22000   var unuseds = [];
22001   var emitter = new events.EventEmitter();
22003   function warning(code, token) {
22004     emitter.emit("warning", {
22005       code: code,
22006       token: token,
22007       data: _.slice(arguments, 2)
22008     });
22009   }
22011   function error(code, token) {
22012     emitter.emit("warning", {
22013       code: code,
22014       token: token,
22015       data: _.slice(arguments, 2)
22016     });
22017   }
22019   function _setupUsages(labelName) {
22020     if (!_current["(usages)"][labelName]) {
22021       _current["(usages)"][labelName] = {
22022         "(modified)": [],
22023         "(reassigned)": [],
22024         "(tokens)": []
22025       };
22026     }
22027   }
22029   var _getUnusedOption = function(unused_opt) {
22030     if (unused_opt === undefined) {
22031       unused_opt = state.option.unused;
22032     }
22034     if (unused_opt === true) {
22035       unused_opt = "last-param";
22036     }
22038     return unused_opt;
22039   };
22041   var _warnUnused = function(name, tkn, type, unused_opt) {
22042     var line = tkn.line;
22043     var chr  = tkn.from;
22044     var raw_name = tkn.raw_text || name;
22046     unused_opt = _getUnusedOption(unused_opt);
22048     var warnable_types = {
22049       "vars": ["var"],
22050       "last-param": ["var", "param"],
22051       "strict": ["var", "param", "last-param"]
22052     };
22054     if (unused_opt) {
22055       if (warnable_types[unused_opt] && warnable_types[unused_opt].indexOf(type) !== -1) {
22056         warning("W098", { line: line, from: chr }, raw_name);
22057       }
22058     }
22060     // inconsistent - see gh-1894
22061     if (unused_opt || type === "var") {
22062       unuseds.push({
22063         name: name,
22064         line: line,
22065         character: chr
22066       });
22067     }
22068   };
22070   /**
22071    * Checks the current scope for unused identifiers
22072    */
22073   function _checkForUnused() {
22074     // function params are handled specially
22075     // assume that parameters are the only thing declared in the param scope
22076     if (_current["(type)"] === "functionparams") {
22077       _checkParams();
22078       return;
22079     }
22080     var curentLabels = _current["(labels)"];
22081     for (var labelName in curentLabels) {
22082       if (curentLabels[labelName]["(type)"] !== "exception" &&
22083         curentLabels[labelName]["(unused)"]) {
22084         _warnUnused(labelName, curentLabels[labelName]["(token)"], "var");
22085       }
22086     }
22087   }
22089   /**
22090    * Checks the current scope for unused parameters
22091    * Must be called in a function parameter scope
22092    */
22093   function _checkParams() {
22094     var params = _current["(params)"];
22096     if (!params) {
22097       return;
22098     }
22100     var param = params.pop();
22101     var unused_opt;
22103     while (param) {
22104       var label = _current["(labels)"][param];
22106       unused_opt = _getUnusedOption(state.funct["(unusedOption)"]);
22108       // 'undefined' is a special case for (function(window, undefined) { ... })();
22109       // patterns.
22110       if (param === "undefined")
22111         return;
22113       if (label["(unused)"]) {
22114         _warnUnused(param, label["(token)"], "param", state.funct["(unusedOption)"]);
22115       } else if (unused_opt === "last-param") {
22116         return;
22117       }
22119       param = params.pop();
22120     }
22121   }
22123   /**
22124    * Finds the relevant label's scope, searching from nearest outwards
22125    * @returns {Object} the scope the label was found in
22126    */
22127   function _getLabel(labelName) {
22128     for (var i = _scopeStack.length - 1 ; i >= 0; --i) {
22129       var scopeLabels = _scopeStack[i]["(labels)"];
22130       if (scopeLabels[labelName]) {
22131         return scopeLabels;
22132       }
22133     }
22134   }
22136   function usedSoFarInCurrentFunction(labelName) {
22137     // used so far in this whole function and any sub functions
22138     for (var i = _scopeStack.length - 1; i >= 0; i--) {
22139       var current = _scopeStack[i];
22140       if (current["(usages)"][labelName]) {
22141         return current["(usages)"][labelName];
22142       }
22143       if (current === _currentFunctBody) {
22144         break;
22145       }
22146     }
22147     return false;
22148   }
22150   function _checkOuterShadow(labelName, token) {
22152     // only check if shadow is outer
22153     if (state.option.shadow !== "outer") {
22154       return;
22155     }
22157     var isGlobal = _currentFunctBody["(type)"] === "global",
22158       isNewFunction = _current["(type)"] === "functionparams";
22160     var outsideCurrentFunction = !isGlobal;
22161     for (var i = 0; i < _scopeStack.length; i++) {
22162       var stackItem = _scopeStack[i];
22164       if (!isNewFunction && _scopeStack[i + 1] === _currentFunctBody) {
22165         outsideCurrentFunction = false;
22166       }
22167       if (outsideCurrentFunction && stackItem["(labels)"][labelName]) {
22168         warning("W123", token, labelName);
22169       }
22170       if (stackItem["(breakLabels)"][labelName]) {
22171         warning("W123", token, labelName);
22172       }
22173     }
22174   }
22176   function _latedefWarning(type, labelName, token) {
22177     var isFunction;
22179     if (state.option.latedef) {
22180       isFunction = type === "function" || type === "generator function";
22182       // if either latedef is strict and this is a function
22183       //    or this is not a function
22184       if ((state.option.latedef === true && isFunction) || !isFunction) {
22185         warning("W003", token, labelName);
22186       }
22187     }
22188   }
22190   var scopeManagerInst = {
22192     on: function(names, listener) {
22193       names.split(" ").forEach(function(name) {
22194         emitter.on(name, listener);
22195       });
22196     },
22198     isPredefined: function(labelName) {
22199       return !this.has(labelName) && _.has(_scopeStack[0]["(predefined)"], labelName);
22200     },
22202     /**
22203      * Tell the manager we are entering a new block of code
22204      * @param {string} [type] - The type of the block. Valid values are
22205      *                          "functionparams", "catchparams" and
22206      *                          "functionouter"
22207      */
22208     stack: function(type) {
22209       var previousScope = _current;
22210       _newScope(type);
22212       if (!type && previousScope["(type)"] === "functionparams") {
22214         _current["(isFuncBody)"] = true;
22215         _currentFunctBody = _current;
22216       }
22217     },
22219     unstack: function() {
22220       // jshint proto: true
22221       var subScope = _scopeStack.length > 1 ? _scopeStack[_scopeStack.length - 2] : null;
22222       var isUnstackingFunctionBody = _current === _currentFunctBody,
22223         isUnstackingFunctionParams = _current["(type)"] === "functionparams",
22224         isUnstackingFunctionOuter = _current["(type)"] === "functionouter";
22226       var i, j, isImmutable;
22227       var currentUsages = _current["(usages)"];
22228       var currentLabels = _current["(labels)"];
22229       var usedLabelNameList = Object.keys(currentUsages);
22231       /* istanbul ignore if */
22232       if (currentUsages.__proto__ && usedLabelNameList.indexOf("__proto__") === -1) {
22233         usedLabelNameList.push("__proto__");
22234       }
22236       for (i = 0; i < usedLabelNameList.length; i++) {
22237         var usedLabelName = usedLabelNameList[i];
22239         var usage = currentUsages[usedLabelName];
22240         var usedLabel = currentLabels[usedLabelName];
22241         if (usedLabel) {
22242           var usedLabelType = usedLabel["(type)"];
22243           isImmutable = usedLabelType === "const" || usedLabelType === "import";
22245           if (usedLabel["(useOutsideOfScope)"] && !state.option.funcscope) {
22246             var usedTokens = usage["(tokens)"];
22247             for (j = 0; j < usedTokens.length; j++) {
22248               // Keep the consistency of https://github.com/jshint/jshint/issues/2409
22249               if (usedLabel["(function)"] === usedTokens[j]["(function)"]) {
22250                 error("W038", usedTokens[j], usedLabelName);
22251               }
22252             }
22253           }
22255           // mark the label used
22256           _current["(labels)"][usedLabelName]["(unused)"] = false;
22258           // check for modifying a const
22259           if (isImmutable && usage["(modified)"]) {
22260             for (j = 0; j < usage["(modified)"].length; j++) {
22261               error("E013", usage["(modified)"][j], usedLabelName);
22262             }
22263           }
22265           // check for re-assigning a function declaration
22266           if ((usedLabelType === "function" || usedLabelType === "generator function" ||
22267             usedLabelType === "class") && usage["(reassigned)"]) {
22268             for (j = 0; j < usage["(reassigned)"].length; j++) {
22269               if (!usage["(reassigned)"][j].ignoreW021) {
22270                 warning("W021", usage["(reassigned)"][j], usedLabelName, usedLabelType);
22271               }
22272             }
22273           }
22274           continue;
22275         }
22277         if (subScope) {
22278           var labelType = this.labeltype(usedLabelName);
22279           isImmutable = labelType === "const" ||
22280             (labelType === null && _scopeStack[0]["(predefined)"][usedLabelName] === false);
22281           if (isUnstackingFunctionOuter && !isImmutable) {
22282             if (!state.funct["(outerMutables)"]) {
22283               state.funct["(outerMutables)"] = [];
22284             }
22285             state.funct["(outerMutables)"].push(usedLabelName);
22286           }
22288           // not exiting the global scope, so copy the usage down in case its an out of scope usage
22289           if (!subScope["(usages)"][usedLabelName]) {
22290             subScope["(usages)"][usedLabelName] = usage;
22291             if (isUnstackingFunctionBody) {
22292               subScope["(usages)"][usedLabelName]["(onlyUsedSubFunction)"] = true;
22293             }
22294           } else {
22295             var subScopeUsage = subScope["(usages)"][usedLabelName];
22296             subScopeUsage["(modified)"] = subScopeUsage["(modified)"].concat(usage["(modified)"]);
22297             subScopeUsage["(tokens)"] = subScopeUsage["(tokens)"].concat(usage["(tokens)"]);
22298             subScopeUsage["(reassigned)"] =
22299               subScopeUsage["(reassigned)"].concat(usage["(reassigned)"]);
22300           }
22301         } else {
22302           // this is exiting global scope, so we finalise everything here - we are at the end of the file
22303           if (typeof _current["(predefined)"][usedLabelName] === "boolean") {
22305             // remove the declared token, so we know it is used
22306             delete declared[usedLabelName];
22308             // note it as used so it can be reported
22309             usedPredefinedAndGlobals[usedLabelName] = marker;
22311             // check for re-assigning a read-only (set to false) predefined
22312             if (_current["(predefined)"][usedLabelName] === false && usage["(reassigned)"]) {
22313               for (j = 0; j < usage["(reassigned)"].length; j++) {
22314                 if (!usage["(reassigned)"][j].ignoreW020) {
22315                   warning("W020", usage["(reassigned)"][j]);
22316                 }
22317               }
22318             }
22319           }
22320           else {
22321             // label usage is not predefined and we have not found a declaration
22322             // so report as undeclared
22323             for (j = 0; j < usage["(tokens)"].length; j++) {
22324               var undefinedToken = usage["(tokens)"][j];
22325               // if its not a forgiven undefined (e.g. typof x)
22326               if (!undefinedToken.forgiveUndef) {
22327                 // if undef is on and undef was on when the token was defined
22328                 if (state.option.undef && !undefinedToken.ignoreUndef) {
22329                   warning("W117", undefinedToken, usedLabelName);
22330                 }
22331                 if (impliedGlobals[usedLabelName]) {
22332                   impliedGlobals[usedLabelName].line.push(undefinedToken.line);
22333                 } else {
22334                   impliedGlobals[usedLabelName] = {
22335                     name: usedLabelName,
22336                     line: [undefinedToken.line]
22337                   };
22338                 }
22339               }
22340             }
22341           }
22342         }
22343       }
22345       // if exiting the global scope, we can warn about declared globals that haven't been used yet
22346       if (!subScope) {
22347         Object.keys(declared)
22348           .forEach(function(labelNotUsed) {
22349             _warnUnused(labelNotUsed, declared[labelNotUsed], "var");
22350           });
22351       }
22353       // If this is not a function boundary, transfer function-scoped labels to
22354       // the parent block (a rough simulation of variable hoisting). Previously
22355       // existing labels in the parent block should take precedence so that things and stuff.
22356       if (subScope && !isUnstackingFunctionBody &&
22357         !isUnstackingFunctionParams && !isUnstackingFunctionOuter) {
22358         var labelNames = Object.keys(currentLabels);
22359         for (i = 0; i < labelNames.length; i++) {
22361           var defLabelName = labelNames[i];
22362           var defLabel = currentLabels[defLabelName];
22364           if (!defLabel["(blockscoped)"] && defLabel["(type)"] !== "exception") {
22365             var shadowed = subScope["(labels)"][defLabelName];
22367             // Do not overwrite a label if it exists in the parent scope
22368             // because it is shared by adjacent blocks. Copy the `unused`
22369             // property so that any references found within the current block
22370             // are counted toward that higher-level declaration.
22371             if (shadowed) {
22372               shadowed["(unused)"] &= defLabel["(unused)"];
22374             // "Hoist" the variable to the parent block, decorating the label
22375             // so that future references, though technically valid, can be
22376             // reported as "out-of-scope" in the absence of the `funcscope`
22377             // option.
22378             } else {
22379               defLabel["(useOutsideOfScope)"] =
22380                 // Do not warn about out-of-scope usages in the global scope
22381                 _currentFunctBody["(type)"] !== "global" &&
22382                 // When a higher scope contains a binding for the label, the
22383                 // label is a re-declaration and should not prompt "used
22384                 // out-of-scope" warnings.
22385                 !this.funct.has(defLabelName, { excludeCurrent: true });
22387               subScope["(labels)"][defLabelName] = defLabel;
22388             }
22390             delete currentLabels[defLabelName];
22391           }
22392         }
22393       }
22395       _checkForUnused();
22397       _scopeStack.pop();
22398       if (isUnstackingFunctionBody) {
22399         _currentFunctBody = _scopeStack[_.findLastIndex(_scopeStack, function(scope) {
22400           // if function or if global (which is at the bottom so it will only return true if we call back)
22401           return scope["(isFuncBody)"] || scope["(type)"] === "global";
22402         })];
22403       }
22405       _current = subScope;
22406     },
22408     /**
22409      * Add a param to the current scope
22410      * @param {string} labelName
22411      * @param {Token} token
22412      * @param {string} [type="param"] param type
22413      */
22414     addParam: function(labelName, token, type) {
22415       type = type || "param";
22417       if (type === "exception") {
22418         // if defined in the current function
22419         var previouslyDefinedLabelType = this.funct.labeltype(labelName);
22420         if (previouslyDefinedLabelType && previouslyDefinedLabelType !== "exception") {
22421           // and has not been used yet in the current function scope
22422           if (!state.option.node) {
22423             warning("W002", state.tokens.next, labelName);
22424           }
22425         }
22427         if (state.isStrict() && (labelName === "arguments" || labelName === "eval")) {
22428           warning("E008", token);
22429         }
22430       }
22432       // The variable was declared in the current scope
22433       if (_.has(_current["(labels)"], labelName)) {
22434         _current["(labels)"][labelName].duplicated = true;
22436       // The variable was declared in an outer scope
22437       } else {
22438         // if this scope has the variable defined, it's a re-definition error
22439         _checkOuterShadow(labelName, token);
22441         _current["(labels)"][labelName] = {
22442           "(type)" : type,
22443           "(token)": token,
22444           "(unused)": true };
22446         _current["(params)"].push(labelName);
22447       }
22449       if (_.has(_current["(usages)"], labelName)) {
22450         var usage = _current["(usages)"][labelName];
22451         // if its in a sub function it is not necessarily an error, just latedef
22452         if (usage["(onlyUsedSubFunction)"]) {
22453           _latedefWarning(type, labelName, token);
22454         } else {
22455           // this is a clear illegal usage for block scoped variables
22456           warning("E056", token, labelName, type);
22457         }
22458       }
22459     },
22461     validateParams: function(isArrow) {
22462       var isStrict = state.isStrict();
22463       var currentFunctParamScope = _currentFunctBody["(parent)"];
22465       if (!currentFunctParamScope["(params)"]) {
22466         return;
22467       }
22469       currentFunctParamScope["(params)"].forEach(function(labelName) {
22470         var label = currentFunctParamScope["(labels)"][labelName];
22472         if (label.duplicated) {
22473           if (isStrict || isArrow) {
22474             warning("E011", label["(token)"], labelName);
22475           } else if (state.option.shadow !== true) {
22476             warning("W004", label["(token)"], labelName);
22477           }
22478         }
22480         if (isStrict && (labelName === "arguments" || labelName === "eval")) {
22481           warning("E008", label["(token)"]);
22482         }
22483       });
22484     },
22486     getUsedOrDefinedGlobals: function() {
22487       // jshint proto: true
22488       var list = Object.keys(usedPredefinedAndGlobals);
22490       // If `__proto__` is used as a global variable name, its entry in the
22491       // lookup table may not be enumerated by `Object.keys` (depending on the
22492       // environment).
22493       /* istanbul ignore if */
22494       if (usedPredefinedAndGlobals.__proto__ === marker &&
22495         list.indexOf("__proto__") === -1) {
22496         list.push("__proto__");
22497       }
22499       return list;
22500     },
22502     /**
22503      * Gets an array of implied globals
22504      * @returns {Array.<{ name: string, line: Array.<number>}>}
22505      */
22506     getImpliedGlobals: function() {
22507       // jshint proto: true
22508       var values = _.values(impliedGlobals);
22509       var hasProto = false;
22511       // If `__proto__` is an implied global variable, its entry in the lookup
22512       // table may not be enumerated by `_.values` (depending on the
22513       // environment).
22514       if (impliedGlobals.__proto__) {
22515         hasProto = values.some(function(value) {
22516           return value.name === "__proto__";
22517         });
22519         /* istanbul ignore if */
22520         if (!hasProto) {
22521           values.push(impliedGlobals.__proto__);
22522         }
22523       }
22525       return values;
22526     },
22528     /**
22529      * Returns a list of unused variables
22530      * @returns {Array}
22531      */
22532     getUnuseds: function() {
22533       return unuseds;
22534     },
22536     has: function(labelName) {
22537       return Boolean(_getLabel(labelName));
22538     },
22540     labeltype: function(labelName) {
22541       // returns a labels type or null if not present
22542       var scopeLabels = _getLabel(labelName);
22543       if (scopeLabels) {
22544         return scopeLabels[labelName]["(type)"];
22545       }
22546       return null;
22547     },
22549     /**
22550      * for the exported options, indicating a variable is used outside the file
22551      */
22552     addExported: function(labelName) {
22553       var globalLabels = _scopeStack[0]["(labels)"];
22554       if (_.has(declared, labelName)) {
22555         // remove the declared token, so we know it is used
22556         delete declared[labelName];
22557       } else if (_.has(globalLabels, labelName)) {
22558         globalLabels[labelName]["(unused)"] = false;
22559       } else {
22560         for (var i = 1; i < _scopeStack.length; i++) {
22561           var scope = _scopeStack[i];
22562           // if `scope.(type)` is not defined, it is a block scope
22563           if (!scope["(type)"]) {
22564             if (_.has(scope["(labels)"], labelName) &&
22565                 !scope["(labels)"][labelName]["(blockscoped)"]) {
22566               scope["(labels)"][labelName]["(unused)"] = false;
22567               return;
22568             }
22569           } else {
22570             break;
22571           }
22572         }
22573         exported[labelName] = true;
22574       }
22575     },
22577     /**
22578      * Mark an indentifier as es6 module exported
22579      */
22580     setExported: function(labelName, token) {
22581       this.block.use(labelName, token);
22582     },
22584     initialize: function(labelName) {
22585       if (_current["(labels)"][labelName]) {
22586         _current["(labels)"][labelName]["(initialized)"] = true;
22587       }
22588     },
22590     /**
22591      * adds an indentifier to the relevant current scope and creates warnings/errors as necessary
22592      * @param {string} labelName
22593      * @param {Object} opts
22594      * @param {String} opts.type - the type of the label e.g. "param", "var", "let, "const", "import", "function", "generator function"
22595      * @param {Token} opts.token - the token pointing at the declaration
22596      * @param {boolean} opts.initialized - whether the binding should be created in an "initialized" state.
22597      */
22598     addlabel: function(labelName, opts) {
22600       var type  = opts.type;
22601       var token = opts.token;
22602       var isblockscoped = type === "let" || type === "const" ||
22603         type === "class" || type === "import" || type === "generator function";
22604       var ishoisted = type === "function" || type === "generator function" ||
22605         type === "import";
22606       var isexported    = (isblockscoped ? _current : _currentFunctBody)["(type)"] === "global" &&
22607                           _.has(exported, labelName);
22609       // outer shadow check (inner is only on non-block scoped)
22610       _checkOuterShadow(labelName, token);
22612       if (state.isStrict() && (labelName === "arguments" || labelName === "eval")) {
22613         warning("E008", token);
22614       }
22616       if (isblockscoped) {
22618         var declaredInCurrentScope = _current["(labels)"][labelName];
22619         // for block scoped variables, params are seen in the current scope as the root function
22620         // scope, so check these too.
22621         if (!declaredInCurrentScope && _current === _currentFunctBody &&
22622           _current["(type)"] !== "global") {
22623           declaredInCurrentScope = !!_currentFunctBody["(parent)"]["(labels)"][labelName];
22624         }
22626         // if its not already defined (which is an error, so ignore) and is used in TDZ
22627         if (!declaredInCurrentScope && _current["(usages)"][labelName]) {
22628           var usage = _current["(usages)"][labelName];
22629           // if its in a sub function it is not necessarily an error, just latedef
22630           if (usage["(onlyUsedSubFunction)"] || ishoisted) {
22631             _latedefWarning(type, labelName, token);
22632           } else if (!ishoisted) {
22633             // this is a clear illegal usage for block scoped variables
22634             warning("E056", token, labelName, type);
22635           }
22636         }
22638         // If this scope has already declared a binding with the same name,
22639         // then this represents a redeclaration error if:
22640         //
22641         // 1. it is a "hoisted" block-scoped binding within a block. For
22642         //    instance: generator functions may be redeclared in the global
22643         //    scope but not within block statements
22644         // 2. this is not a "hoisted" block-scoped binding
22645         if (declaredInCurrentScope &&
22646           (!ishoisted || (_current["(type)"] !== "global" || type === "import"))) {
22647           warning("E011", token, labelName);
22648         }
22649         else if (state.option.shadow === "outer") {
22651           // if shadow is outer, for block scope we want to detect any shadowing within this function
22652           if (scopeManagerInst.funct.has(labelName)) {
22653             warning("W004", token, labelName);
22654           }
22655         }
22657         scopeManagerInst.block.add(
22658           labelName, type, token, !isexported, opts.initialized
22659         );
22661       } else {
22663         var declaredInCurrentFunctionScope = scopeManagerInst.funct.has(labelName);
22665         // check for late definition, ignore if already declared
22666         if (!declaredInCurrentFunctionScope && usedSoFarInCurrentFunction(labelName)) {
22667           _latedefWarning(type, labelName, token);
22668         }
22670         // defining with a var or a function when a block scope variable of the same name
22671         // is in scope is an error
22672         if (scopeManagerInst.funct.has(labelName, { onlyBlockscoped: true })) {
22673           warning("E011", token, labelName);
22674         } else if (state.option.shadow !== true) {
22675           // now since we didn't get any block scope variables, test for var/function
22676           // shadowing
22677           if (declaredInCurrentFunctionScope && labelName !== "__proto__") {
22679             // see https://github.com/jshint/jshint/issues/2400
22680             if (_currentFunctBody["(type)"] !== "global") {
22681               warning("W004", token, labelName);
22682             }
22683           }
22684         }
22686         scopeManagerInst.funct.add(labelName, type, token, !isexported);
22688         if (_currentFunctBody["(type)"] === "global" && !state.impliedClosure()) {
22689           usedPredefinedAndGlobals[labelName] = marker;
22690         }
22691       }
22692     },
22694     funct: {
22695       /**
22696        * Returns the label type given certain options
22697        * @param labelName
22698        * @param {Object=} options
22699        * @param {Boolean=} options.onlyBlockscoped - only include block scoped labels
22700        * @param {Boolean=} options.excludeParams - exclude the param scope
22701        * @param {Boolean=} options.excludeCurrent - exclude the current scope
22702        * @returns {String}
22703        */
22704       labeltype: function(labelName, options) {
22705         var onlyBlockscoped = options && options.onlyBlockscoped;
22706         var excludeParams = options && options.excludeParams;
22707         var currentScopeIndex = _scopeStack.length - (options && options.excludeCurrent ? 2 : 1);
22708         for (var i = currentScopeIndex; i >= 0; i--) {
22709           var current = _scopeStack[i];
22710           if (current["(labels)"][labelName] &&
22711             (!onlyBlockscoped || current["(labels)"][labelName]["(blockscoped)"])) {
22712             return current["(labels)"][labelName]["(type)"];
22713           }
22714           var scopeCheck = excludeParams ? _scopeStack[ i - 1 ] : current;
22715           if (scopeCheck && scopeCheck["(type)"] === "functionparams") {
22716             return null;
22717           }
22718         }
22719         return null;
22720       },
22721       /**
22722        * Returns if a break label exists in the function scope
22723        * @param {string} labelName
22724        * @returns {boolean}
22725        */
22726       hasBreakLabel: function(labelName) {
22727         for (var i = _scopeStack.length - 1; i >= 0; i--) {
22728           var current = _scopeStack[i];
22730           if (current["(breakLabels)"][labelName]) {
22731             return true;
22732           }
22733           if (current["(type)"] === "functionparams") {
22734             return false;
22735           }
22736         }
22737         return false;
22738       },
22739       /**
22740        * Returns if the label is in the current function scope
22741        * See scopeManager.funct.labelType for options
22742        */
22743       has: function(labelName, options) {
22744         return Boolean(this.labeltype(labelName, options));
22745       },
22747       /**
22748        * Adds a new function scoped variable
22749        * see block.add for block scoped
22750        */
22751       add: function(labelName, type, tok, unused) {
22752         _current["(labels)"][labelName] = {
22753           "(type)" : type,
22754           "(token)": tok,
22755           "(blockscoped)": false,
22756           "(function)": _currentFunctBody,
22757           "(unused)": unused };
22758       }
22759     },
22761     block: {
22763       /**
22764        * is the current block global?
22765        * @returns Boolean
22766        */
22767       isGlobal: function() {
22768         return _current["(type)"] === "global";
22769       },
22771       use: function(labelName, token) {
22773         // if resolves to current function params, then do not store usage just resolve
22774         // this is because function(a) { var a; a = a; } will resolve to the param, not
22775         // to the unset var
22776         // first check the param is used
22777         var paramScope = _currentFunctBody["(parent)"];
22778         if (paramScope && paramScope["(labels)"][labelName] &&
22779           paramScope["(labels)"][labelName]["(type)"] === "param") {
22781           // then check its not declared by a block scope variable
22782           if (!scopeManagerInst.funct.has(labelName,
22783                 { excludeParams: true, onlyBlockscoped: true })) {
22784             paramScope["(labels)"][labelName]["(unused)"] = false;
22785           }
22786         }
22788         if (token && (state.ignored.W117 || state.option.undef === false)) {
22789           token.ignoreUndef = true;
22790         }
22792         _setupUsages(labelName);
22794         _current["(usages)"][labelName]["(onlyUsedSubFunction)"] = false;
22796         if (token) {
22797           token["(function)"] = _currentFunctBody;
22798           _current["(usages)"][labelName]["(tokens)"].push(token);
22799         }
22801         // blockscoped vars can't be used within their initializer (TDZ)
22802         var label = _current["(labels)"][labelName];
22803         if (label && label["(blockscoped)"] && !label["(initialized)"]) {
22804           error("E056", token, labelName, label["(type)"]);
22805         }
22806       },
22808       reassign: function(labelName, token) {
22809         token.ignoreW020 = state.ignored.W020;
22810         token.ignoreW021 = state.ignored.W021;
22812         this.modify(labelName, token);
22814         _current["(usages)"][labelName]["(reassigned)"].push(token);
22815       },
22817       modify: function(labelName, token) {
22819         _setupUsages(labelName);
22821         _current["(usages)"][labelName]["(onlyUsedSubFunction)"] = false;
22822         _current["(usages)"][labelName]["(modified)"].push(token);
22823       },
22825       /**
22826        * Adds a new variable
22827        */
22828       add: function(labelName, type, tok, unused, initialized) {
22829         _current["(labels)"][labelName] = {
22830           "(type)" : type,
22831           "(token)": tok,
22832           "(initialized)": !!initialized,
22833           "(blockscoped)": true,
22834           "(unused)": unused };
22835       },
22837       addBreakLabel: function(labelName, opts) {
22838         var token = opts.token;
22839         if (scopeManagerInst.funct.hasBreakLabel(labelName)) {
22840           warning("E011", token, labelName);
22841         }
22842         else if (state.option.shadow === "outer") {
22843           if (scopeManagerInst.funct.has(labelName)) {
22844             warning("W004", token, labelName);
22845           } else {
22846             _checkOuterShadow(labelName, token);
22847           }
22848         }
22849         _current["(breakLabels)"][labelName] = token;
22850       }
22851     }
22852   };
22853   return scopeManagerInst;
22856 module.exports = scopeManager;
22858 },{"events":6,"lodash":13}],20:[function(require,module,exports){
22859 "use strict";
22860 var NameStack = require("./name-stack.js");
22862 var state = {
22863   syntax: {},
22865   /**
22866    * Determine if the code currently being linted is strict mode code.
22867    *
22868    * @returns {boolean}
22869    */
22870   isStrict: function() {
22871     return this.directive["use strict"] || this.inClassBody ||
22872       this.option.module || this.option.strict === "implied";
22873   },
22875   /**
22876    * Determine if the current state warrants a warning for statements outside
22877    * of strict mode code.
22878    *
22879    * While emitting warnings based on function scope would be more intuitive
22880    * (and less noisy), JSHint observes statement-based semantics in order to
22881    * preserve legacy behavior.
22882    *
22883    * This method does not take the state of the parser into account, making no
22884    * distinction between global code and function code. Because the "missing
22885    * 'use strict'" warning is *also* reported at function boundaries, this
22886    * function interprets `strict` option values `true` and `undefined` as
22887    * equivalent.
22888    */
22889   stmtMissingStrict: function() {
22890     if (this.option.strict === "global") {
22891       return true;
22892     }
22894     if (this.option.strict === false) {
22895       return false;
22896     }
22898     if (this.option.globalstrict) {
22899       return true;
22900     }
22902     return false;
22903   },
22905   allowsGlobalUsd: function() {
22906     return this.option.strict === "global" || this.option.globalstrict ||
22907       this.option.module || this.impliedClosure();
22908   },
22910   /**
22911    * Determine if the current configuration describes an environment that is
22912    * wrapped in an immediately-invoked function expression prior to evaluation.
22913    *
22914    * @returns {boolean}
22915    */
22916   impliedClosure: function() {
22917     return this.option.node || this.option.phantom || this.option.browserify;
22918   },
22920   // Assumption: chronologically ES3 < ES5 < ES6 < Moz
22922   inMoz: function() {
22923     return this.option.moz;
22924   },
22926   /**
22927    * @param {boolean} strict - When `true`, only consider ES6 when in
22928    *                           "esversion: 6" code.
22929    */
22930   inES6: function(strict) {
22931     if (strict) {
22932       return this.esVersion === 6;
22933     }
22934     return this.option.moz || this.esVersion >= 6;
22935   },
22937   /**
22938    * @param {boolean} strict - When `true`, return `true` only when
22939    *                           esVersion is exactly 5
22940    */
22941   inES5: function(strict) {
22942     if (strict) {
22943       return (!this.esVersion || this.esVersion === 5) && !this.option.moz;
22944     }
22945     return !this.esVersion || this.esVersion >= 5 || this.option.moz;
22946   },
22948   /**
22949    * Determine the current version of the input language by inspecting the
22950    * value of all ECMAScript-version-related options. This logic is necessary
22951    * to ensure compatibility with deprecated options `es3`, `es5`, and
22952    * `esnext`, and it may be drastically simplified when those options are
22953    * removed.
22954    *
22955    * @returns {string|null} - the name of any incompatible option detected,
22956    *                          `null` otherwise
22957    */
22958   inferEsVersion: function() {
22959     var badOpt = null;
22961     if (this.option.esversion) {
22962       if (this.option.es3) {
22963         badOpt = "es3";
22964       } else if (this.option.es5) {
22965         badOpt = "es5";
22966       } else if (this.option.esnext) {
22967         badOpt = "esnext";
22968       }
22970       if (badOpt) {
22971         return badOpt;
22972       }
22974       if (this.option.esversion === 2015) {
22975         this.esVersion = 6;
22976       } else {
22977         this.esVersion = this.option.esversion;
22978       }
22979     } else if (this.option.es3) {
22980       this.esVersion = 3;
22981     } else if (this.option.esnext) {
22982       this.esVersion = 6;
22983     }
22985     return null;
22986   },
22988   reset: function() {
22989     this.tokens = {
22990       prev: null,
22991       next: null,
22992       curr: null
22993     };
22995     this.option = {};
22996     this.esVersion = 5;
22997     this.funct = null;
22998     this.ignored = {};
22999     this.directive = Object.create(null);
23000     this.jsonMode = false;
23001     this.lines = [];
23002     this.tab = "";
23003     this.cache = {}; // Node.JS doesn't have Map. Sniff.
23004     this.ignoredLines = {};
23005     this.forinifcheckneeded = false;
23006     this.nameStack = new NameStack();
23007     this.inClassBody = false;
23008   }
23011 exports.state = state;
23013 },{"./name-stack.js":16}],21:[function(require,module,exports){
23014 "use strict";
23016 exports.register = function(linter) {
23017   // Check for properties named __proto__. This special property was
23018   // deprecated and then re-introduced for ES6.
23020   linter.on("Identifier", function style_scanProto(data) {
23021     if (linter.getOption("proto")) {
23022       return;
23023     }
23025     if (data.name === "__proto__") {
23026       linter.warn("W103", {
23027         line: data.line,
23028         char: data.char,
23029         data: [ data.name, "6" ]
23030       });
23031     }
23032   });
23034   // Check for properties named __iterator__. This is a special property
23035   // available only in browsers with JavaScript 1.7 implementation, but
23036   // it is deprecated for ES6
23038   linter.on("Identifier", function style_scanIterator(data) {
23039     if (linter.getOption("iterator")) {
23040       return;
23041     }
23043     if (data.name === "__iterator__") {
23044       linter.warn("W103", {
23045         line: data.line,
23046         char: data.char,
23047         data: [ data.name ]
23048       });
23049     }
23050   });
23052   // Check that all identifiers are using camelCase notation.
23053   // Exceptions: names like MY_VAR and _myVar.
23055   linter.on("Identifier", function style_scanCamelCase(data) {
23056     if (!linter.getOption("camelcase")) {
23057       return;
23058     }
23060     if (data.name.replace(/^_+|_+$/g, "").indexOf("_") > -1 && !data.name.match(/^[A-Z0-9_]*$/)) {
23061       linter.warn("W106", {
23062         line: data.line,
23063         char: data.char,
23064         data: [ data.name ]
23065       });
23066     }
23067   });
23069   // Enforce consistency in style of quoting.
23071   linter.on("String", function style_scanQuotes(data) {
23072     var quotmark = linter.getOption("quotmark");
23073     var code;
23075     if (!quotmark) {
23076       return;
23077     }
23079     // If quotmark is set to 'single' warn about all double-quotes.
23081     if (quotmark === "single" && data.quote !== "'") {
23082       code = "W109";
23083     }
23085     // If quotmark is set to 'double' warn about all single-quotes.
23087     if (quotmark === "double" && data.quote !== "\"") {
23088       code = "W108";
23089     }
23091     // If quotmark is set to true, remember the first quotation style
23092     // and then warn about all others.
23094     if (quotmark === true) {
23095       if (!linter.getCache("quotmark")) {
23096         linter.setCache("quotmark", data.quote);
23097       }
23099       if (linter.getCache("quotmark") !== data.quote) {
23100         code = "W110";
23101       }
23102     }
23104     if (code) {
23105       linter.warn(code, {
23106         line: data.line,
23107         char: data.char,
23108       });
23109     }
23110   });
23112   linter.on("Number", function style_scanNumbers(data) {
23113     if (data.value.charAt(0) === ".") {
23114       // Warn about a leading decimal point.
23115       linter.warn("W008", {
23116         line: data.line,
23117         char: data.char,
23118         data: [ data.value ]
23119       });
23120     }
23122     if (data.value.substr(data.value.length - 1) === ".") {
23123       // Warn about a trailing decimal point.
23124       linter.warn("W047", {
23125         line: data.line,
23126         char: data.char,
23127         data: [ data.value ]
23128       });
23129     }
23131     if (/^00+/.test(data.value)) {
23132       // Multiple leading zeroes.
23133       linter.warn("W046", {
23134         line: data.line,
23135         char: data.char,
23136         data: [ data.value ]
23137       });
23138     }
23139   });
23141   // Warn about script URLs.
23143   linter.on("String", function style_scanJavaScriptURLs(data) {
23144     var re = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i;
23146     if (linter.getOption("scripturl")) {
23147       return;
23148     }
23150     if (re.test(data.value)) {
23151       linter.warn("W107", {
23152         line: data.line,
23153         char: data.char
23154       });
23155     }
23156   });
23159 },{}],22:[function(require,module,exports){
23160 // jshint -W001
23162 "use strict";
23164 // Identifiers provided by the ECMAScript standard.
23166 exports.reservedVars = {
23167   NaN       : false,
23168   undefined : false
23171 exports.ecmaIdentifiers = {
23172   3: {
23173     Array              : false,
23174     Boolean            : false,
23175     Date               : false,
23176     decodeURI          : false,
23177     decodeURIComponent : false,
23178     encodeURI          : false,
23179     encodeURIComponent : false,
23180     Error              : false,
23181     "eval"             : false,
23182     EvalError          : false,
23183     Function           : false,
23184     hasOwnProperty     : false,
23185     Infinity           : false,
23186     isFinite           : false,
23187     isNaN              : false,
23188     Math               : false,
23189     Number             : false,
23190     Object             : false,
23191     parseInt           : false,
23192     parseFloat         : false,
23193     RangeError         : false,
23194     ReferenceError     : false,
23195     RegExp             : false,
23196     String             : false,
23197     SyntaxError        : false,
23198     TypeError          : false,
23199     URIError           : false
23200   },
23201   5: {
23202     JSON               : false
23203   },
23204   6: {
23205     ArrayBuffer        : false,
23206     DataView           : false,
23207     Float32Array       : false,
23208     Float64Array       : false,
23209     Int8Array          : false,
23210     Int16Array         : false,
23211     Int32Array         : false,
23212     Map                : false,
23213     Promise            : false,
23214     Proxy              : false,
23215     Reflect            : false,
23216     Set                : false,
23217     Symbol             : false,
23218     Uint8Array         : false,
23219     Uint16Array        : false,
23220     Uint32Array        : false,
23221     Uint8ClampedArray  : false,
23222     WeakMap            : false,
23223     WeakSet            : false
23224   }
23227 // Global variables commonly provided by a web browser environment.
23229 exports.browser = {
23230   Audio                : false,
23231   Blob                 : false,
23232   addEventListener     : false,
23233   applicationCache     : false,
23234   atob                 : false,
23235   blur                 : false,
23236   btoa                 : false,
23237   cancelAnimationFrame : false,
23238   CanvasGradient       : false,
23239   CanvasPattern        : false,
23240   CanvasRenderingContext2D: false,
23241   CSS                  : false,
23242   CSSImportRule        : false,
23243   CSSGroupingRule      : false,
23244   CSSMarginRule        : false,
23245   CSSMediaRule         : false,
23246   CSSNamespaceRule     : false,
23247   CSSPageRule          : false,
23248   CSSRule              : false,
23249   CSSRuleList          : false,
23250   CSSStyleDeclaration  : false,
23251   CSSStyleRule         : false,
23252   CSSStyleSheet        : false,
23253   clearInterval        : false,
23254   clearTimeout         : false,
23255   close                : false,
23256   closed               : false,
23257   Comment              : false,
23258   CompositionEvent     : false,
23259   CustomEvent          : false,
23260   DOMParser            : false,
23261   defaultStatus        : false,
23262   Document             : false,
23263   document             : false,
23264   DocumentFragment     : false,
23265   Element              : false,
23266   ElementTimeControl   : false,
23267   Event                : false,
23268   event                : false,
23269   fetch                : false,
23270   File                 : false,
23271   FileList             : false,
23272   FileReader           : false,
23273   FormData             : false,
23274   focus                : false,
23275   frames               : false,
23276   getComputedStyle     : false,
23277   Headers              : false,
23278   HTMLAnchorElement    : false,
23279   HTMLAreaElement      : false,
23280   HTMLAudioElement     : false,
23281   HTMLBaseElement      : false,
23282   HTMLBlockquoteElement: false,
23283   HTMLBodyElement      : false,
23284   HTMLBRElement        : false,
23285   HTMLButtonElement    : false,
23286   HTMLCanvasElement    : false,
23287   HTMLCollection       : false,
23288   HTMLDataElement      : false,
23289   HTMLDataListElement  : false,
23290   HTMLDetailsElement   : false,
23291   HTMLDialogElement    : false,
23292   HTMLDirectoryElement : false,
23293   HTMLDivElement       : false,
23294   HTMLDListElement     : false,
23295   HTMLElement          : false,
23296   HTMLEmbedElement     : false,
23297   HTMLFieldSetElement  : false,
23298   HTMLFontElement      : false,
23299   HTMLFormElement      : false,
23300   HTMLFrameElement     : false,
23301   HTMLFrameSetElement  : false,
23302   HTMLHeadElement      : false,
23303   HTMLHeadingElement   : false,
23304   HTMLHRElement        : false,
23305   HTMLHtmlElement      : false,
23306   HTMLIFrameElement    : false,
23307   HTMLImageElement     : false,
23308   HTMLInputElement     : false,
23309 /* HTMLIsIndexElement was removed from the WHATWG HTML spec;
23310    see https://github.com/whatwg/html/pull/1095.
23311    HTMLIsIndexElement has been removed from browsers; see:
23312    â€¢ Chromium Removal: https://codereview.chromium.org/96653004/
23313    â€¢ Gecko Removal: https://bugzilla.mozilla.org/show_bug.cgi?id=1266495
23314    â€¢ WebKit Removal: https://bugs.webkit.org/show_bug.cgi?id=7139.
23315    See also the discussion at https://github.com/jshint/jshint/pull/3222. */
23316   HTMLIsIndexElement   : false,
23317   HTMLLabelElement     : false,
23318   HTMLLayerElement     : false,
23319   HTMLLegendElement    : false,
23320   HTMLLIElement        : false,
23321   HTMLLinkElement      : false,
23322   HTMLMapElement       : false,
23323   HTMLMarqueeElement   : false,
23324   HTMLMediaElement     : false,
23325   HTMLMenuElement      : false,
23326   HTMLMetaElement      : false,
23327   HTMLMeterElement     : false,
23328   HTMLModElement       : false,
23329   HTMLObjectElement    : false,
23330   HTMLOListElement     : false,
23331   HTMLOptGroupElement  : false,
23332   HTMLOptionElement    : false,
23333   HTMLParagraphElement : false,
23334   HTMLParamElement     : false,
23335   HTMLPictureElement   : false,
23336   HTMLPreElement       : false,
23337   HTMLProgressElement  : false,
23338   HTMLQuoteElement     : false,
23339   HTMLScriptElement    : false,
23340   HTMLSelectElement    : false,
23341   HTMLSlotElement      : false,
23342   HTMLSourceElement    : false,
23343   HTMLStyleElement     : false,
23344   HTMLTableCaptionElement: false,
23345   HTMLTableCellElement : false,
23346   HTMLTableColElement  : false,
23347   HTMLTableElement     : false,
23348   HTMLTableRowElement  : false,
23349   HTMLTableSectionElement: false,
23350   HTMLTemplateElement  : false,
23351   HTMLTextAreaElement  : false,
23352   HTMLTimeElement      : false,
23353   HTMLTitleElement     : false,
23354   HTMLTrackElement     : false,
23355   HTMLUListElement     : false,
23356   HTMLVideoElement     : false,
23357   history              : false,
23358   Image                : false,
23359   IntersectionObserver : false,
23360   Intl                 : false,
23361   length               : false,
23362   localStorage         : false,
23363   location             : false,
23364   matchMedia           : false,
23365   MediaList            : false,
23366   MediaRecorder        : false,
23367   MessageChannel       : false,
23368   MessageEvent         : false,
23369   MessagePort          : false,
23370   MouseEvent           : false,
23371   moveBy               : false,
23372   moveTo               : false,
23373   MutationObserver     : false,
23374   name                 : false,
23375   Node                 : false,
23376   NodeFilter           : false,
23377   NodeList             : false,
23378   Notification         : false,
23379   navigator            : false,
23380   onbeforeunload       : true,
23381   onblur               : true,
23382   onerror              : true,
23383   onfocus              : true,
23384   onload               : true,
23385   onresize             : true,
23386   onunload             : true,
23387   open                 : false,
23388   openDatabase         : false,
23389   opener               : false,
23390   Option               : false,
23391   parent               : false,
23392   performance          : false,
23393   print                : false,
23394   Range                : false,
23395   requestAnimationFrame : false,
23396   removeEventListener  : false,
23397   Request              : false,
23398   resizeBy             : false,
23399   resizeTo             : false,
23400   Response             : false,
23401   screen               : false,
23402   scroll               : false,
23403   scrollBy             : false,
23404   scrollTo             : false,
23405   sessionStorage       : false,
23406   setInterval          : false,
23407   setTimeout           : false,
23408   SharedWorker         : false,
23409   status               : false,
23410   Storage              : false,
23411   StyleSheet           : false,
23412   SVGAElement          : false,
23413   SVGAltGlyphDefElement: false,
23414   SVGAltGlyphElement   : false,
23415   SVGAltGlyphItemElement: false,
23416   SVGAngle             : false,
23417   SVGAnimateColorElement: false,
23418   SVGAnimateElement    : false,
23419   SVGAnimateMotionElement: false,
23420   SVGAnimateTransformElement: false,
23421   SVGAnimatedAngle     : false,
23422   SVGAnimatedBoolean   : false,
23423   SVGAnimatedEnumeration: false,
23424   SVGAnimatedInteger   : false,
23425   SVGAnimatedLength    : false,
23426   SVGAnimatedLengthList: false,
23427   SVGAnimatedNumber    : false,
23428   SVGAnimatedNumberList: false,
23429   SVGAnimatedPathData  : false,
23430   SVGAnimatedPoints    : false,
23431   SVGAnimatedPreserveAspectRatio: false,
23432   SVGAnimatedRect      : false,
23433   SVGAnimatedString    : false,
23434   SVGAnimatedTransformList: false,
23435   SVGAnimationElement  : false,
23436   SVGCSSRule           : false,
23437   SVGCircleElement     : false,
23438   SVGClipPathElement   : false,
23439   SVGColor             : false,
23440   SVGColorProfileElement: false,
23441   SVGColorProfileRule  : false,
23442   SVGComponentTransferFunctionElement: false,
23443   SVGCursorElement     : false,
23444   SVGDefsElement       : false,
23445   SVGDescElement       : false,
23446   SVGDocument          : false,
23447   SVGElement           : false,
23448   SVGElementInstance   : false,
23449   SVGElementInstanceList: false,
23450   SVGEllipseElement    : false,
23451   SVGExternalResourcesRequired: false,
23452   SVGFEBlendElement    : false,
23453   SVGFEColorMatrixElement: false,
23454   SVGFEComponentTransferElement: false,
23455   SVGFECompositeElement: false,
23456   SVGFEConvolveMatrixElement: false,
23457   SVGFEDiffuseLightingElement: false,
23458   SVGFEDisplacementMapElement: false,
23459   SVGFEDistantLightElement: false,
23460   SVGFEFloodElement    : false,
23461   SVGFEFuncAElement    : false,
23462   SVGFEFuncBElement    : false,
23463   SVGFEFuncGElement    : false,
23464   SVGFEFuncRElement    : false,
23465   SVGFEGaussianBlurElement: false,
23466   SVGFEImageElement    : false,
23467   SVGFEMergeElement    : false,
23468   SVGFEMergeNodeElement: false,
23469   SVGFEMorphologyElement: false,
23470   SVGFEOffsetElement   : false,
23471   SVGFEPointLightElement: false,
23472   SVGFESpecularLightingElement: false,
23473   SVGFESpotLightElement: false,
23474   SVGFETileElement     : false,
23475   SVGFETurbulenceElement: false,
23476   SVGFilterElement     : false,
23477   SVGFilterPrimitiveStandardAttributes: false,
23478   SVGFitToViewBox      : false,
23479   SVGFontElement       : false,
23480   SVGFontFaceElement   : false,
23481   SVGFontFaceFormatElement: false,
23482   SVGFontFaceNameElement: false,
23483   SVGFontFaceSrcElement: false,
23484   SVGFontFaceUriElement: false,
23485   SVGForeignObjectElement: false,
23486   SVGGElement          : false,
23487   SVGGlyphElement      : false,
23488   SVGGlyphRefElement   : false,
23489   SVGGradientElement   : false,
23490   SVGHKernElement      : false,
23491   SVGICCColor          : false,
23492   SVGImageElement      : false,
23493   SVGLangSpace         : false,
23494   SVGLength            : false,
23495   SVGLengthList        : false,
23496   SVGLineElement       : false,
23497   SVGLinearGradientElement: false,
23498   SVGLocatable         : false,
23499   SVGMPathElement      : false,
23500   SVGMarkerElement     : false,
23501   SVGMaskElement       : false,
23502   SVGMatrix            : false,
23503   SVGMetadataElement   : false,
23504   SVGMissingGlyphElement: false,
23505   SVGNumber            : false,
23506   SVGNumberList        : false,
23507   SVGPaint             : false,
23508   SVGPathElement       : false,
23509   SVGPathSeg           : false,
23510   SVGPathSegArcAbs     : false,
23511   SVGPathSegArcRel     : false,
23512   SVGPathSegClosePath  : false,
23513   SVGPathSegCurvetoCubicAbs: false,
23514   SVGPathSegCurvetoCubicRel: false,
23515   SVGPathSegCurvetoCubicSmoothAbs: false,
23516   SVGPathSegCurvetoCubicSmoothRel: false,
23517   SVGPathSegCurvetoQuadraticAbs: false,
23518   SVGPathSegCurvetoQuadraticRel: false,
23519   SVGPathSegCurvetoQuadraticSmoothAbs: false,
23520   SVGPathSegCurvetoQuadraticSmoothRel: false,
23521   SVGPathSegLinetoAbs  : false,
23522   SVGPathSegLinetoHorizontalAbs: false,
23523   SVGPathSegLinetoHorizontalRel: false,
23524   SVGPathSegLinetoRel  : false,
23525   SVGPathSegLinetoVerticalAbs: false,
23526   SVGPathSegLinetoVerticalRel: false,
23527   SVGPathSegList       : false,
23528   SVGPathSegMovetoAbs  : false,
23529   SVGPathSegMovetoRel  : false,
23530   SVGPatternElement    : false,
23531   SVGPoint             : false,
23532   SVGPointList         : false,
23533   SVGPolygonElement    : false,
23534   SVGPolylineElement   : false,
23535   SVGPreserveAspectRatio: false,
23536   SVGRadialGradientElement: false,
23537   SVGRect              : false,
23538   SVGRectElement       : false,
23539   SVGRenderingIntent   : false,
23540   SVGSVGElement        : false,
23541   SVGScriptElement     : false,
23542   SVGSetElement        : false,
23543   SVGStopElement       : false,
23544   SVGStringList        : false,
23545   SVGStylable          : false,
23546   SVGStyleElement      : false,
23547   SVGSwitchElement     : false,
23548   SVGSymbolElement     : false,
23549   SVGTRefElement       : false,
23550   SVGTSpanElement      : false,
23551   SVGTests             : false,
23552   SVGTextContentElement: false,
23553   SVGTextElement       : false,
23554   SVGTextPathElement   : false,
23555   SVGTextPositioningElement: false,
23556   SVGTitleElement      : false,
23557   SVGTransform         : false,
23558   SVGTransformList     : false,
23559   SVGTransformable     : false,
23560   SVGURIReference      : false,
23561   SVGUnitTypes         : false,
23562   SVGUseElement        : false,
23563   SVGVKernElement      : false,
23564   SVGViewElement       : false,
23565   SVGViewSpec          : false,
23566   SVGZoomAndPan        : false,
23567   Text                 : false,
23568   TextDecoder          : false,
23569   TextEncoder          : false,
23570   TimeEvent            : false,
23571   top                  : false,
23572   URL                  : false,
23573   WebGLActiveInfo      : false,
23574   WebGLBuffer          : false,
23575   WebGLContextEvent    : false,
23576   WebGLFramebuffer     : false,
23577   WebGLProgram         : false,
23578   WebGLRenderbuffer    : false,
23579   WebGLRenderingContext: false,
23580   WebGLShader          : false,
23581   WebGLShaderPrecisionFormat: false,
23582   WebGLTexture         : false,
23583   WebGLUniformLocation : false,
23584   WebSocket            : false,
23585   window               : false,
23586   Window               : false,
23587   Worker               : false,
23588   XDomainRequest       : false,
23589   XMLDocument          : false,
23590   XMLHttpRequest       : false,
23591   XMLSerializer        : false,
23592   XPathEvaluator       : false,
23593   XPathException       : false,
23594   XPathExpression      : false,
23595   XPathNamespace       : false,
23596   XPathNSResolver      : false,
23597   XPathResult          : false
23600 exports.devel = {
23601   alert  : false,
23602   confirm: false,
23603   console: false,
23604   Debug  : false,
23605   opera  : false,
23606   prompt : false
23609 exports.worker = {
23610   importScripts  : true,
23611   onmessage      : true,
23612   postMessage    : true,
23613   self           : true,
23614   FileReaderSync : true
23617 // Widely adopted global names that are not part of ECMAScript standard
23618 exports.nonstandard = {
23619   escape  : false,
23620   unescape: false
23623 // Globals provided by popular JavaScript environments.
23625 exports.couch = {
23626   "require" : false,
23627   respond   : false,
23628   getRow    : false,
23629   emit      : false,
23630   send      : false,
23631   start     : false,
23632   sum       : false,
23633   log       : false,
23634   exports   : false,
23635   module    : false,
23636   provides  : false
23639 exports.node = {
23640   __filename    : false,
23641   __dirname     : false,
23642   arguments     : false,
23643   GLOBAL        : false,
23644   global        : false,
23645   module        : false,
23646   require       : false,
23648   // These globals are writeable because Node allows the following
23649   // usage pattern: var Buffer = require("buffer").Buffer;
23651   Buffer        : true,
23652   console       : true,
23653   exports       : true,
23654   process       : true,
23655   setTimeout    : true,
23656   clearTimeout  : true,
23657   setInterval   : true,
23658   clearInterval : true,
23659   setImmediate  : true, // v0.9.1+
23660   clearImmediate: true  // v0.9.1+
23663 exports.browserify = {
23664   __filename    : false,
23665   __dirname     : false,
23666   global        : false,
23667   module        : false,
23668   require       : false,
23669   Buffer        : true,
23670   exports       : true,
23671   process       : true
23674 exports.phantom = {
23675   phantom      : true,
23676   require      : true,
23677   WebPage      : true,
23678   console      : true, // in examples, but undocumented
23679   exports      : true  // v1.7+
23682 exports.qunit = {
23683   asyncTest      : false,
23684   deepEqual      : false,
23685   equal          : false,
23686   expect         : false,
23687   module         : false,
23688   notDeepEqual   : false,
23689   notEqual       : false,
23690   notOk          : false,
23691   notPropEqual   : false,
23692   notStrictEqual : false,
23693   ok             : false,
23694   propEqual      : false,
23695   QUnit          : false,
23696   raises         : false,
23697   start          : false,
23698   stop           : false,
23699   strictEqual    : false,
23700   test           : false,
23701   "throws"       : false
23704 exports.rhino = {
23705   arguments    : false,
23706   defineClass  : false,
23707   deserialize  : false,
23708   gc           : false,
23709   help         : false,
23710   importClass  : false,
23711   importPackage: false,
23712   "java"       : false,
23713   load         : false,
23714   loadClass    : false,
23715   Packages     : false,
23716   print        : false,
23717   quit         : false,
23718   readFile     : false,
23719   readUrl      : false,
23720   runCommand   : false,
23721   seal         : false,
23722   serialize    : false,
23723   spawn        : false,
23724   sync         : false,
23725   toint32      : false,
23726   version      : false
23729 exports.shelljs = {
23730   target       : false,
23731   echo         : false,
23732   exit         : false,
23733   cd           : false,
23734   pwd          : false,
23735   ls           : false,
23736   find         : false,
23737   cp           : false,
23738   rm           : false,
23739   mv           : false,
23740   mkdir        : false,
23741   test         : false,
23742   cat          : false,
23743   sed          : false,
23744   grep         : false,
23745   which        : false,
23746   dirs         : false,
23747   pushd        : false,
23748   popd         : false,
23749   env          : false,
23750   exec         : false,
23751   chmod        : false,
23752   config       : false,
23753   error        : false,
23754   tempdir      : false
23757 exports.typed = {
23758   ArrayBuffer         : false,
23759   ArrayBufferView     : false,
23760   DataView            : false,
23761   Float32Array        : false,
23762   Float64Array        : false,
23763   Int16Array          : false,
23764   Int32Array          : false,
23765   Int8Array           : false,
23766   Uint16Array         : false,
23767   Uint32Array         : false,
23768   Uint8Array          : false,
23769   Uint8ClampedArray   : false
23772 exports.wsh = {
23773   ActiveXObject            : true,
23774   Enumerator               : true,
23775   GetObject                : true,
23776   ScriptEngine             : true,
23777   ScriptEngineBuildVersion : true,
23778   ScriptEngineMajorVersion : true,
23779   ScriptEngineMinorVersion : true,
23780   VBArray                  : true,
23781   WSH                      : true,
23782   WScript                  : true,
23783   XDomainRequest           : true
23786 // Globals provided by popular JavaScript libraries.
23788 exports.dojo = {
23789   dojo     : false,
23790   dijit    : false,
23791   dojox    : false,
23792   define   : false,
23793   "require": false
23796 exports.jquery = {
23797   "$"    : false,
23798   jQuery : false
23801 exports.mootools = {
23802   "$"           : false,
23803   "$$"          : false,
23804   Asset         : false,
23805   Browser       : false,
23806   Chain         : false,
23807   Class         : false,
23808   Color         : false,
23809   Cookie        : false,
23810   Core          : false,
23811   Document      : false,
23812   DomReady      : false,
23813   DOMEvent      : false,
23814   DOMReady      : false,
23815   Drag          : false,
23816   Element       : false,
23817   Elements      : false,
23818   Event         : false,
23819   Events        : false,
23820   Fx            : false,
23821   Group         : false,
23822   Hash          : false,
23823   HtmlTable     : false,
23824   IFrame        : false,
23825   IframeShim    : false,
23826   InputValidator: false,
23827   instanceOf    : false,
23828   Keyboard      : false,
23829   Locale        : false,
23830   Mask          : false,
23831   MooTools      : false,
23832   Native        : false,
23833   Options       : false,
23834   OverText      : false,
23835   Request       : false,
23836   Scroller      : false,
23837   Slick         : false,
23838   Slider        : false,
23839   Sortables     : false,
23840   Spinner       : false,
23841   Swiff         : false,
23842   Tips          : false,
23843   Type          : false,
23844   typeOf        : false,
23845   URI           : false,
23846   Window        : false
23849 exports.prototypejs = {
23850   "$"               : false,
23851   "$$"              : false,
23852   "$A"              : false,
23853   "$F"              : false,
23854   "$H"              : false,
23855   "$R"              : false,
23856   "$break"          : false,
23857   "$continue"       : false,
23858   "$w"              : false,
23859   Abstract          : false,
23860   Ajax              : false,
23861   Class             : false,
23862   Enumerable        : false,
23863   Element           : false,
23864   Event             : false,
23865   Field             : false,
23866   Form              : false,
23867   Hash              : false,
23868   Insertion         : false,
23869   ObjectRange       : false,
23870   PeriodicalExecuter: false,
23871   Position          : false,
23872   Prototype         : false,
23873   Selector          : false,
23874   Template          : false,
23875   Toggle            : false,
23876   Try               : false,
23877   Autocompleter     : false,
23878   Builder           : false,
23879   Control           : false,
23880   Draggable         : false,
23881   Draggables        : false,
23882   Droppables        : false,
23883   Effect            : false,
23884   Sortable          : false,
23885   SortableObserver  : false,
23886   Sound             : false,
23887   Scriptaculous     : false
23890 exports.yui = {
23891   YUI       : false,
23892   Y         : false,
23893   YUI_config: false
23896 exports.mocha = {
23897   // Global (for config etc.)
23898   mocha       : false,
23899   // BDD
23900   describe    : false,
23901   xdescribe   : false,
23902   it          : false,
23903   xit         : false,
23904   context     : false,
23905   xcontext    : false,
23906   before      : false,
23907   after       : false,
23908   beforeEach  : false,
23909   afterEach   : false,
23910   // TDD
23911   suite         : false,
23912   test          : false,
23913   setup         : false,
23914   teardown      : false,
23915   suiteSetup    : false,
23916   suiteTeardown : false
23919 exports.jasmine = {
23920   jasmine     : false,
23921   describe    : false,
23922   xdescribe   : false,
23923   it          : false,
23924   xit         : false,
23925   beforeEach  : false,
23926   afterEach   : false,
23927   setFixtures : false,
23928   loadFixtures: false,
23929   spyOn       : false,
23930   expect      : false,
23931   // Jasmine 1.3
23932   runs        : false,
23933   waitsFor    : false,
23934   waits       : false,
23935   // Jasmine 2.1
23936   beforeAll   : false,
23937   afterAll    : false,
23938   fail        : false,
23939   fdescribe   : false,
23940   fit         : false,
23941   pending     : false,
23942   // Jasmine 2.6
23943   spyOnProperty: false
23946 },{}],"jshint":[function(require,module,exports){
23948  * JSHint, by JSHint Community.
23950  * This file (and this file only) is licensed under the same slightly modified
23951  * MIT license that JSLint is. It stops evil-doers everywhere:
23953  *   Copyright (c) 2002 Douglas Crockford  (www.JSLint.com)
23955  *   Permission is hereby granted, free of charge, to any person obtaining
23956  *   a copy of this software and associated documentation files (the "Software"),
23957  *   to deal in the Software without restriction, including without limitation
23958  *   the rights to use, copy, modify, merge, publish, distribute, sublicense,
23959  *   and/or sell copies of the Software, and to permit persons to whom
23960  *   the Software is furnished to do so, subject to the following conditions:
23962  *   The above copyright notice and this permission notice shall be included
23963  *   in all copies or substantial portions of the Software.
23965  *   The Software shall be used for Good, not Evil.
23967  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23968  *   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23969  *   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23970  *   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23971  *   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23972  *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23973  *   DEALINGS IN THE SOFTWARE.
23975  */
23977 /*jshint quotmark:double */
23978 /*exported console */
23980 var _            = require("lodash");
23981 var events       = require("events");
23982 var vars         = require("./vars.js");
23983 var messages     = require("./messages.js");
23984 var Lexer        = require("./lex.js").Lexer;
23985 var reg          = require("./reg.js");
23986 var state        = require("./state.js").state;
23987 var style        = require("./style.js");
23988 var options      = require("./options.js");
23989 var scopeManager = require("./scope-manager.js");
23991 // We need this module here because environments such as IE and Rhino
23992 // don't necessarilly expose the 'console' API and browserify uses
23993 // it to log things. It's a sad state of affair, really.
23994 var console = require("console-browserify");
23996 // We build the application inside a function so that we produce only a singleton
23997 // variable. That function will be invoked immediately, and its return value is
23998 // the JSHINT function itself.
24000 var JSHINT = (function() {
24001   "use strict";
24003   var api, // Extension API
24005     // These are operators that should not be used with the ! operator.
24006     bang = {
24007       "<"  : true,
24008       "<=" : true,
24009       "==" : true,
24010       "===": true,
24011       "!==": true,
24012       "!=" : true,
24013       ">"  : true,
24014       ">=" : true,
24015       "+"  : true,
24016       "-"  : true,
24017       "*"  : true,
24018       "/"  : true,
24019       "%"  : true
24020     },
24022     declared, // Globals that were declared using /*global ... */ syntax.
24024     functions, // All of the functions
24026     inblock,
24027     indent,
24028     lookahead,
24029     lex,
24030     member,
24031     membersOnly,
24032     predefined,    // Global variables defined by option
24034     urls,
24036     extraModules = [],
24037     emitter = new events.EventEmitter();
24039   function checkOption(name, t) {
24040     name = name.trim();
24042     if (/^[+-]W\d{3}$/g.test(name)) {
24043       return true;
24044     }
24046     if (options.validNames.indexOf(name) === -1) {
24047       if (t.type !== "jslint" && !_.has(options.removed, name)) {
24048         error("E001", t, name);
24049         return false;
24050       }
24051     }
24053     return true;
24054   }
24056   function isString(obj) {
24057     return Object.prototype.toString.call(obj) === "[object String]";
24058   }
24060   function isIdentifier(tkn, value) {
24061     if (!tkn)
24062       return false;
24064     if (!tkn.identifier || tkn.value !== value)
24065       return false;
24067     return true;
24068   }
24070   function isReserved(token) {
24071     if (!token.reserved) {
24072       return false;
24073     }
24074     var meta = token.meta;
24076     if (meta && meta.isFutureReservedWord) {
24077       if (meta.moduleOnly && !state.option.module) {
24078         return false;
24079       }
24081       if (state.inES5()) {
24082         // ES3 FutureReservedWord in an ES5 environment.
24083         if (!meta.es5) {
24084           return false;
24085         }
24087         // Some ES5 FutureReservedWord identifiers are active only
24088         // within a strict mode environment.
24089         if (meta.strictOnly) {
24090           if (!state.option.strict && !state.isStrict()) {
24091             return false;
24092           }
24093         }
24095         if (token.isProperty) {
24096           return false;
24097         }
24098       }
24099     }
24101     return true;
24102   }
24104   function supplant(str, data) {
24105     return str.replace(/\{([^{}]*)\}/g, function(a, b) {
24106       var r = data[b];
24107       return typeof r === "string" || typeof r === "number" ? r : a;
24108     });
24109   }
24111   function combine(dest, src) {
24112     Object.keys(src).forEach(function(name) {
24113       if (_.has(JSHINT.blacklist, name)) return;
24114       dest[name] = src[name];
24115     });
24116   }
24118   function processenforceall() {
24119     if (state.option.enforceall) {
24120       for (var enforceopt in options.bool.enforcing) {
24121         if (state.option[enforceopt] === undefined &&
24122             !options.noenforceall[enforceopt]) {
24123           state.option[enforceopt] = true;
24124         }
24125       }
24126       for (var relaxopt in options.bool.relaxing) {
24127         if (state.option[relaxopt] === undefined) {
24128           state.option[relaxopt] = false;
24129         }
24130       }
24131     }
24132   }
24134   /**
24135    * Apply all linting options according to the status of the `state` object.
24136    */
24137   function applyOptions() {
24138     var badESOpt = null;
24139     processenforceall();
24141     /**
24142      * TODO: Remove in JSHint 3
24143      */
24144     badESOpt = state.inferEsVersion();
24145     if (badESOpt) {
24146       quit("E059", state.tokens.next, "esversion", badESOpt);
24147     }
24149     if (state.inES5()) {
24150       combine(predefined, vars.ecmaIdentifiers[5]);
24151     }
24153     if (state.inES6()) {
24154       combine(predefined, vars.ecmaIdentifiers[6]);
24155     }
24157     /**
24158      * Use `in` to check for the presence of any explicitly-specified value for
24159      * `globalstrict` because both `true` and `false` should trigger an error.
24160      */
24161     if (state.option.strict === "global" && "globalstrict" in state.option) {
24162       quit("E059", state.tokens.next, "strict", "globalstrict");
24163     }
24165     if (state.option.module) {
24166       /**
24167        * TODO: Extend this restriction to *all* ES6-specific options.
24168        */
24169       if (!state.inES6()) {
24170         warning("W134", state.tokens.next, "module", 6);
24171       }
24172     }
24174     if (state.option.couch) {
24175       combine(predefined, vars.couch);
24176     }
24178     if (state.option.qunit) {
24179       combine(predefined, vars.qunit);
24180     }
24182     if (state.option.rhino) {
24183       combine(predefined, vars.rhino);
24184     }
24186     if (state.option.shelljs) {
24187       combine(predefined, vars.shelljs);
24188       combine(predefined, vars.node);
24189     }
24190     if (state.option.typed) {
24191       combine(predefined, vars.typed);
24192     }
24194     if (state.option.phantom) {
24195       combine(predefined, vars.phantom);
24196     }
24198     if (state.option.prototypejs) {
24199       combine(predefined, vars.prototypejs);
24200     }
24202     if (state.option.node) {
24203       combine(predefined, vars.node);
24204       combine(predefined, vars.typed);
24205     }
24207     if (state.option.devel) {
24208       combine(predefined, vars.devel);
24209     }
24211     if (state.option.dojo) {
24212       combine(predefined, vars.dojo);
24213     }
24215     if (state.option.browser) {
24216       combine(predefined, vars.browser);
24217       combine(predefined, vars.typed);
24218     }
24220     if (state.option.browserify) {
24221       combine(predefined, vars.browser);
24222       combine(predefined, vars.typed);
24223       combine(predefined, vars.browserify);
24224     }
24226     if (state.option.nonstandard) {
24227       combine(predefined, vars.nonstandard);
24228     }
24230     if (state.option.jasmine) {
24231       combine(predefined, vars.jasmine);
24232     }
24234     if (state.option.jquery) {
24235       combine(predefined, vars.jquery);
24236     }
24238     if (state.option.mootools) {
24239       combine(predefined, vars.mootools);
24240     }
24242     if (state.option.worker) {
24243       combine(predefined, vars.worker);
24244     }
24246     if (state.option.wsh) {
24247       combine(predefined, vars.wsh);
24248     }
24250     if (state.option.yui) {
24251       combine(predefined, vars.yui);
24252     }
24254     if (state.option.mocha) {
24255       combine(predefined, vars.mocha);
24256     }
24257   }
24259   // Produce an error warning.
24260   function quit(code, token, a, b) {
24261     var percentage = Math.floor((token.line / state.lines.length) * 100);
24262     var message = messages.errors[code].desc;
24264     var exception = {
24265       name: "JSHintError",
24266       line: token.line,
24267       character: token.from,
24268       message: message + " (" + percentage + "% scanned).",
24269       raw: message,
24270       code: code,
24271       a: a,
24272       b: b
24273     };
24275     exception.reason = supplant(message, exception) + " (" + percentage +
24276       "% scanned).";
24278     throw exception;
24279   }
24281   function removeIgnoredMessages() {
24282     var ignored = state.ignoredLines;
24284     if (_.isEmpty(ignored)) return;
24285     JSHINT.errors = _.reject(JSHINT.errors, function(err) { return ignored[err.line] });
24286   }
24288   function warning(code, t, a, b, c, d) {
24289     var ch, l, w, msg;
24291     if (/^W\d{3}$/.test(code)) {
24292       if (state.ignored[code])
24293         return;
24295       msg = messages.warnings[code];
24296     } else if (/E\d{3}/.test(code)) {
24297       msg = messages.errors[code];
24298     } else if (/I\d{3}/.test(code)) {
24299       msg = messages.info[code];
24300     }
24302     t = t || state.tokens.next || {};
24303     if (t.id === "(end)") {  // `~
24304       t = state.tokens.curr;
24305     }
24307     l = t.line;
24308     ch = t.from;
24310     w = {
24311       id: "(error)",
24312       raw: msg.desc,
24313       code: msg.code,
24314       evidence: state.lines[l - 1] || "",
24315       line: l,
24316       character: ch,
24317       scope: JSHINT.scope,
24318       a: a,
24319       b: b,
24320       c: c,
24321       d: d
24322     };
24324     w.reason = supplant(msg.desc, w);
24325     JSHINT.errors.push(w);
24327     removeIgnoredMessages();
24329     if (JSHINT.errors.length >= state.option.maxerr)
24330       quit("E043", t);
24332     return w;
24333   }
24335   function warningAt(m, l, ch, a, b, c, d) {
24336     return warning(m, {
24337       line: l,
24338       from: ch
24339     }, a, b, c, d);
24340   }
24342   function error(m, t, a, b, c, d) {
24343     warning(m, t, a, b, c, d);
24344   }
24346   function errorAt(m, l, ch, a, b, c, d) {
24347     return error(m, {
24348       line: l,
24349       from: ch
24350     }, a, b, c, d);
24351   }
24353   // Tracking of "internal" scripts, like eval containing a static string
24354   function addEvalCode(elem, token) {
24355     JSHINT.internals.push({
24356       id: "(internal)",
24357       elem: elem,
24358       token: token,
24359       code: token.value.replace(/([^\\])(\\*)\2\\n/g, "$1\n")
24360     });
24361   }
24363   /**
24364    * Process an inline linting directive
24365    *
24366    * @param {Token} directiveToken - the directive-bearing comment token
24367    * @param {Token} previous - the token that preceeds the directive
24368    */
24369   function lintingDirective(directiveToken, previous) {
24370     var body = directiveToken.body.split(",")
24371       .map(function(s) { return s.trim(); });
24372     var predef = {};
24374     if (directiveToken.type === "falls through") {
24375       previous.caseFallsThrough = true;
24376       return;
24377     }
24379     if (directiveToken.type === "globals") {
24380       body.forEach(function(g, idx) {
24381         g = g.split(":");
24382         var key = g[0].trim();
24383         var val = (g[1] || "").trim();
24385         if (key === "-" || !key.length) {
24386           // Ignore trailing comma
24387           if (idx > 0 && idx === body.length - 1) {
24388             return;
24389           }
24390           error("E002", directiveToken);
24391           return;
24392         }
24394         if (key.charAt(0) === "-") {
24395           key = key.slice(1);
24396           val = false;
24398           JSHINT.blacklist[key] = key;
24399           delete predefined[key];
24400         } else {
24401           predef[key] = (val === "true");
24402         }
24403       });
24405       combine(predefined, predef);
24407       for (var key in predef) {
24408         if (_.has(predef, key)) {
24409           declared[key] = directiveToken;
24410         }
24411       }
24412     }
24414     if (directiveToken.type === "exported") {
24415       body.forEach(function(e, idx) {
24416         if (!e.length) {
24417           // Ignore trailing comma
24418           if (idx > 0 && idx === body.length - 1) {
24419             return;
24420           }
24421           error("E002", directiveToken);
24422           return;
24423         }
24425         state.funct["(scope)"].addExported(e);
24426       });
24427     }
24429     if (directiveToken.type === "members") {
24430       membersOnly = membersOnly || {};
24432       body.forEach(function(m) {
24433         var ch1 = m.charAt(0);
24434         var ch2 = m.charAt(m.length - 1);
24436         if (ch1 === ch2 && (ch1 === "\"" || ch1 === "'")) {
24437           m = m
24438             .substr(1, m.length - 2)
24439             .replace("\\\"", "\"");
24440         }
24442         membersOnly[m] = false;
24443       });
24444     }
24446     var numvals = [
24447       "maxstatements",
24448       "maxparams",
24449       "maxdepth",
24450       "maxcomplexity",
24451       "maxerr",
24452       "maxlen",
24453       "indent"
24454     ];
24456     if (directiveToken.type === "jshint" || directiveToken.type === "jslint") {
24457       body.forEach(function(g) {
24458         g = g.split(":");
24459         var key = g[0].trim();
24460         var val = (g[1] || "").trim();
24462         if (!checkOption(key, directiveToken)) {
24463           return;
24464         }
24466         if (numvals.indexOf(key) >= 0) {
24467           // GH988 - numeric options can be disabled by setting them to `false`
24468           if (val !== "false") {
24469             val = +val;
24471             if (typeof val !== "number" || !isFinite(val) || val <= 0 || Math.floor(val) !== val) {
24472               error("E032", directiveToken, g[1].trim());
24473               return;
24474             }
24476             state.option[key] = val;
24477           } else {
24478             state.option[key] = key === "indent" ? 4 : false;
24479           }
24481           return;
24482         }
24484         if (key === "validthis") {
24485           // `validthis` is valid only within a function scope.
24487           if (state.funct["(global)"])
24488             return void error("E009");
24490           if (val !== "true" && val !== "false")
24491             return void error("E002", directiveToken);
24493           state.option.validthis = (val === "true");
24494           return;
24495         }
24497         if (key === "quotmark") {
24498           switch (val) {
24499           case "true":
24500           case "false":
24501             state.option.quotmark = (val === "true");
24502             break;
24503           case "double":
24504           case "single":
24505             state.option.quotmark = val;
24506             break;
24507           default:
24508             error("E002", directiveToken);
24509           }
24510           return;
24511         }
24513         if (key === "shadow") {
24514           switch (val) {
24515           case "true":
24516             state.option.shadow = true;
24517             break;
24518           case "outer":
24519             state.option.shadow = "outer";
24520             break;
24521           case "false":
24522           case "inner":
24523             state.option.shadow = "inner";
24524             break;
24525           default:
24526             error("E002", directiveToken);
24527           }
24528           return;
24529         }
24531         if (key === "unused") {
24532           switch (val) {
24533           case "true":
24534             state.option.unused = true;
24535             break;
24536           case "false":
24537             state.option.unused = false;
24538             break;
24539           case "vars":
24540           case "strict":
24541             state.option.unused = val;
24542             break;
24543           default:
24544             error("E002", directiveToken);
24545           }
24546           return;
24547         }
24549         if (key === "latedef") {
24550           switch (val) {
24551           case "true":
24552             state.option.latedef = true;
24553             break;
24554           case "false":
24555             state.option.latedef = false;
24556             break;
24557           case "nofunc":
24558             state.option.latedef = "nofunc";
24559             break;
24560           default:
24561             error("E002", directiveToken);
24562           }
24563           return;
24564         }
24566         if (key === "ignore") {
24567           switch (val) {
24568           case "line":
24569             state.ignoredLines[directiveToken.line] = true;
24570             removeIgnoredMessages();
24571             break;
24572           default:
24573             error("E002", directiveToken);
24574           }
24575           return;
24576         }
24578         if (key === "strict") {
24579           switch (val) {
24580           case "true":
24581             state.option.strict = true;
24582             break;
24583           case "false":
24584             state.option.strict = false;
24585             break;
24586           case "global":
24587           case "implied":
24588             state.option.strict = val;
24589             break;
24590           default:
24591             error("E002", directiveToken);
24592           }
24593           return;
24594         }
24596         if (key === "module") {
24597           /**
24598            * TODO: Extend this restriction to *all* "environmental" options.
24599            */
24600           if (!hasParsedCode(state.funct)) {
24601             error("E055", directiveToken, "module");
24602           }
24603         }
24605         if (key === "esversion") {
24606           switch (val) {
24607           case "3":
24608           case "5":
24609           case "6":
24610           case "2015":
24611             state.option.moz = false;
24612             state.option.esversion = +val;
24613             break;
24614           default:
24615             error("E002", directiveToken);
24616           }
24617           if (!hasParsedCode(state.funct)) {
24618             error("E055", directiveToken, "esversion");
24619           }
24620           return;
24621         }
24623         var match = /^([+-])(W\d{3})$/g.exec(key);
24624         if (match) {
24625           // ignore for -W..., unignore for +W...
24626           state.ignored[match[2]] = (match[1] === "-");
24627           return;
24628         }
24630         var tn;
24631         if (val === "true" || val === "false") {
24632           if (directiveToken.type === "jslint") {
24633             tn = options.renamed[key] || key;
24634             state.option[tn] = (val === "true");
24636             if (options.inverted[tn] !== undefined) {
24637               state.option[tn] = !state.option[tn];
24638             }
24639           } else {
24640             state.option[key] = (val === "true");
24641           }
24643           return;
24644         }
24646         error("E002", directiveToken);
24647       });
24649       applyOptions();
24650     }
24651   }
24653   /**
24654    * Return a token beyond the token available in `state.tokens.next`. If no
24655    * such token exists, return the "(end)" token. This function is used to
24656    * determine parsing strategies in cases where the value of the next token
24657    * does not provide sufficient information, as is the case with `for` loops,
24658    * e.g.:
24659    *
24660    *     for ( var i in ...
24661    *
24662    * versus:
24663    *
24664    *     for ( var i = ...
24665    *
24666    * @param {number} [p] - offset of desired token; defaults to 0
24667    *
24668    * @returns {token}
24669    */
24670   function peek(p) {
24671     var i = p || 0, j = lookahead.length, t;
24673     if (i < j) {
24674       return lookahead[i];
24675     }
24677     while (j <= i) {
24678       t = lex.token();
24680       // When the lexer is exhausted, this function should produce the "(end)"
24681       // token, even in cases where the requested token is beyond the end of
24682       // the input stream.
24683       if (!t) {
24684         // If the lookahead buffer is empty, the expected "(end)" token was
24685         // already emitted by the most recent invocation of `advance` and is
24686         // available as the next token.
24687         if (!lookahead.length) {
24688           return state.tokens.next;
24689         }
24691         return lookahead[j - 1];
24692       }
24694       lookahead[j] = t;
24695       j += 1;
24696     }
24698     return t;
24699   }
24701   function peekIgnoreEOL() {
24702     var i = 0;
24703     var t;
24704     do {
24705       t = peek(i++);
24706     } while (t.id === "(endline)");
24707     return t;
24708   }
24710   // Produce the next token. It looks for programming errors.
24712   function advance(id, t) {
24714     switch (state.tokens.curr.id) {
24715     case "(number)":
24716       if (state.tokens.next.id === ".") {
24717         warning("W005", state.tokens.curr);
24718       }
24719       break;
24720     case "-":
24721       if (state.tokens.next.id === "-" || state.tokens.next.id === "--") {
24722         warning("W006");
24723       }
24724       break;
24725     case "+":
24726       if (state.tokens.next.id === "+" || state.tokens.next.id === "++") {
24727         warning("W007");
24728       }
24729       break;
24730     }
24732     if (id && state.tokens.next.id !== id) {
24733       if (t) {
24734         if (state.tokens.next.id === "(end)") {
24735           error("E019", t, t.id);
24736         } else {
24737           error("E020", state.tokens.next, id, t.id, t.line, state.tokens.next.value);
24738         }
24739       } else if (state.tokens.next.type !== "(identifier)" || state.tokens.next.value !== id) {
24740         warning("W116", state.tokens.next, id, state.tokens.next.value);
24741       }
24742     }
24744     state.tokens.prev = state.tokens.curr;
24745     state.tokens.curr = state.tokens.next;
24746     for (;;) {
24747       state.tokens.next = lookahead.shift() || lex.token();
24749       if (!state.tokens.next) { // No more tokens left, give up
24750         quit("E041", state.tokens.curr);
24751       }
24753       if (state.tokens.next.id === "(end)" || state.tokens.next.id === "(error)") {
24754         return;
24755       }
24757       if (state.tokens.next.check) {
24758         state.tokens.next.check();
24759       }
24761       if (state.tokens.next.isSpecial) {
24762         lintingDirective(state.tokens.next, state.tokens.curr);
24763       } else {
24764         if (state.tokens.next.id !== "(endline)") {
24765           break;
24766         }
24767       }
24768     }
24769   }
24771   /**
24772    * Determine whether a given token is an operator.
24773    *
24774    * @param {token} token
24775    *
24776    * @returns {boolean}
24777    */
24778   function isOperator(token) {
24779     return token.first || token.right || token.left || token.id === "yield";
24780   }
24782   function isEndOfExpr(curr, next) {
24783     if (arguments.length === 0) {
24784       curr = state.tokens.curr;
24785       next = state.tokens.next;
24786     }
24788     if (next.id === ";" || next.id === "}" || next.id === ":") {
24789       return true;
24790     }
24791     if (next.infix === curr.infix || curr.ltBoundary === "after" ||
24792       next.ltBoundary === "before") {
24793       return curr.line !== startLine(next);
24794     }
24795     return false;
24796   }
24798   // This is the heart of JSHINT, the Pratt parser. In addition to parsing, it
24799   // is looking for ad hoc lint patterns. We add .fud to Pratt's model, which is
24800   // like .nud except that it is only used on the first token of a statement.
24801   // Having .fud makes it much easier to define statement-oriented languages like
24802   // JavaScript. I retained Pratt's nomenclature.
24804   // .nud  Null denotation
24805   // .fud  First null denotation
24806   // .led  Left denotation
24807   //  lbp  Left binding power
24808   //  rbp  Right binding power
24810   // They are elements of the parsing method called Top Down Operator Precedence.
24812   function expression(rbp, initial) {
24813     var left, isArray = false, isObject = false, isLetExpr = false;
24815     state.nameStack.push();
24817     // if current expression is a let expression
24818     if (!initial && state.tokens.next.value === "let" && peek(0).value === "(") {
24819       if (!state.inMoz()) {
24820         warning("W118", state.tokens.next, "let expressions");
24821       }
24822       isLetExpr = true;
24823       // create a new block scope we use only for the current expression
24824       state.funct["(scope)"].stack();
24825       advance("let");
24826       advance("(");
24827       state.tokens.prev.fud();
24828       advance(")");
24829     }
24831     if (state.tokens.next.id === "(end)")
24832       error("E006", state.tokens.curr);
24834     advance();
24836     if (initial) {
24837       state.funct["(verb)"] = state.tokens.curr.value;
24838       state.tokens.curr.beginsStmt = true;
24839     }
24841     if (initial === true && state.tokens.curr.fud) {
24842       left = state.tokens.curr.fud();
24843     } else {
24844       if (state.tokens.curr.nud) {
24845         left = state.tokens.curr.nud(rbp);
24846       } else {
24847         error("E030", state.tokens.curr, state.tokens.curr.id);
24848       }
24850       while (rbp < state.tokens.next.lbp && !isEndOfExpr()) {
24851         isArray = state.tokens.curr.value === "Array";
24852         isObject = state.tokens.curr.value === "Object";
24854         // #527, new Foo.Array(), Foo.Array(), new Foo.Object(), Foo.Object()
24855         // Line breaks in IfStatement heads exist to satisfy the checkJSHint
24856         // "Line too long." error.
24857         if (left && (left.value || (left.first && left.first.value))) {
24858           // If the left.value is not "new", or the left.first.value is a "."
24859           // then safely assume that this is not "new Array()" and possibly
24860           // not "new Object()"...
24861           if (left.value !== "new" ||
24862             (left.first && left.first.value && left.first.value === ".")) {
24863             isArray = false;
24864             // ...In the case of Object, if the left.value and state.tokens.curr.value
24865             // are not equal, then safely assume that this not "new Object()"
24866             if (left.value !== state.tokens.curr.value) {
24867               isObject = false;
24868             }
24869           }
24870         }
24872         advance();
24874         if (isArray && state.tokens.curr.id === "(" && state.tokens.next.id === ")") {
24875           warning("W009", state.tokens.curr);
24876         }
24878         if (isObject && state.tokens.curr.id === "(" && state.tokens.next.id === ")") {
24879           warning("W010", state.tokens.curr);
24880         }
24882         if (left && state.tokens.curr.led) {
24883           left = state.tokens.curr.led(left);
24884         } else {
24885           error("E033", state.tokens.curr, state.tokens.curr.id);
24886         }
24887       }
24888     }
24889     if (isLetExpr) {
24890       state.funct["(scope)"].unstack();
24891     }
24893     state.nameStack.pop();
24895     return left;
24896   }
24899   // Functions for conformance of style.
24901   function startLine(token) {
24902     return token.startLine || token.line;
24903   }
24905   function nobreaknonadjacent(left, right) {
24906     if (!state.option.laxbreak && left.line !== startLine(right)) {
24907       warning("W014", right, right.value);
24908     }
24909   }
24911   function nolinebreak(t) {
24912     t = t;
24913     if (t.line !== startLine(state.tokens.next)) {
24914       warning("E022", t, t.value);
24915     }
24916   }
24918   function nobreakcomma(left, right) {
24919     if (left.line !== startLine(right)) {
24920       if (!state.option.laxcomma) {
24921         if (parseComma.first) {
24922           warning("I001");
24923           parseComma.first = false;
24924         }
24925         warning("W014", left, right.value);
24926       }
24927     }
24928   }
24930   function parseComma(opts) {
24931     opts = opts || {};
24933     if (!opts.peek) {
24934       nobreakcomma(state.tokens.curr, state.tokens.next);
24935       advance(",");
24936     } else {
24937       nobreakcomma(state.tokens.prev, state.tokens.curr);
24938     }
24940     if (state.tokens.next.identifier && !(opts.property && state.inES5())) {
24941       // Keywords that cannot follow a comma operator.
24942       switch (state.tokens.next.value) {
24943       case "break":
24944       case "case":
24945       case "catch":
24946       case "continue":
24947       case "default":
24948       case "do":
24949       case "else":
24950       case "finally":
24951       case "for":
24952       case "if":
24953       case "in":
24954       case "instanceof":
24955       case "return":
24956       case "switch":
24957       case "throw":
24958       case "try":
24959       case "var":
24960       case "let":
24961       case "while":
24962       case "with":
24963         error("E024", state.tokens.next, state.tokens.next.value);
24964         return false;
24965       }
24966     }
24968     if (state.tokens.next.type === "(punctuator)") {
24969       switch (state.tokens.next.value) {
24970       case "}":
24971       case "]":
24972       case ",":
24973         if (opts.allowTrailing) {
24974           return true;
24975         }
24977         /* falls through */
24978       case ")":
24979         error("E024", state.tokens.next, state.tokens.next.value);
24980         return false;
24981       }
24982     }
24983     return true;
24984   }
24986   // Functional constructors for making the symbols that will be inherited by
24987   // tokens.
24989   function symbol(s, p) {
24990     var x = state.syntax[s];
24991     if (!x || typeof x !== "object") {
24992       state.syntax[s] = x = {
24993         id: s,
24994         lbp: p,
24995         value: s
24996       };
24997     }
24998     return x;
24999   }
25001   function delim(s) {
25002     var x = symbol(s, 0);
25003     x.delim = true;
25004     return x;
25005   }
25007   function stmt(s, f) {
25008     var x = delim(s);
25009     x.identifier = x.reserved = true;
25010     x.fud = f;
25011     return x;
25012   }
25014   function blockstmt(s, f) {
25015     var x = stmt(s, f);
25016     x.block = true;
25017     return x;
25018   }
25020   function reserveName(x) {
25021     var c = x.id.charAt(0);
25022     if ((c >= "a" && c <= "z") || (c >= "A" && c <= "Z")) {
25023       x.identifier = x.reserved = true;
25024     }
25025     return x;
25026   }
25028   function prefix(s, f) {
25029     var x = symbol(s, 150);
25030     reserveName(x);
25032     x.nud = (typeof f === "function") ? f : function() {
25033       this.arity = "unary";
25034       this.right = expression(150);
25036       if (this.id === "++" || this.id === "--") {
25037         if (state.option.plusplus) {
25038           warning("W016", this, this.id);
25039         }
25041         if (this.right) {
25042           checkLeftSideAssign(this.right, this);
25043         }
25044       }
25046       return this;
25047     };
25049     return x;
25050   }
25052   function type(s, f) {
25053     var x = delim(s);
25054     x.type = s;
25055     x.nud = f;
25056     return x;
25057   }
25059   function reserve(name, func) {
25060     var x = type(name, func);
25061     x.identifier = true;
25062     x.reserved = true;
25063     return x;
25064   }
25066   function FutureReservedWord(name, meta) {
25067     var x = type(name, (meta && meta.nud) || function() {
25068       return this;
25069     });
25071     meta = meta || {};
25072     meta.isFutureReservedWord = true;
25074     x.value = name;
25075     x.identifier = true;
25076     x.reserved = true;
25077     x.meta = meta;
25079     return x;
25080   }
25082   function reservevar(s, v) {
25083     return reserve(s, function() {
25084       if (typeof v === "function") {
25085         v(this);
25086       }
25087       return this;
25088     });
25089   }
25091   function infix(s, f, p, w) {
25092     var x = symbol(s, p);
25093     reserveName(x);
25094     x.infix = true;
25095     x.led = function(left) {
25096       if (!w) {
25097         nobreaknonadjacent(state.tokens.prev, state.tokens.curr);
25098       }
25099       if ((s === "in" || s === "instanceof") && left.id === "!") {
25100         warning("W018", left, "!");
25101       }
25102       if (typeof f === "function") {
25103         return f(left, this);
25104       } else {
25105         this.left = left;
25106         this.right = expression(p);
25107         return this;
25108       }
25109     };
25110     return x;
25111   }
25113   function application(s) {
25114     var x = symbol(s, 42);
25116     x.infix = true;
25117     x.led = function(left) {
25118       nobreaknonadjacent(state.tokens.prev, state.tokens.curr);
25120       this.left = left;
25121       this.right = doFunction({ type: "arrow", loneArg: left });
25122       return this;
25123     };
25124     return x;
25125   }
25127   function relation(s, f) {
25128     var x = symbol(s, 100);
25130     x.infix = true;
25131     x.led = function(left) {
25132       nobreaknonadjacent(state.tokens.prev, state.tokens.curr);
25133       this.left = left;
25134       var right = this.right = expression(100);
25136       if (isIdentifier(left, "NaN") || isIdentifier(right, "NaN")) {
25137         warning("W019", this);
25138       } else if (f) {
25139         f.apply(this, [left, right]);
25140       }
25142       if (!left || !right) {
25143         quit("E041", state.tokens.curr);
25144       }
25146       if (left.id === "!") {
25147         warning("W018", left, "!");
25148       }
25150       if (right.id === "!") {
25151         warning("W018", right, "!");
25152       }
25154       return this;
25155     };
25156     return x;
25157   }
25159   var typeofValues = {};
25160   typeofValues.legacy = [
25161     // E4X extended the `typeof` operator to return "xml" for the XML and
25162     // XMLList types it introduced.
25163     // Ref: 11.3.2 The typeof Operator
25164     // http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-357.pdf
25165     "xml",
25166     // IE<9 reports "unknown" when the `typeof` operator is applied to an
25167     // object existing across a COM+ bridge. In lieu of official documentation
25168     // (which does not exist), see:
25169     // http://robertnyman.com/2005/12/21/what-is-typeof-unknown/
25170     "unknown"
25171   ];
25172   typeofValues.es3 = [
25173     "undefined", "boolean", "number", "string", "function", "object",
25174   ];
25175   typeofValues.es3 = typeofValues.es3.concat(typeofValues.legacy);
25176   typeofValues.es6 = typeofValues.es3.concat("symbol");
25178   // Checks whether the 'typeof' operator is used with the correct
25179   // value. For docs on 'typeof' see:
25180   // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof
25181   function isTypoTypeof(left, right, state) {
25182     var values;
25184     if (state.option.notypeof)
25185       return false;
25187     if (!left || !right)
25188       return false;
25190     values = state.inES6() ? typeofValues.es6 : typeofValues.es3;
25192     if (right.type === "(identifier)" && right.value === "typeof" && left.type === "(string)")
25193       return !_.includes(values, left.value);
25195     return false;
25196   }
25198   function isGlobalEval(left, state) {
25199     var isGlobal = false;
25201     // permit methods to refer to an "eval" key in their own context
25202     if (left.type === "this" && state.funct["(context)"] === null) {
25203       isGlobal = true;
25204     }
25205     // permit use of "eval" members of objects
25206     else if (left.type === "(identifier)") {
25207       if (state.option.node && left.value === "global") {
25208         isGlobal = true;
25209       }
25211       else if (state.option.browser && (left.value === "window" || left.value === "document")) {
25212         isGlobal = true;
25213       }
25214     }
25216     return isGlobal;
25217   }
25219   function findNativePrototype(left) {
25220     var natives = [
25221       "Array", "ArrayBuffer", "Boolean", "Collator", "DataView", "Date",
25222       "DateTimeFormat", "Error", "EvalError", "Float32Array", "Float64Array",
25223       "Function", "Infinity", "Intl", "Int16Array", "Int32Array", "Int8Array",
25224       "Iterator", "Number", "NumberFormat", "Object", "RangeError",
25225       "ReferenceError", "RegExp", "StopIteration", "String", "SyntaxError",
25226       "TypeError", "Uint16Array", "Uint32Array", "Uint8Array", "Uint8ClampedArray",
25227       "URIError"
25228     ];
25230     function walkPrototype(obj) {
25231       if (typeof obj !== "object") return;
25232       return obj.right === "prototype" ? obj : walkPrototype(obj.left);
25233     }
25235     function walkNative(obj) {
25236       while (!obj.identifier && typeof obj.left === "object")
25237         obj = obj.left;
25239       if (obj.identifier && natives.indexOf(obj.value) >= 0 &&
25240           state.funct["(scope)"].isPredefined(obj.value)) {
25241         return obj.value;
25242       }
25243     }
25245     var prototype = walkPrototype(left);
25246     if (prototype) return walkNative(prototype);
25247   }
25249   /**
25250    * Checks the left hand side of an assignment for issues, returns if ok
25251    * @param {token} left - the left hand side of the assignment
25252    * @param {token=} assignToken - the token for the assignment, used for reporting
25253    * @param {object=} options - optional object
25254    * @param {boolean} options.allowDestructuring - whether to allow destructuting binding
25255    * @returns {boolean} Whether the left hand side is OK
25256    */
25257   function checkLeftSideAssign(left, assignToken, options) {
25259     var allowDestructuring = options && options.allowDestructuring;
25261     assignToken = assignToken || left;
25263     if (state.option.freeze) {
25264       var nativeObject = findNativePrototype(left);
25265       if (nativeObject)
25266         warning("W121", left, nativeObject);
25267     }
25268     if (checkPunctuator(left, "...")) {
25269       left = left.right;
25270     }
25272     if (left.identifier && !left.isMetaProperty) {
25273       // reassign also calls modify
25274       // but we are specific in order to catch function re-assignment
25275       // and globals re-assignment
25276       state.funct["(scope)"].block.reassign(left.value, left);
25277     }
25279     if (left.id === ".") {
25280       if (!left.left || left.left.value === "arguments" && !state.isStrict()) {
25281         warning("W143", assignToken);
25282       }
25284       state.nameStack.set(state.tokens.prev);
25285       return true;
25286     } else if (left.id === "{" || left.id === "[") {
25287       if (!allowDestructuring || !left.destructAssign) {
25288         if (left.id === "{" || !left.left) {
25289           warning("E031", assignToken);
25290         } else if (left.left.value === "arguments" && !state.isStrict()) {
25291           warning("W143", assignToken);
25292         }
25293       }
25295       if (left.id === "[") {
25296         state.nameStack.set(left.right);
25297       }
25299       return true;
25300     } else if (left.identifier && !isReserved(left) && !left.isMetaProperty &&
25301       left.value !== "eval" && left.value !== "arguments") {
25302       if (state.funct["(scope)"].labeltype(left.value) === "exception") {
25303         warning("W022", left);
25304       }
25305       state.nameStack.set(left);
25306       return true;
25307     }
25309     error("E031", assignToken);
25311     return false;
25312   }
25314   function assignop(s, f, p) {
25315     var x = infix(s, typeof f === "function" ? f : function(left, that) {
25316       that.left = left;
25318       checkLeftSideAssign(left, that, { allowDestructuring: true });
25320       that.right = expression(10);
25322       return that;
25323     }, p);
25325     x.exps = true;
25326     x.assign = true;
25327     return x;
25328   }
25331   function bitwise(s, f, p) {
25332     var x = symbol(s, p);
25333     reserveName(x);
25334     x.infix = true;
25335     x.led = (typeof f === "function") ? f : function(left) {
25336       if (state.option.bitwise) {
25337         warning("W016", this, this.id);
25338       }
25339       this.left = left;
25340       this.right = expression(p);
25341       return this;
25342     };
25343     return x;
25344   }
25346   function bitwiseassignop(s) {
25347     return assignop(s, function(left, that) {
25348       if (state.option.bitwise) {
25349         warning("W016", that, that.id);
25350       }
25352       checkLeftSideAssign(left, that);
25354       that.right = expression(10);
25356       return that;
25357     }, 20);
25358   }
25360   function suffix(s) {
25361     var x = symbol(s, 150);
25363     x.led = function(left) {
25364       // this = suffix e.g. "++" punctuator
25365       // left = symbol operated e.g. "a" identifier or "a.b" punctuator
25366       if (state.option.plusplus) {
25367         warning("W016", this, this.id);
25368       }
25370       checkLeftSideAssign(left, this);
25372       this.left = left;
25373       return this;
25374     };
25375     return x;
25376   }
25378   // prop means that this identifier is that of an object property
25379   function optionalidentifier(prop, preserve) {
25380     if (!state.tokens.next.identifier) {
25381       return;
25382     }
25384     if (!preserve) {
25385       advance();
25386     }
25388     var curr = state.tokens.curr;
25389     var val  = state.tokens.curr.value;
25391     if (!isReserved(curr)) {
25392       return val;
25393     }
25395     if (prop) {
25396       if (state.inES5()) {
25397         return val;
25398       }
25399     }
25401     warning("W024", state.tokens.curr, state.tokens.curr.id);
25402     return val;
25403   }
25405   // prop means that this identifier is that of an object property
25406   function identifier(prop) {
25407     var i = optionalidentifier(prop, false);
25408     if (i) {
25409       return i;
25410     }
25412     // parameter destructuring with rest operator
25413     if (state.tokens.next.value === "...") {
25414       if (!state.inES6(true)) {
25415         warning("W119", state.tokens.next, "spread/rest operator", "6");
25416       }
25417       advance();
25419       if (checkPunctuator(state.tokens.next, "...")) {
25420         warning("E024", state.tokens.next, "...");
25421         while (checkPunctuator(state.tokens.next, "...")) {
25422           advance();
25423         }
25424       }
25426       if (!state.tokens.next.identifier) {
25427         warning("E024", state.tokens.curr, state.tokens.next.id);
25428         return;
25429       }
25431       return identifier(prop);
25432     } else {
25433       error("E030", state.tokens.next, state.tokens.next.value);
25435       // The token should be consumed after a warning is issued so the parser
25436       // can continue as though an identifier were found. The semicolon token
25437       // should not be consumed in this way so that the parser interprets it as
25438       // a statement delimeter;
25439       if (state.tokens.next.id !== ";") {
25440         advance();
25441       }
25442     }
25443   }
25446   function reachable(controlToken) {
25447     var i = 0, t;
25448     if (state.tokens.next.id !== ";" || controlToken.inBracelessBlock) {
25449       return;
25450     }
25451     for (;;) {
25452       do {
25453         t = peek(i);
25454         i += 1;
25455       } while (t.id !== "(end)" && t.id === "(comment)");
25457       if (t.reach) {
25458         return;
25459       }
25460       if (t.id !== "(endline)") {
25461         if (t.id === "function") {
25462           if (state.option.latedef === true) {
25463             warning("W026", t);
25464           }
25465           break;
25466         }
25468         warning("W027", t, t.value, controlToken.value);
25469         break;
25470       }
25471     }
25472   }
25474   /**
25475    * Consume the semicolon that delimits the statement currently being parsed,
25476    * emitting relevant warnings/errors as appropriate.
25477    *
25478    * @param {token} stmt - token describing the statement under consideration
25479    */
25480   function parseFinalSemicolon(stmt) {
25481     if (state.tokens.next.id !== ";") {
25482       // don't complain about unclosed templates / strings
25483       if (state.tokens.next.isUnclosed) return advance();
25485       var sameLine = startLine(state.tokens.next) === state.tokens.curr.line &&
25486                      state.tokens.next.id !== "(end)";
25487       var blockEnd = checkPunctuator(state.tokens.next, "}");
25489       if (sameLine && !blockEnd && !(stmt.id === "do" && state.inES6(true))) {
25490         errorAt("E058", state.tokens.curr.line, state.tokens.curr.character);
25491       } else if (!state.option.asi) {
25492         // If this is the last statement in a block that ends on
25493         // the same line *and* option lastsemic is on, ignore the warning.
25494         // Otherwise, complain about missing semicolon.
25495         if (!(blockEnd && sameLine && state.option.lastsemic)) {
25496           warningAt("W033", state.tokens.curr.line, state.tokens.curr.character);
25497         }
25498       }
25499     } else {
25500       advance(";");
25501     }
25502   }
25504   function statement() {
25505     var i = indent, r, t = state.tokens.next, hasOwnScope = false;
25507     if (t.id === ";") {
25508       advance(";");
25509       return;
25510     }
25512     // Is this a labelled statement?
25513     var res = isReserved(t);
25515     // We're being more tolerant here: if someone uses
25516     // a FutureReservedWord as a label, we warn but proceed
25517     // anyway.
25519     if (res && t.meta && t.meta.isFutureReservedWord && peek().id === ":") {
25520       warning("W024", t, t.id);
25521       res = false;
25522     }
25524     if (t.identifier && !res && peek().id === ":") {
25525       advance();
25526       advance(":");
25528       hasOwnScope = true;
25529       state.funct["(scope)"].stack();
25530       state.funct["(scope)"].block.addBreakLabel(t.value, { token: state.tokens.curr });
25532       if (!state.tokens.next.labelled && state.tokens.next.value !== "{") {
25533         warning("W028", state.tokens.next, t.value, state.tokens.next.value);
25534       }
25536       t = state.tokens.next;
25537     }
25539     // Is it a lonely block?
25541     if (t.id === "{") {
25542       // Is it a switch case block?
25543       //
25544       //  switch (foo) {
25545       //    case bar: { <= here.
25546       //      ...
25547       //    }
25548       //  }
25549       var iscase = (state.funct["(verb)"] === "case" && state.tokens.curr.value === ":");
25550       block(true, true, false, false, iscase);
25552       if (hasOwnScope) {
25553         state.funct["(scope)"].unstack();
25554       }
25556       return;
25557     }
25559     // Parse the statement.
25561     r = expression(0, true);
25563     if (r && !(r.identifier && r.value === "function") &&
25564         !(r.type === "(punctuator)" && r.left &&
25565           r.left.identifier && r.left.value === "function")) {
25566       if (!state.isStrict() && state.stmtMissingStrict()) {
25567         warning("E007");
25568       }
25569     }
25571     // Look for the final semicolon.
25573     if (!t.block) {
25574       if (!state.option.expr && (!r || !r.exps)) {
25575         warning("W030", state.tokens.curr);
25576       } else if (state.option.nonew && r && r.left && r.id === "(" && r.left.id === "new") {
25577         warning("W031", t);
25578       }
25579       parseFinalSemicolon(t);
25580     }
25583     // Restore the indentation.
25585     indent = i;
25586     if (hasOwnScope) {
25587       state.funct["(scope)"].unstack();
25588     }
25589     return r;
25590   }
25593   function statements() {
25594     var a = [], p;
25596     while (!state.tokens.next.reach && state.tokens.next.id !== "(end)") {
25597       if (state.tokens.next.id === ";") {
25598         p = peek();
25600         if (!p || (p.id !== "(" && p.id !== "[")) {
25601           warning("W032");
25602         }
25604         advance(";");
25605       } else {
25606         a.push(statement());
25607       }
25608     }
25609     return a;
25610   }
25613   /*
25614    * read all directives
25615    */
25616   function directives() {
25617     var current = state.tokens.next;
25618     while (state.tokens.next.id === "(string)") {
25619       var next = peekIgnoreEOL();
25620       if (!isEndOfExpr(current, next)) {
25621         break;
25622       }
25623       current = next;
25625       advance();
25626       var directive = state.tokens.curr.value;
25627       if (state.directive[directive] ||
25628           (directive === "use strict" && state.option.strict === "implied")) {
25629         warning("W034", state.tokens.curr, directive);
25630       }
25632       // there's no directive negation, so always set to true
25633       state.directive[directive] = true;
25635       parseFinalSemicolon(current);
25636     }
25638     if (state.isStrict()) {
25639       state.option.undef = true;
25640     }
25641   }
25644   /*
25645    * Parses a single block. A block is a sequence of statements wrapped in
25646    * braces.
25647    *
25648    * ordinary   - true for everything but function bodies and try blocks.
25649    * stmt       - true if block can be a single statement (e.g. in if/for/while).
25650    * isfunc     - true if block is a function body
25651    * isfatarrow - true if its a body of a fat arrow function
25652    * iscase      - true if block is a switch case block
25653    */
25654   function block(ordinary, stmt, isfunc, isfatarrow, iscase) {
25655     var a,
25656       b = inblock,
25657       old_indent = indent,
25658       m,
25659       t,
25660       d;
25662     inblock = ordinary;
25664     t = state.tokens.next;
25666     var metrics = state.funct["(metrics)"];
25667     metrics.nestedBlockDepth += 1;
25668     metrics.verifyMaxNestedBlockDepthPerFunction();
25670     if (state.tokens.next.id === "{") {
25671       advance("{");
25673       // create a new block scope
25674       state.funct["(scope)"].stack();
25675       state.funct["(noblockscopedvar)"] = false;
25677       if (state.tokens.next.id !== "}") {
25678         indent += state.option.indent;
25679         while (!ordinary && state.tokens.next.from > indent) {
25680           indent += state.option.indent;
25681         }
25683         if (isfunc) {
25684           m = {};
25685           for (d in state.directive) {
25686             m[d] = state.directive[d];
25687           }
25688           directives();
25690           state.funct["(isStrict)"] = state.isStrict();
25692           if (state.option.strict && state.funct["(context)"]["(global)"]) {
25693             if (!m["use strict"] && !state.isStrict()) {
25694               warning("E007");
25695             }
25696           }
25697         }
25699         a = statements();
25701         metrics.statementCount += a.length;
25703         indent -= state.option.indent;
25704       } else if (isfunc) {
25705         // Ensure property is set for functions with empty bodies.
25706         state.funct["(isStrict)"] = state.isStrict();
25707       }
25709       advance("}", t);
25711       if (isfunc) {
25712         state.funct["(scope)"].validateParams(isfatarrow);
25713         if (m) {
25714           state.directive = m;
25715         }
25716       }
25718       state.funct["(scope)"].unstack();
25720       indent = old_indent;
25721     } else if (!ordinary) {
25722       if (isfunc) {
25723         state.funct["(scope)"].stack();
25725         if (stmt && !isfatarrow && !state.inMoz()) {
25726           error("W118", state.tokens.curr, "function closure expressions");
25727         }
25729         if (isfatarrow) {
25730           state.funct["(scope)"].validateParams(true);
25731         }
25733         expression(10);
25735         if (state.option.strict && state.funct["(context)"]["(global)"]) {
25736           if (!state.isStrict()) {
25737             warning("E007");
25738           }
25739         }
25741         state.funct["(scope)"].unstack();
25742       } else {
25743         error("E021", state.tokens.next, "{", state.tokens.next.value);
25744       }
25745     } else {
25747       // check to avoid let declaration not within a block
25748       // though is fine inside for loop initializer section
25749       state.funct["(noblockscopedvar)"] = state.tokens.next.id !== "for";
25750       state.funct["(scope)"].stack();
25752       if (!stmt || state.option.curly) {
25753         warning("W116", state.tokens.next, "{", state.tokens.next.value);
25754       }
25756       state.tokens.next.inBracelessBlock = true;
25757       indent += state.option.indent;
25758       // test indentation only if statement is in new line
25759       a = [statement()];
25760       indent -= state.option.indent;
25762       state.funct["(scope)"].unstack();
25763       delete state.funct["(noblockscopedvar)"];
25764     }
25766     // Don't clear and let it propagate out if it is "break", "return" or similar in switch case
25767     switch (state.funct["(verb)"]) {
25768     case "break":
25769     case "continue":
25770     case "return":
25771     case "throw":
25772       if (iscase) {
25773         break;
25774       }
25776       /* falls through */
25777     default:
25778       state.funct["(verb)"] = null;
25779     }
25781     inblock = b;
25782     if (ordinary && state.option.noempty && (!a || a.length === 0)) {
25783       warning("W035", state.tokens.prev);
25784     }
25785     metrics.nestedBlockDepth -= 1;
25786     return a;
25787   }
25790   function countMember(m) {
25791     if (membersOnly && typeof membersOnly[m] !== "boolean") {
25792       warning("W036", state.tokens.curr, m);
25793     }
25794     if (typeof member[m] === "number") {
25795       member[m] += 1;
25796     } else {
25797       member[m] = 1;
25798     }
25799   }
25801   // Build the syntax table by declaring the syntactic elements of the language.
25803   type("(number)", function() {
25804     return this;
25805   });
25807   type("(string)", function() {
25808     return this;
25809   });
25811   state.syntax["(identifier)"] = {
25812     type: "(identifier)",
25813     lbp: 0,
25814     identifier: true,
25816     nud: function() {
25817       var v = this.value;
25819       // If this identifier is the lone parameter to a shorthand "fat arrow"
25820       // function definition, i.e.
25821       //
25822       //     x => x;
25823       //
25824       // ...it should not be considered as a variable in the current scope. It
25825       // will be added to the scope of the new function when the next token is
25826       // parsed, so it can be safely ignored for now.
25827       if (state.tokens.next.id === "=>") {
25828         return this;
25829       }
25831       if (!state.funct["(comparray)"].check(v)) {
25832         state.funct["(scope)"].block.use(v, state.tokens.curr);
25833       }
25834       return this;
25835     },
25837     led: function() {
25838       error("E033", state.tokens.next, state.tokens.next.value);
25839     }
25840   };
25842   var baseTemplateSyntax = {
25843     identifier: false,
25844     template: true,
25845   };
25846   state.syntax["(template)"] = _.extend({
25847     lbp: 155,
25848     type: "(template)",
25849     nud: doTemplateLiteral,
25850     led: doTemplateLiteral,
25851     noSubst: false
25852   }, baseTemplateSyntax);
25854   state.syntax["(template middle)"] = _.extend({
25855     lbp: 0,
25856     type: "(template middle)",
25857     noSubst: false
25858   }, baseTemplateSyntax);
25860   state.syntax["(template tail)"] = _.extend({
25861     lbp: 0,
25862     type: "(template tail)",
25863     tail: true,
25864     noSubst: false
25865   }, baseTemplateSyntax);
25867   state.syntax["(no subst template)"] = _.extend({
25868     lbp: 155,
25869     type: "(template)",
25870     nud: doTemplateLiteral,
25871     led: doTemplateLiteral,
25872     noSubst: true,
25873     tail: true // mark as tail, since it's always the last component
25874   }, baseTemplateSyntax);
25876   type("(regexp)", function() {
25877     return this;
25878   });
25880   // ECMAScript parser
25882   delim("(endline)");
25883   (function(x) {
25884     x.line = x.from = 0;
25885   })(delim("(begin)"));
25886   delim("(end)").reach = true;
25887   delim("(error)").reach = true;
25888   delim("}").reach = true;
25889   delim(")");
25890   delim("]");
25891   delim("\"").reach = true;
25892   delim("'").reach = true;
25893   delim(";");
25894   delim(":").reach = true;
25895   delim("#");
25897   reserve("else");
25898   reserve("case").reach = true;
25899   reserve("catch");
25900   reserve("default").reach = true;
25901   reserve("finally");
25902   reserve("true", function() { return this; });
25903   reserve("false", function() { return this; });
25904   reservevar("null");
25905   reservevar("this", function(x) {
25906     if (state.isStrict() && !isMethod() &&
25907         !state.option.validthis && ((state.funct["(statement)"] &&
25908         state.funct["(name)"].charAt(0) > "Z") || state.funct["(global)"])) {
25909       warning("W040", x);
25910     }
25911   });
25913   assignop("=", "assign", 20);
25914   assignop("+=", "assignadd", 20);
25915   assignop("-=", "assignsub", 20);
25916   assignop("*=", "assignmult", 20);
25917   assignop("/=", "assigndiv", 20).nud = function() {
25918     error("E014");
25919   };
25920   assignop("%=", "assignmod", 20);
25922   bitwiseassignop("&=");
25923   bitwiseassignop("|=");
25924   bitwiseassignop("^=");
25925   bitwiseassignop("<<=");
25926   bitwiseassignop(">>=");
25927   bitwiseassignop(">>>=");
25928   infix(",", function(left, that) {
25929     var expr;
25930     that.exprs = [left];
25932     if (state.option.nocomma) {
25933       warning("W127");
25934     }
25936     if (!parseComma({ peek: true })) {
25937       return that;
25938     }
25939     while (true) {
25940       if (!(expr = expression(10))) {
25941         break;
25942       }
25943       that.exprs.push(expr);
25944       if (state.tokens.next.value !== "," || !parseComma()) {
25945         break;
25946       }
25947     }
25948     return that;
25949   }, 10, true);
25951   infix("?", function(left, that) {
25952     increaseComplexityCount();
25953     that.left = left;
25954     that.right = expression(10);
25955     advance(":");
25956     expression(10);
25957     return that;
25958   }, 30);
25960   var orPrecendence = 40;
25961   infix("||", function(left, that) {
25962     increaseComplexityCount();
25963     that.left = left;
25964     that.right = expression(orPrecendence);
25965     return that;
25966   }, orPrecendence);
25967   infix("&&", "and", 50);
25968   bitwise("|", "bitor", 70);
25969   bitwise("^", "bitxor", 80);
25970   bitwise("&", "bitand", 90);
25971   relation("==", function(left, right) {
25972     var eqnull = state.option.eqnull &&
25973       ((left && left.value) === "null" || (right && right.value) === "null");
25975     switch (true) {
25976       case !eqnull && state.option.eqeqeq:
25977         this.from = this.character;
25978         warning("W116", this, "===", "==");
25979         break;
25980       case isTypoTypeof(right, left, state):
25981         warning("W122", this, right.value);
25982         break;
25983       case isTypoTypeof(left, right, state):
25984         warning("W122", this, left.value);
25985         break;
25986     }
25988     return this;
25989   });
25990   relation("===", function(left, right) {
25991     if (isTypoTypeof(right, left, state)) {
25992       warning("W122", this, right.value);
25993     } else if (isTypoTypeof(left, right, state)) {
25994       warning("W122", this, left.value);
25995     }
25996     return this;
25997   });
25998   relation("!=", function(left, right) {
25999     var eqnull = state.option.eqnull &&
26000         ((left && left.value) === "null" || (right && right.value) === "null");
26002     if (!eqnull && state.option.eqeqeq) {
26003       this.from = this.character;
26004       warning("W116", this, "!==", "!=");
26005     } else if (isTypoTypeof(right, left, state)) {
26006       warning("W122", this, right.value);
26007     } else if (isTypoTypeof(left, right, state)) {
26008       warning("W122", this, left.value);
26009     }
26010     return this;
26011   });
26012   relation("!==", function(left, right) {
26013     if (isTypoTypeof(right, left, state)) {
26014       warning("W122", this, right.value);
26015     } else if (isTypoTypeof(left, right, state)) {
26016       warning("W122", this, left.value);
26017     }
26018     return this;
26019   });
26020   relation("<");
26021   relation(">");
26022   relation("<=");
26023   relation(">=");
26024   bitwise("<<", "shiftleft", 120);
26025   bitwise(">>", "shiftright", 120);
26026   bitwise(">>>", "shiftrightunsigned", 120);
26027   infix("in", "in", 120);
26028   infix("instanceof", function(left, token) {
26029     var right;
26030     var scope = state.funct["(scope)"];
26031     token.left = left;
26032     token.right = right = expression(120);
26034     // This condition reflects a syntax error which will be reported by the
26035     // `expression` function.
26036     if (!right) {
26037       return token;
26038     }
26040     if (right.id === "(number)" ||
26041         right.id === "(string)" ||
26042         right.value === "null" ||
26043         (right.value === "undefined" && !scope.has("undefined")) ||
26044         right.arity === "unary" ||
26045         right.id === "{" ||
26046         (right.id === "[" && !right.right) ||
26047         right.id === "(regexp)" ||
26048         (right.id === "(template)" && !right.tag)) {
26049       error("E060");
26050     }
26052     if (right.id === "function") {
26053       warning("W139");
26054     }
26056     return token;
26057   }, 120);
26058   infix("+", function(left, that) {
26059     var right;
26060     that.left = left;
26061     that.right = right = expression(130);
26063     if (left && right && left.id === "(string)" && right.id === "(string)") {
26064       left.value += right.value;
26065       left.character = right.character;
26066       if (!state.option.scripturl && reg.javascriptURL.test(left.value)) {
26067         warning("W050", left);
26068       }
26069       return left;
26070     }
26072     return that;
26073   }, 130);
26074   prefix("+", "num");
26075   infix("-", "sub", 130);
26076   prefix("-", "neg");
26077   infix("*", "mult", 140);
26078   infix("/", "div", 140);
26079   infix("%", "mod", 140);
26081   suffix("++");
26082   prefix("++", "preinc");
26083   state.syntax["++"].exps = true;
26084   state.syntax["++"].ltBoundary = "before";
26086   suffix("--");
26087   prefix("--", "predec");
26088   state.syntax["--"].exps = true;
26089   state.syntax["--"].ltBoundary = "before";
26091   prefix("delete", function() {
26092     var p = expression(10);
26093     if (!p) {
26094       return this;
26095     }
26097     if (p.id !== "." && p.id !== "[") {
26098       warning("W051");
26099     }
26100     this.first = p;
26102     // The `delete` operator accepts unresolvable references when not in strict
26103     // mode, so the operand may be undefined.
26104     if (p.identifier && !state.isStrict()) {
26105       p.forgiveUndef = true;
26106     }
26107     return this;
26108   }).exps = true;
26110   prefix("~", function() {
26111     if (state.option.bitwise) {
26112       warning("W016", this, "~");
26113     }
26114     this.arity = "unary";
26115     this.right = expression(150);
26116     return this;
26117   });
26119   prefix("...", function() {
26120     if (!state.inES6(true)) {
26121       warning("W119", this, "spread/rest operator", "6");
26122     }
26124     // TODO: Allow all AssignmentExpression
26125     // once parsing permits.
26126     //
26127     // How to handle eg. number, boolean when the built-in
26128     // prototype of may have an @@iterator definition?
26129     //
26130     // Number.prototype[Symbol.iterator] = function * () {
26131     //   yield this.valueOf();
26132     // };
26133     //
26134     // var a = [ ...1 ];
26135     // console.log(a); // [1];
26136     //
26137     // for (let n of [...10]) {
26138     //    console.log(n);
26139     // }
26140     // // 10
26141     //
26142     //
26143     // Boolean.prototype[Symbol.iterator] = function * () {
26144     //   yield this.valueOf();
26145     // };
26146     //
26147     // var a = [ ...true ];
26148     // console.log(a); // [true];
26149     //
26150     // for (let n of [...false]) {
26151     //    console.log(n);
26152     // }
26153     // // false
26154     //
26155     if (!state.tokens.next.identifier &&
26156         state.tokens.next.type !== "(string)" &&
26157           !checkPunctuators(state.tokens.next, ["[", "("])) {
26159       error("E030", state.tokens.next, state.tokens.next.value);
26160     }
26161     this.right = expression(150);
26162     return this;
26163   });
26165   prefix("!", function() {
26166     this.arity = "unary";
26167     this.right = expression(150);
26169     if (!this.right) { // '!' followed by nothing? Give up.
26170       quit("E041", this);
26171     }
26173     if (bang[this.right.id] === true) {
26174       warning("W018", this, "!");
26175     }
26176     return this;
26177   });
26179   prefix("typeof", (function() {
26180     var p = expression(150);
26181     this.first = this.right = p;
26183     if (!p) { // 'typeof' followed by nothing? Give up.
26184       quit("E041", this);
26185     }
26187     // The `typeof` operator accepts unresolvable references, so the operand
26188     // may be undefined.
26189     if (p.identifier) {
26190       p.forgiveUndef = true;
26191     }
26192     return this;
26193   }));
26194   prefix("new", function() {
26195     var mp = metaProperty("target", function() {
26196       if (!state.inES6(true)) {
26197         warning("W119", state.tokens.prev, "new.target", "6");
26198       }
26199       var inFunction, c = state.funct;
26200       while (c) {
26201         inFunction = !c["(global)"];
26202         if (!c["(arrow)"]) { break; }
26203         c = c["(context)"];
26204       }
26205       if (!inFunction) {
26206         warning("W136", state.tokens.prev, "new.target");
26207       }
26208     });
26209     if (mp) { return mp; }
26211     var c = expression(155), i;
26212     if (c && c.id !== "function") {
26213       if (c.identifier) {
26214         switch (c.value) {
26215         case "Number":
26216         case "String":
26217         case "Boolean":
26218         case "Math":
26219         case "JSON":
26220           warning("W053", state.tokens.prev, c.value);
26221           break;
26222         case "Symbol":
26223           if (state.inES6()) {
26224             warning("W053", state.tokens.prev, c.value);
26225           }
26226           break;
26227         case "Function":
26228           if (!state.option.evil) {
26229             warning("W054");
26230           }
26231           break;
26232         case "Date":
26233         case "RegExp":
26234         case "this":
26235           break;
26236         default:
26237           if (c.id !== "function") {
26238             i = c.value.substr(0, 1);
26239             if (state.option.newcap && (i < "A" || i > "Z") &&
26240               !state.funct["(scope)"].isPredefined(c.value)) {
26241               warning("W055", state.tokens.curr);
26242             }
26243           }
26244         }
26245       } else {
26246         if (c.id !== "." && c.id !== "[" && c.id !== "(") {
26247           warning("W056", state.tokens.curr);
26248         }
26249       }
26250     } else {
26251       if (!state.option.supernew)
26252         warning("W057", this);
26253     }
26254     if (state.tokens.next.id !== "(" && !state.option.supernew) {
26255       warning("W058", state.tokens.curr, state.tokens.curr.value);
26256     }
26257     this.first = this.right = c;
26258     return this;
26259   });
26260   state.syntax["new"].exps = true;
26262   prefix("void").exps = true;
26264   infix(".", function(left, that) {
26265     var m = identifier(true);
26267     if (typeof m === "string") {
26268       countMember(m);
26269     }
26271     that.left = left;
26272     that.right = m;
26274     if (m && m === "hasOwnProperty" && state.tokens.next.value === "=") {
26275       warning("W001");
26276     }
26278     if (left && left.value === "arguments" && (m === "callee" || m === "caller")) {
26279       if (state.option.noarg)
26280         warning("W059", left, m);
26281       else if (state.isStrict())
26282         error("E008");
26283     } else if (!state.option.evil && left && left.value === "document" &&
26284         (m === "write" || m === "writeln")) {
26285       warning("W060", left);
26286     }
26288     if (!state.option.evil && (m === "eval" || m === "execScript")) {
26289       if (isGlobalEval(left, state)) {
26290         warning("W061");
26291       }
26292     }
26294     return that;
26295   }, 160, true);
26297   infix("(", function(left, that) {
26298     if (state.option.immed && left && !left.immed && left.id === "function") {
26299       warning("W062");
26300     }
26302     if (state.option.asi && checkPunctuators(state.tokens.prev, [")", "]"]) &&
26303       state.tokens.prev.line !== startLine(state.tokens.curr)) {
26304       warning("W014", state.tokens.curr, state.tokens.curr.id);
26305     }
26307     var n = 0;
26308     var p = [];
26310     if (left) {
26311       if (left.type === "(identifier)") {
26312         if (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) {
26313           if ("Array Number String Boolean Date Object Error Symbol".indexOf(left.value) === -1) {
26314             if (left.value === "Math") {
26315               warning("W063", left);
26316             } else if (state.option.newcap) {
26317               warning("W064", left);
26318             }
26319           }
26320         }
26321       }
26322     }
26324     if (state.tokens.next.id !== ")") {
26325       for (;;) {
26326         p[p.length] = expression(10);
26327         n += 1;
26328         if (state.tokens.next.id !== ",") {
26329           break;
26330         }
26331         parseComma();
26332       }
26333     }
26335     advance(")");
26337     if (typeof left === "object") {
26338       if (!state.inES5() && left.value === "parseInt" && n === 1) {
26339         warning("W065", state.tokens.curr);
26340       }
26341       if (!state.option.evil) {
26342         if (left.value === "eval" || left.value === "Function" ||
26343             left.value === "execScript") {
26344           warning("W061", left);
26346           // This conditional expression was initially implemented with a typo
26347           // which prevented the branch's execution in all cases. While
26348           // enabling the code will produce behavior that is consistent with
26349           // the other forms of code evaluation that follow, such a change is
26350           // also technically incompatable with prior versions of JSHint (due
26351           // to the fact that the behavior was never formally documented). This
26352           // branch should be enabled as part of a major release.
26353           //if (p[0] && p[0].id === "(string)") {
26354           //  addEvalCode(left, p[0]);
26355           //}
26356         } else if (p[0] && p[0].id === "(string)" &&
26357              (left.value === "setTimeout" ||
26358             left.value === "setInterval")) {
26359           warning("W066", left);
26360           addEvalCode(left, p[0]);
26362         // window.setTimeout/setInterval
26363         } else if (p[0] && p[0].id === "(string)" &&
26364              left.value === "." &&
26365              left.left.value === "window" &&
26366              (left.right === "setTimeout" ||
26367             left.right === "setInterval")) {
26368           warning("W066", left);
26369           addEvalCode(left, p[0]);
26370         }
26371       }
26372       if (!left.identifier && left.id !== "." && left.id !== "[" && left.id !== "=>" &&
26373           left.id !== "(" && left.id !== "&&" && left.id !== "||" && left.id !== "?" &&
26374           !(state.inES6() && left["(name)"])) {
26375         warning("W067", that);
26376       }
26377     }
26379     that.left = left;
26380     return that;
26381   }, 155, true).exps = true;
26383   prefix("(", function(rbp) {
26384     var pn = state.tokens.next, pn1, i = -1;
26385     var ret, triggerFnExpr, first, last;
26386     var parens = 1;
26387     var opening = state.tokens.curr;
26388     var preceeding = state.tokens.prev;
26389     var isNecessary = !state.option.singleGroups;
26391     do {
26392       if (pn.value === "(") {
26393         parens += 1;
26394       } else if (pn.value === ")") {
26395         parens -= 1;
26396       }
26398       i += 1;
26399       pn1 = pn;
26400       pn = peek(i);
26401     } while (!(parens === 0 && pn1.value === ")") && pn.type !== "(end)");
26403     if (state.tokens.next.id === "function") {
26404       triggerFnExpr = state.tokens.next.immed = true;
26405     }
26407     // If the balanced grouping operator is followed by a "fat arrow", the
26408     // current token marks the beginning of a "fat arrow" function and parsing
26409     // should proceed accordingly.
26410     if (pn.value === "=>") {
26411       return doFunction({ type: "arrow", parsedOpening: true });
26412     }
26414     var exprs = [];
26416     if (state.tokens.next.id !== ")") {
26417       for (;;) {
26418         exprs.push(expression(10));
26420         if (state.tokens.next.id !== ",") {
26421           break;
26422         }
26424         if (state.option.nocomma) {
26425           warning("W127");
26426         }
26428         parseComma();
26429       }
26430     }
26432     advance(")", this);
26433     if (state.option.immed && exprs[0] && exprs[0].id === "function") {
26434       if (state.tokens.next.id !== "(" &&
26435         state.tokens.next.id !== "." && state.tokens.next.id !== "[") {
26436         warning("W068", this);
26437       }
26438     }
26440     if (!exprs.length) {
26441       return;
26442     }
26443     if (exprs.length > 1) {
26444       ret = Object.create(state.syntax[","]);
26445       ret.exprs = exprs;
26447       first = exprs[0];
26448       last = exprs[exprs.length - 1];
26449     } else {
26450       ret = first = last = exprs[0];
26452       if (!isNecessary) {
26453         isNecessary =
26454           // Used to distinguish from an ExpressionStatement which may not
26455           // begin with the `{` and `function` tokens
26456           (opening.beginsStmt && (ret.id === "{" || triggerFnExpr || isFunctor(ret))) ||
26457           // Used to signal that a function expression is being supplied to
26458           // some other operator.
26459           (triggerFnExpr &&
26460             // For parenthesis wrapping a function expression to be considered
26461             // necessary, the grouping operator should be the left-hand-side of
26462             // some other operator--either within the parenthesis or directly
26463             // following them.
26464             (!isEndOfExpr() || state.tokens.prev.id !== "}")) ||
26465           // Used to demarcate an arrow function as the left-hand side of some
26466           // operator.
26467           (isFunctor(ret) && !isEndOfExpr()) ||
26468           // Used as the return value of a single-statement arrow function
26469           (ret.id === "{" && preceeding.id === "=>") ||
26470           // Used to delineate an integer number literal from a dereferencing
26471           // punctuator (otherwise interpreted as a decimal point)
26472           (ret.type === "(number)" &&
26473             checkPunctuator(pn, ".") && /^\d+$/.test(ret.value)) ||
26474           // Used to wrap object destructuring assignment
26475           (opening.beginsStmt && ret.id === "=" && ret.left.id === "{");
26476       }
26477     }
26479     if (ret) {
26480       // The operator may be necessary to override the default binding power of
26481       // neighboring operators (whenever there is an operator in use within the
26482       // first expression *or* the current group contains multiple expressions)
26483       if (!isNecessary && (isOperator(first) || ret.exprs)) {
26484         isNecessary =
26485           (rbp > first.lbp) ||
26486           (rbp > 0 && rbp === first.lbp) ||
26487           (!isEndOfExpr() && last.lbp < state.tokens.next.lbp);
26488       }
26490       if (!isNecessary) {
26491         warning("W126", opening);
26492       }
26494       ret.paren = true;
26495     }
26497     return ret;
26498   });
26500   application("=>");
26502   infix("[", function(left, that) {
26503     var e, s, canUseDot;
26505     if (state.option.asi && checkPunctuators(state.tokens.prev, [")", "]"]) &&
26506       state.tokens.prev.line !== startLine(state.tokens.curr)) {
26507       warning("W014", state.tokens.curr, state.tokens.curr.id);
26508     }
26510     e = expression(10);
26512     if (e && e.type === "(string)") {
26513       if (!state.option.evil && (e.value === "eval" || e.value === "execScript")) {
26514         if (isGlobalEval(left, state)) {
26515           warning("W061");
26516         }
26517       }
26519       countMember(e.value);
26520       if (!state.option.sub && reg.identifier.test(e.value)) {
26521         s = state.syntax[e.value];
26523         if (s) {
26524           canUseDot = !isReserved(s);
26525         } else {
26526           // This branch exists to preserve legacy behavior with version 2.9.5
26527           // and earlier. In those releases, `eval` and `arguments` were
26528           // incorrectly interpreted as reserved keywords, so Member
26529           // Expressions such as `object["eval"]` did not trigger warning W069.
26530           //
26531           // TODO: Remove in JSHint 3
26532           canUseDot = e.value !== "eval" && e.value !== "arguments";
26533         }
26535         if (canUseDot) {
26536           warning("W069", state.tokens.prev, e.value);
26537         }
26538       }
26539     }
26540     advance("]", that);
26542     if (e && e.value === "hasOwnProperty" && state.tokens.next.value === "=") {
26543       warning("W001");
26544     }
26546     that.left = left;
26547     that.right = e;
26548     return that;
26549   }, 160, true);
26551   function comprehensiveArrayExpression() {
26552     var res = {};
26553     res.exps = true;
26554     state.funct["(comparray)"].stack();
26556     // Handle reversed for expressions, used in spidermonkey
26557     var reversed = false;
26558     if (state.tokens.next.value !== "for") {
26559       reversed = true;
26560       if (!state.inMoz()) {
26561         warning("W116", state.tokens.next, "for", state.tokens.next.value);
26562       }
26563       state.funct["(comparray)"].setState("use");
26564       res.right = expression(10);
26565     }
26567     advance("for");
26568     if (state.tokens.next.value === "each") {
26569       advance("each");
26570       if (!state.inMoz()) {
26571         warning("W118", state.tokens.curr, "for each");
26572       }
26573     }
26574     advance("(");
26575     state.funct["(comparray)"].setState("define");
26576     res.left = expression(130);
26577     if (_.includes(["in", "of"], state.tokens.next.value)) {
26578       advance();
26579     } else {
26580       error("E045", state.tokens.curr);
26581     }
26582     state.funct["(comparray)"].setState("generate");
26583     expression(10);
26585     advance(")");
26586     if (state.tokens.next.value === "if") {
26587       advance("if");
26588       advance("(");
26589       state.funct["(comparray)"].setState("filter");
26590       expression(10);
26591       advance(")");
26592     }
26594     if (!reversed) {
26595       state.funct["(comparray)"].setState("use");
26596       res.right = expression(10);
26597     }
26599     advance("]");
26600     state.funct["(comparray)"].unstack();
26601     return res;
26602   }
26604   prefix("[", function() {
26605     var blocktype = lookupBlockType();
26606     if (blocktype.isCompArray) {
26607       if (!state.option.esnext && !state.inMoz()) {
26608         warning("W118", state.tokens.curr, "array comprehension");
26609       }
26610       return comprehensiveArrayExpression();
26611     } else if (blocktype.isDestAssign) {
26612       this.destructAssign = destructuringPattern({ openingParsed: true, assignment: true });
26613       return this;
26614     }
26615     var b = state.tokens.curr.line !== startLine(state.tokens.next);
26616     this.first = [];
26617     if (b) {
26618       indent += state.option.indent;
26619       if (state.tokens.next.from === indent + state.option.indent) {
26620         indent += state.option.indent;
26621       }
26622     }
26623     while (state.tokens.next.id !== "(end)") {
26624       while (state.tokens.next.id === ",") {
26625         if (!state.option.elision) {
26626           if (!state.inES5()) {
26627             // Maintain compat with old options --- ES5 mode without
26628             // elision=true will warn once per comma
26629             warning("W070");
26630           } else {
26631             warning("W128");
26632             do {
26633               advance(",");
26634             } while (state.tokens.next.id === ",");
26635             continue;
26636           }
26637         }
26638         advance(",");
26639       }
26641       if (state.tokens.next.id === "]") {
26642         break;
26643       }
26645       this.first.push(expression(10));
26646       if (state.tokens.next.id === ",") {
26647         parseComma({ allowTrailing: true });
26648         if (state.tokens.next.id === "]" && !state.inES5()) {
26649           warning("W070", state.tokens.curr);
26650           break;
26651         }
26652       } else {
26653         if (state.option.trailingcomma && state.inES5()) {
26654           warningAt("W140", state.tokens.curr.line, state.tokens.curr.character);
26655         }
26656         break;
26657       }
26658     }
26659     if (b) {
26660       indent -= state.option.indent;
26661     }
26662     advance("]", this);
26663     return this;
26664   });
26667   function isMethod() {
26668     return state.funct["(statement)"] && state.funct["(statement)"].type === "class" ||
26669            state.funct["(context)"] && state.funct["(context)"]["(verb)"] === "class";
26670   }
26673   function isPropertyName(token) {
26674     return token.identifier || token.id === "(string)" || token.id === "(number)";
26675   }
26678   function propertyName(preserveOrToken) {
26679     var id;
26680     var preserve = true;
26681     if (typeof preserveOrToken === "object") {
26682       id = preserveOrToken;
26683     } else {
26684       preserve = preserveOrToken;
26685       id = optionalidentifier(true, preserve);
26686     }
26688     if (!id) {
26689       if (state.tokens.next.id === "(string)") {
26690         id = state.tokens.next.value;
26691         if (!preserve) {
26692           advance();
26693         }
26694       } else if (state.tokens.next.id === "(number)") {
26695         id = state.tokens.next.value.toString();
26696         if (!preserve) {
26697           advance();
26698         }
26699       }
26700     } else if (typeof id === "object") {
26701       if (id.id === "(string)" || id.id === "(identifier)") id = id.value;
26702       else if (id.id === "(number)") id = id.value.toString();
26703     }
26705     if (id === "hasOwnProperty") {
26706       warning("W001");
26707     }
26709     return id;
26710   }
26712   /**
26713    * @param {Object} [options]
26714    * @param {token} [options.loneArg] The argument to the function in cases
26715    *                                  where it was defined using the
26716    *                                  single-argument shorthand.
26717    * @param {bool} [options.parsedOpening] Whether the opening parenthesis has
26718    *                                       already been parsed.
26719    * @returns {{ arity: number, params: Array.<string>}}
26720    */
26721   function functionparams(options) {
26722     var next;
26723     var paramsIds = [];
26724     var ident;
26725     var tokens = [];
26726     var t;
26727     var pastDefault = false;
26728     var pastRest = false;
26729     var arity = 0;
26730     var loneArg = options && options.loneArg;
26732     if (loneArg && loneArg.identifier === true) {
26733       state.funct["(scope)"].addParam(loneArg.value, loneArg);
26734       return { arity: 1, params: [ loneArg.value ] };
26735     }
26737     next = state.tokens.next;
26739     if (!options || !options.parsedOpening) {
26740       advance("(");
26741     }
26743     if (state.tokens.next.id === ")") {
26744       advance(")");
26745       return;
26746     }
26748     function addParam(addParamArgs) {
26749       state.funct["(scope)"].addParam.apply(state.funct["(scope)"], addParamArgs);
26750     }
26752     for (;;) {
26753       arity++;
26754       // are added to the param scope
26755       var currentParams = [];
26757       if (_.includes(["{", "["], state.tokens.next.id)) {
26758         tokens = destructuringPattern();
26759         for (t in tokens) {
26760           t = tokens[t];
26761           if (t.id) {
26762             paramsIds.push(t.id);
26763             currentParams.push([t.id, t.token]);
26764           }
26765         }
26766       } else {
26767         if (checkPunctuator(state.tokens.next, "...")) pastRest = true;
26768         ident = identifier();
26769         if (ident) {
26770           paramsIds.push(ident);
26771           currentParams.push([ident, state.tokens.curr]);
26772         } else {
26773           // Skip invalid parameter.
26774           while (!checkPunctuators(state.tokens.next, [",", ")"])) advance();
26775         }
26776       }
26778       // It is valid to have a regular argument after a default argument
26779       // since undefined can be used for missing parameters. Still warn as it is
26780       // a possible code smell.
26781       if (pastDefault) {
26782         if (state.tokens.next.id !== "=") {
26783           error("W138", state.tokens.curr);
26784         }
26785       }
26786       if (state.tokens.next.id === "=") {
26787         if (!state.inES6()) {
26788           warning("W119", state.tokens.next, "default parameters", "6");
26789         }
26791         if (pastRest) {
26792           error("E062", state.tokens.next);
26793         }
26795         advance("=");
26796         pastDefault = true;
26797         expression(10);
26798       }
26800       // now we have evaluated the default expression, add the variable to the param scope
26801       currentParams.forEach(addParam);
26803       if (state.tokens.next.id === ",") {
26804         if (pastRest) {
26805           warning("W131", state.tokens.next);
26806         }
26807         parseComma();
26808       } else {
26809         advance(")", next);
26810         return { arity: arity, params: paramsIds };
26811       }
26812     }
26813   }
26815   function functor(name, token, overwrites) {
26816     var funct = {
26817       "(name)"      : name,
26818       "(breakage)"  : 0,
26819       "(loopage)"   : 0,
26820       // The strictness of the function body is tracked via a dedicated
26821       // property (as opposed to via the global `state` object) so that the
26822       // value can be referenced after the body has been fully parsed (i.e.
26823       // when validating the identifier used in function declarations and
26824       // function expressions).
26825       "(isStrict)"  : "unknown",
26827       "(global)"    : false,
26829       "(line)"      : null,
26830       "(character)" : null,
26831       "(metrics)"   : null,
26832       "(statement)" : null,
26833       "(context)"   : null,
26834       "(scope)"     : null,
26835       "(comparray)" : null,
26836       "(generator)" : null,
26837       "(arrow)"     : null,
26838       "(params)"    : null
26839     };
26841     if (token) {
26842       _.extend(funct, {
26843         "(line)"     : token.line,
26844         "(character)": token.character,
26845         "(metrics)"  : createMetrics(token)
26846       });
26847     }
26849     _.extend(funct, overwrites);
26851     if (funct["(context)"]) {
26852       funct["(scope)"] = funct["(context)"]["(scope)"];
26853       funct["(comparray)"]  = funct["(context)"]["(comparray)"];
26854     }
26856     return funct;
26857   }
26859   function isFunctor(token) {
26860     return "(scope)" in token;
26861   }
26863   /**
26864    * Determine if the parser has begun parsing executable code.
26865    *
26866    * @param {Token} funct - The current "functor" token
26867    *
26868    * @returns {boolean}
26869    */
26870   function hasParsedCode(funct) {
26871     return funct["(global)"] && !funct["(verb)"];
26872   }
26874   /**
26875    * This function is used as both a null-denotation method *and* a
26876    * left-denotation method, meaning the first parameter is overloaded.
26877    */
26878   function doTemplateLiteral(leftOrRbp) {
26879     // ASSERT: this.type === "(template)"
26880     // jshint validthis: true
26881     var ctx = this.context;
26882     var noSubst = this.noSubst;
26883     var depth = this.depth;
26884     var left = typeof leftOrRbp === "number" ? null : leftOrRbp;
26886     if (!noSubst) {
26887       while (!end()) {
26888         if (!state.tokens.next.template || state.tokens.next.depth > depth) {
26889           expression(0); // should probably have different rbp?
26890         } else {
26891           // skip template start / middle
26892           advance();
26893         }
26894       }
26895     }
26897     return {
26898       id: "(template)",
26899       type: "(template)",
26900       tag: left
26901     };
26903     function end() {
26904       if (state.tokens.curr.template && state.tokens.curr.tail &&
26905           state.tokens.curr.context === ctx) return true;
26906       var complete = (state.tokens.next.template && state.tokens.next.tail &&
26907                       state.tokens.next.context === ctx);
26908       if (complete) advance();
26909       return complete || state.tokens.next.isUnclosed;
26910     }
26911   }
26913   /**
26914    * @param {Object} [options]
26915    * @param {string} [options.name] The identifier belonging to the function (if
26916    *                                any)
26917    * @param {token} [options.statement] The statement that triggered creation
26918    *                                    of the current function.
26919    * @param {string} [options.type] If specified, either "generator" or "arrow"
26920    * @param {token} [options.loneArg] The argument to the function in cases
26921    *                                  where it was defined using the
26922    *                                  single-argument shorthand
26923    * @param {bool} [options.parsedOpening] Whether the opening parenthesis has
26924    *                                       already been parsed
26925    * @param {string} [options.classExprBinding] Define a function with this
26926    *                                            identifier in the new function's
26927    *                                            scope, mimicking the bahavior of
26928    *                                            class expression names within
26929    *                                            the body of member functions.
26930    */
26931   function doFunction(options) {
26932     var f, token, name, statement, classExprBinding, isGenerator, isArrow,
26933       isMethod, ignoreLoopFunc;
26934     var oldOption = state.option;
26935     var oldIgnored = state.ignored;
26937     if (options) {
26938       name = options.name;
26939       statement = options.statement;
26940       classExprBinding = options.classExprBinding;
26941       isGenerator = options.type === "generator";
26942       isArrow = options.type === "arrow";
26943       isMethod = options.isMethod;
26944       ignoreLoopFunc = options.ignoreLoopFunc;
26945     }
26947     state.option = Object.create(state.option);
26948     state.ignored = Object.create(state.ignored);
26950     state.funct = functor(name || state.nameStack.infer(), state.tokens.next, {
26951       "(statement)": statement,
26952       "(context)":   state.funct,
26953       "(arrow)":     isArrow,
26954       "(method)":    isMethod,
26955       "(generator)": isGenerator
26956     });
26958     f = state.funct;
26959     token = state.tokens.curr;
26961     functions.push(state.funct);
26963     // So that the function is available to itself and referencing itself is not
26964     // seen as a closure, add the function name to a new scope, but do not
26965     // test for unused (unused: false)
26966     // it is a new block scope so that params can override it, it can be block scoped
26967     // but declarations inside the function don't cause already declared error
26968     state.funct["(scope)"].stack("functionouter");
26969     var internallyAccessibleName = name || classExprBinding;
26970     if (internallyAccessibleName) {
26971       state.funct["(scope)"].block.add(internallyAccessibleName,
26972         classExprBinding ? "class" : "function", state.tokens.curr, false);
26973     }
26975     if (!isArrow) {
26976       state.funct["(scope)"].funct.add("arguments", "var", token, false);
26977     }
26979     // create the param scope (params added in functionparams)
26980     state.funct["(scope)"].stack("functionparams");
26982     var paramsInfo = functionparams(options);
26984     if (paramsInfo) {
26985       state.funct["(params)"] = paramsInfo.params;
26986       state.funct["(metrics)"].arity = paramsInfo.arity;
26987       state.funct["(metrics)"].verifyMaxParametersPerFunction();
26988     } else {
26989       state.funct["(metrics)"].arity = 0;
26990     }
26992     if (isArrow) {
26993       if (!state.inES6(true)) {
26994         warning("W119", state.tokens.curr, "arrow function syntax (=>)", "6");
26995       }
26997       if (!options.loneArg) {
26998         advance("=>");
26999       }
27000     }
27002     block(false, true, true, isArrow);
27004     if (!state.option.noyield && isGenerator &&
27005         state.funct["(generator)"] !== "yielded") {
27006       warning("W124", state.tokens.curr);
27007     }
27009     state.funct["(metrics)"].verifyMaxStatementsPerFunction();
27010     state.funct["(metrics)"].verifyMaxComplexityPerFunction();
27011     state.funct["(unusedOption)"] = state.option.unused;
27012     state.option = oldOption;
27013     state.ignored = oldIgnored;
27014     state.funct["(last)"] = state.tokens.curr.line;
27015     state.funct["(lastcharacter)"] = state.tokens.curr.character;
27017     // unstack the params scope
27018     state.funct["(scope)"].unstack(); // also does usage and label checks
27020     // unstack the function outer stack
27021     state.funct["(scope)"].unstack();
27023     state.funct = state.funct["(context)"];
27025     if (!ignoreLoopFunc && !state.option.loopfunc && state.funct["(loopage)"]) {
27026       // If the function we just parsed accesses any non-local variables
27027       // trigger a warning. Otherwise, the function is safe even within
27028       // a loop.
27029       if (f["(outerMutables)"]) {
27030         warning("W083", token, f["(outerMutables)"].join(", "));
27031       }
27032     }
27034     return f;
27035   }
27037   function createMetrics(functionStartToken) {
27038     return {
27039       statementCount: 0,
27040       nestedBlockDepth: -1,
27041       ComplexityCount: 1,
27042       arity: 0,
27044       verifyMaxStatementsPerFunction: function() {
27045         if (state.option.maxstatements &&
27046           this.statementCount > state.option.maxstatements) {
27047           warning("W071", functionStartToken, this.statementCount);
27048         }
27049       },
27051       verifyMaxParametersPerFunction: function() {
27052         if (_.isNumber(state.option.maxparams) &&
27053           this.arity > state.option.maxparams) {
27054           warning("W072", functionStartToken, this.arity);
27055         }
27056       },
27058       verifyMaxNestedBlockDepthPerFunction: function() {
27059         if (state.option.maxdepth &&
27060           this.nestedBlockDepth > 0 &&
27061           this.nestedBlockDepth === state.option.maxdepth + 1) {
27062           warning("W073", null, this.nestedBlockDepth);
27063         }
27064       },
27066       verifyMaxComplexityPerFunction: function() {
27067         var max = state.option.maxcomplexity;
27068         var cc = this.ComplexityCount;
27069         if (max && cc > max) {
27070           warning("W074", functionStartToken, cc);
27071         }
27072       }
27073     };
27074   }
27076   function increaseComplexityCount() {
27077     state.funct["(metrics)"].ComplexityCount += 1;
27078   }
27080   // Parse assignments that were found instead of conditionals.
27081   // For example: if (a = 1) { ... }
27083   function checkCondAssignment(expr) {
27084     var id, paren;
27085     if (expr) {
27086       id = expr.id;
27087       paren = expr.paren;
27088       if (id === "," && (expr = expr.exprs[expr.exprs.length - 1])) {
27089         id = expr.id;
27090         paren = paren || expr.paren;
27091       }
27092     }
27093     switch (id) {
27094     case "=":
27095     case "+=":
27096     case "-=":
27097     case "*=":
27098     case "%=":
27099     case "&=":
27100     case "|=":
27101     case "^=":
27102     case "/=":
27103       if (!paren && !state.option.boss) {
27104         warning("W084");
27105       }
27106     }
27107   }
27109   /**
27110    * @param {object} props Collection of property descriptors for a given
27111    *                       object.
27112    */
27113   function checkProperties(props) {
27114     // Check for lonely setters if in the ES5 mode.
27115     if (state.inES5()) {
27116       for (var name in props) {
27117         if (props[name] && props[name].setterToken && !props[name].getterToken) {
27118           warning("W078", props[name].setterToken);
27119         }
27120       }
27121     }
27122   }
27124   function metaProperty(name, c) {
27125     if (checkPunctuator(state.tokens.next, ".")) {
27126       var left = state.tokens.curr.id;
27127       advance(".");
27128       var id = identifier();
27129       state.tokens.curr.isMetaProperty = true;
27130       if (name !== id) {
27131         error("E057", state.tokens.prev, left, id);
27132       } else {
27133         c();
27134       }
27135       return state.tokens.curr;
27136     }
27137   }
27139   (function(x) {
27140     x.nud = function() {
27141       var b, f, i, p, t, isGeneratorMethod = false, nextVal;
27142       var props = Object.create(null); // All properties, including accessors
27144       b = state.tokens.curr.line !== startLine(state.tokens.next);
27145       if (b) {
27146         indent += state.option.indent;
27147         if (state.tokens.next.from === indent + state.option.indent) {
27148           indent += state.option.indent;
27149         }
27150       }
27152       var blocktype = lookupBlockType();
27153       if (blocktype.isDestAssign) {
27154         this.destructAssign = destructuringPattern({ openingParsed: true, assignment: true });
27155         return this;
27156       }
27158       for (;;) {
27159         if (state.tokens.next.id === "}") {
27160           break;
27161         }
27163         nextVal = state.tokens.next.value;
27164         if (state.tokens.next.identifier &&
27165             (peekIgnoreEOL().id === "," || peekIgnoreEOL().id === "}")) {
27166           if (!state.inES6()) {
27167             warning("W104", state.tokens.next, "object short notation", "6");
27168           }
27169           i = propertyName(true);
27170           saveProperty(props, i, state.tokens.next);
27172           expression(10);
27174         } else if (peek().id !== ":" && (nextVal === "get" || nextVal === "set")) {
27175           advance(nextVal);
27177           if (!state.inES5()) {
27178             error("E034");
27179           }
27181           if (state.tokens.next.id === "[") {
27182             i = computedPropertyName();
27183           } else {
27184             i = propertyName();
27186             // ES6 allows for get() {...} and set() {...} method
27187             // definition shorthand syntax, so we don't produce an error
27188             // if linting ECMAScript 6 code.
27189             if (!i && !state.inES6()) {
27190               error("E035");
27191             }
27192           }
27194           // We don't want to save this getter unless it's an actual getter
27195           // and not an ES6 concise method
27196           if (i) {
27197             saveAccessor(nextVal, props, i, state.tokens.curr);
27198           }
27200           t = state.tokens.next;
27201           f = doFunction({ isMethod: true });
27202           p = f["(params)"];
27204           // Don't warn about getter/setter pairs if this is an ES6 concise method
27205           if (nextVal === "get" && i && p) {
27206             warning("W076", t, p[0], i);
27207           } else if (nextVal === "set" && i && f["(metrics)"].arity !== 1) {
27208             warning("W077", t, i);
27209           }
27210         } else {
27211           if (state.tokens.next.value === "*" && state.tokens.next.type === "(punctuator)") {
27212             if (!state.inES6()) {
27213               warning("W104", state.tokens.next, "generator functions", "6");
27214             }
27215             advance("*");
27216             isGeneratorMethod = true;
27217           } else {
27218             isGeneratorMethod = false;
27219           }
27221           if (state.tokens.next.id === "[") {
27222             i = computedPropertyName();
27223             state.nameStack.set(i);
27224           } else {
27225             state.nameStack.set(state.tokens.next);
27226             i = propertyName();
27227             saveProperty(props, i, state.tokens.next);
27229             if (typeof i !== "string") {
27230               break;
27231             }
27232           }
27234           if (state.tokens.next.value === "(") {
27235             if (!state.inES6()) {
27236               warning("W104", state.tokens.curr, "concise methods", "6");
27237             }
27238             doFunction({
27239               isMethod: true,
27240               type: isGeneratorMethod ? "generator" : null
27241             });
27242           } else {
27243             advance(":");
27244             expression(10);
27245           }
27246         }
27248         countMember(i);
27250         if (state.tokens.next.id === ",") {
27251           parseComma({ allowTrailing: true, property: true });
27252           if (state.tokens.next.id === ",") {
27253             warning("W070", state.tokens.curr);
27254           } else if (state.tokens.next.id === "}" && !state.inES5()) {
27255             warning("W070", state.tokens.curr);
27256           }
27257         } else {
27258           if (state.option.trailingcomma && state.inES5()) {
27259             warningAt("W140", state.tokens.curr.line, state.tokens.curr.character);
27260           }
27261           break;
27262         }
27263       }
27264       if (b) {
27265         indent -= state.option.indent;
27266       }
27267       advance("}", this);
27269       checkProperties(props);
27271       return this;
27272     };
27273     x.fud = function() {
27274       error("E036", state.tokens.curr);
27275     };
27276   }(delim("{")));
27278   function destructuringPattern(options) {
27279     var isAssignment = options && options.assignment;
27281     if (!state.inES6()) {
27282       warning("W104", state.tokens.curr,
27283         isAssignment ? "destructuring assignment" : "destructuring binding", "6");
27284     }
27286     return destructuringPatternRecursive(options);
27287   }
27289   function destructuringPatternRecursive(options) {
27290     var ids, idx;
27291     var identifiers = [];
27292     var openingParsed = options && options.openingParsed;
27293     var isAssignment = options && options.assignment;
27294     var recursiveOptions = isAssignment ? { assignment: isAssignment } : null;
27295     var firstToken = openingParsed ? state.tokens.curr : state.tokens.next;
27297     var nextInnerDE = function() {
27298       var ident;
27299       if (checkPunctuators(state.tokens.next, ["[", "{"])) {
27300         ids = destructuringPatternRecursive(recursiveOptions);
27301         for (idx = 0; idx < ids.length; idx++) {
27302           identifiers.push({ id: ids[idx].id, token: ids[idx].token });
27303         }
27304       } else if (checkPunctuator(state.tokens.next, ",")) {
27305         identifiers.push({ id: null, token: state.tokens.curr });
27306       } else if (checkPunctuator(state.tokens.next, "(")) {
27307         advance("(");
27308         nextInnerDE();
27309         advance(")");
27310       } else {
27311         var is_rest = checkPunctuator(state.tokens.next, "...");
27313         if (isAssignment) {
27314           var assignTarget = expression(20);
27315           if (assignTarget) {
27316             checkLeftSideAssign(assignTarget);
27318             // if the target was a simple identifier, add it to the list to return
27319             if (assignTarget.identifier) {
27320               ident = assignTarget.value;
27321             }
27322           }
27323         } else {
27324           ident = identifier();
27325         }
27326         if (ident) {
27327           identifiers.push({ id: ident, token: state.tokens.curr });
27328         }
27329         return is_rest;
27330       }
27331       return false;
27332     };
27333     var assignmentProperty = function() {
27334       var id;
27335       if (checkPunctuator(state.tokens.next, "[")) {
27336         advance("[");
27337         expression(10);
27338         advance("]");
27339         advance(":");
27340         nextInnerDE();
27341       } else if (state.tokens.next.id === "(string)" ||
27342                  state.tokens.next.id === "(number)") {
27343         advance();
27344         advance(":");
27345         nextInnerDE();
27346       } else {
27347         // this id will either be the property name or the property name and the assigning identifier
27348         id = identifier();
27349         if (checkPunctuator(state.tokens.next, ":")) {
27350           advance(":");
27351           nextInnerDE();
27352         } else if (id) {
27353           // in this case we are assigning (not declaring), so check assignment
27354           if (isAssignment) {
27355             checkLeftSideAssign(state.tokens.curr);
27356           }
27357           identifiers.push({ id: id, token: state.tokens.curr });
27358         }
27359       }
27360     };
27362     var id, value;
27363     if (checkPunctuator(firstToken, "[")) {
27364       if (!openingParsed) {
27365         advance("[");
27366       }
27367       if (checkPunctuator(state.tokens.next, "]")) {
27368         warning("W137", state.tokens.curr);
27369       }
27370       var element_after_rest = false;
27371       while (!checkPunctuator(state.tokens.next, "]")) {
27372         if (nextInnerDE() && !element_after_rest &&
27373             checkPunctuator(state.tokens.next, ",")) {
27374           warning("W130", state.tokens.next);
27375           element_after_rest = true;
27376         }
27377         if (checkPunctuator(state.tokens.next, "=")) {
27378           if (checkPunctuator(state.tokens.prev, "...")) {
27379             advance("]");
27380           } else {
27381             advance("=");
27382           }
27383           id = state.tokens.prev;
27384           value = expression(10);
27385           if (value && value.identifier && value.value === "undefined") {
27386             warning("W080", id, id.value);
27387           }
27388         }
27389         if (!checkPunctuator(state.tokens.next, "]")) {
27390           advance(",");
27391         }
27392       }
27393       advance("]");
27394     } else if (checkPunctuator(firstToken, "{")) {
27396       if (!openingParsed) {
27397         advance("{");
27398       }
27399       if (checkPunctuator(state.tokens.next, "}")) {
27400         warning("W137", state.tokens.curr);
27401       }
27402       while (!checkPunctuator(state.tokens.next, "}")) {
27403         assignmentProperty();
27404         if (checkPunctuator(state.tokens.next, "=")) {
27405           advance("=");
27406           id = state.tokens.prev;
27407           value = expression(10);
27408           if (value && value.identifier && value.value === "undefined") {
27409             warning("W080", id, id.value);
27410           }
27411         }
27412         if (!checkPunctuator(state.tokens.next, "}")) {
27413           advance(",");
27414           if (checkPunctuator(state.tokens.next, "}")) {
27415             // Trailing comma
27416             // ObjectBindingPattern: { BindingPropertyList , }
27417             break;
27418           }
27419         }
27420       }
27421       advance("}");
27422     }
27423     return identifiers;
27424   }
27426   function destructuringPatternMatch(tokens, value) {
27427     var first = value.first;
27429     if (!first)
27430       return;
27432     _.zip(tokens, Array.isArray(first) ? first : [ first ]).forEach(function(val) {
27433       var token = val[0];
27434       var value = val[1];
27436       if (token && value)
27437         token.first = value;
27438       else if (token && token.first && !value)
27439         warning("W080", token.first, token.first.value);
27440     });
27441   }
27443   function blockVariableStatement(type, statement, context) {
27444     // used for both let and const statements
27446     var prefix = context && context.prefix;
27447     var inexport = context && context.inexport;
27448     var isLet = type === "let";
27449     var isConst = type === "const";
27450     var tokens, lone, value, letblock;
27452     if (!state.inES6()) {
27453       warning("W104", state.tokens.curr, type, "6");
27454     }
27456     if (isLet && state.tokens.next.value === "(") {
27457       if (!state.inMoz()) {
27458         warning("W118", state.tokens.next, "let block");
27459       }
27460       advance("(");
27461       state.funct["(scope)"].stack();
27462       letblock = true;
27463     } else if (state.funct["(noblockscopedvar)"]) {
27464       error("E048", state.tokens.curr, isConst ? "Const" : "Let");
27465     }
27467     statement.first = [];
27468     for (;;) {
27469       var names = [];
27470       if (_.includes(["{", "["], state.tokens.next.value)) {
27471         tokens = destructuringPattern();
27472         lone = false;
27473       } else {
27474         tokens = [ { id: identifier(), token: state.tokens.curr } ];
27475         lone = true;
27476       }
27478       if (!prefix && isConst && state.tokens.next.id !== "=") {
27479         warning("E012", state.tokens.curr, state.tokens.curr.value);
27480       }
27482       for (var t in tokens) {
27483         if (tokens.hasOwnProperty(t)) {
27484           t = tokens[t];
27485           if (state.funct["(scope)"].block.isGlobal()) {
27486             if (predefined[t.id] === false) {
27487               warning("W079", t.token, t.id);
27488             }
27489           }
27490           if (t.id && !state.funct["(noblockscopedvar)"]) {
27491             state.funct["(scope)"].addlabel(t.id, {
27492               type: type,
27493               token: t.token });
27494             names.push(t.token);
27495           }
27496         }
27497       }
27499       if (state.tokens.next.id === "=") {
27500         advance("=");
27501         if (!prefix && peek(0).id === "=" && state.tokens.next.identifier) {
27502           warning("W120", state.tokens.next, state.tokens.next.value);
27503         }
27504         var id = state.tokens.prev;
27505         // don't accept `in` in expression if prefix is used for ForIn/Of loop.
27506         value = expression(prefix ? 120 : 10);
27507         if (!prefix && value && value.identifier && value.value === "undefined") {
27508           warning("W080", id, id.value);
27509         }
27510         if (!lone) {
27511           destructuringPatternMatch(names, value);
27512         }
27513       }
27515       if (!prefix) {
27516         for (t in tokens) {
27517           if (tokens.hasOwnProperty(t)) {
27518             t = tokens[t];
27519             state.funct["(scope)"].initialize(t.id);
27521             if (lone && inexport) {
27522               state.funct["(scope)"].setExported(t.token.value, t.token);
27523             }
27524           }
27525         }
27526       }
27528       statement.first = statement.first.concat(names);
27530       if (state.tokens.next.id !== ",") {
27531         break;
27532       }
27533       parseComma();
27534     }
27535     if (letblock) {
27536       advance(")");
27537       block(true, true);
27538       statement.block = true;
27539       state.funct["(scope)"].unstack();
27540     }
27542     return statement;
27543   }
27545   var conststatement = stmt("const", function(context) {
27546     return blockVariableStatement("const", this, context);
27547   });
27548   conststatement.exps = true;
27550   var letstatement = stmt("let", function(context) {
27551     return blockVariableStatement("let", this, context);
27552   });
27553   letstatement.exps = true;
27555   var varstatement = stmt("var", function(context) {
27556     var prefix = context && context.prefix;
27557     var inexport = context && context.inexport;
27558     var tokens, lone, value, id;
27560     this.first = [];
27561     for (;;) {
27562       var names = [];
27563       if (_.includes(["{", "["], state.tokens.next.value)) {
27564         tokens = destructuringPattern();
27565         lone = false;
27566       } else {
27567         tokens = [];
27568         id = identifier();
27570         if (id) {
27571           tokens.push({ id: id, token: state.tokens.curr });
27572         }
27574         lone = true;
27575       }
27577       if (state.option.varstmt) {
27578         warning("W132", this);
27579       }
27581       this.first = this.first.concat(names);
27583       for (var t in tokens) {
27584         if (tokens.hasOwnProperty(t)) {
27585           t = tokens[t];
27586           if (state.funct["(global)"] && !state.impliedClosure()) {
27587             if (predefined[t.id] === false) {
27588               warning("W079", t.token, t.id);
27589             } else if (state.option.futurehostile === false) {
27590               if ((!state.inES5() && vars.ecmaIdentifiers[5][t.id] === false) ||
27591                 (!state.inES6() && vars.ecmaIdentifiers[6][t.id] === false)) {
27592                 warning("W129", t.token, t.id);
27593               }
27594             }
27595           }
27596           if (t.id) {
27597             state.funct["(scope)"].addlabel(t.id, {
27598               type: "var",
27599               token: t.token });
27601             if (lone && inexport) {
27602               state.funct["(scope)"].setExported(t.id, t.token);
27603             }
27604             names.push(t.token);
27605           }
27606         }
27607       }
27609       if (state.tokens.next.id === "=") {
27610         state.nameStack.set(state.tokens.curr);
27612         advance("=");
27613         if (peek(0).id === "=" && state.tokens.next.identifier) {
27614           if (!prefix &&
27615               !state.funct["(params)"] ||
27616               state.funct["(params)"].indexOf(state.tokens.next.value) === -1) {
27617             warning("W120", state.tokens.next, state.tokens.next.value);
27618           }
27619         }
27620         id = state.tokens.prev;
27621         // don't accept `in` in expression if prefix is used for ForIn/Of loop.
27622         value = expression(prefix ? 120 : 10);
27623         if (value && !prefix && !state.funct["(loopage)"] &&
27624           value.identifier && value.value === "undefined") {
27625           warning("W080", id, id.value);
27626         }
27627         if (!lone) {
27628           destructuringPatternMatch(names, value);
27629         }
27630       }
27632       if (state.tokens.next.id !== ",") {
27633         break;
27634       }
27635       parseComma();
27636     }
27638     return this;
27639   });
27640   varstatement.exps = true;
27642   blockstmt("class", function(rbp) {
27643     return classdef.call(this, rbp, true);
27644   });
27646   function classdef(rbp, isStatement) {
27648     /*jshint validthis:true */
27649     var wasInClassBody = state.inClassBody;
27650     state.inClassBody = true;
27652     if (!state.inES6()) {
27653       warning("W104", state.tokens.curr, "class", "6");
27654     }
27655     if (isStatement) {
27656       // BindingIdentifier
27657       this.name = identifier();
27659       state.funct["(scope)"].addlabel(this.name, {
27660         type: "class",
27661         token: state.tokens.curr });
27663     } else if (state.tokens.next.identifier && state.tokens.next.value !== "extends") {
27664       // BindingIdentifier(opt)
27665       this.name = identifier();
27666       this.namedExpr = true;
27667     } else {
27668       this.name = state.nameStack.infer();
27669     }
27671     classtail(this);
27673     state.inClassBody = wasInClassBody;
27675     if (isStatement) {
27676       state.funct["(scope)"].initialize(this.name);
27677     }
27679     return this;
27680   }
27682   function classtail(c) {
27683     // ClassHeritage(opt)
27684     if (state.tokens.next.value === "extends") {
27685       advance("extends");
27686       expression(10);
27687     }
27689     advance("{");
27690     // ClassBody(opt)
27691     classbody(c);
27692     advance("}");
27693   }
27695   function classbody(c) {
27696     var name;
27697     var isStatic;
27698     var isGenerator;
27699     var getset;
27700     var props = Object.create(null);
27701     var staticProps = Object.create(null);
27702     var computed;
27703     while (state.tokens.next.id !== "}") {
27704       name = state.tokens.next;
27705       isStatic = false;
27706       isGenerator = false;
27707       getset = null;
27709       // The ES6 grammar for ClassElement includes the `;` token, but it is
27710       // defined only as a placeholder to facilitate future language
27711       // extensions. In ES6 code, it serves no purpose.
27712       if (name.id === ";") {
27713         warning("W032");
27714         advance(";");
27715         continue;
27716       }
27718       if (name.id === "*") {
27719         isGenerator = true;
27720         advance("*");
27721         name = state.tokens.next;
27722       }
27723       if (name.id === "[") {
27724         name = computedPropertyName();
27725         computed = true;
27726       } else if (isPropertyName(name)) {
27727         // Non-Computed PropertyName
27728         advance();
27729         computed = false;
27730         if (name.identifier && name.value === "static") {
27731           if (checkPunctuator(state.tokens.next, "*")) {
27732             isGenerator = true;
27733             advance("*");
27734           }
27735           if (isPropertyName(state.tokens.next) || state.tokens.next.id === "[") {
27736             computed = state.tokens.next.id === "[";
27737             isStatic = true;
27738             name = state.tokens.next;
27739             if (state.tokens.next.id === "[") {
27740               name = computedPropertyName();
27741             } else advance();
27742           }
27743         }
27745         if (name.identifier && (name.value === "get" || name.value === "set")) {
27746           if (isPropertyName(state.tokens.next) || state.tokens.next.id === "[") {
27747             computed = state.tokens.next.id === "[";
27748             getset = name;
27749             name = state.tokens.next;
27750             if (state.tokens.next.id === "[") {
27751               name = computedPropertyName();
27752             } else advance();
27753           }
27754         }
27755       } else {
27756         warning("W052", state.tokens.next, state.tokens.next.value || state.tokens.next.type);
27757         advance();
27758         continue;
27759       }
27761       if (!checkPunctuator(state.tokens.next, "(")) {
27762         // error --- class properties must be methods
27763         error("E054", state.tokens.next, state.tokens.next.value);
27764         while (state.tokens.next.id !== "}" &&
27765                !checkPunctuator(state.tokens.next, "(")) {
27766           advance();
27767         }
27768         if (state.tokens.next.value !== "(") {
27769           doFunction({
27770             isMethod: true,
27771             statement: c
27772           });
27773         }
27774       }
27776       if (!computed) {
27777         // We don't know how to determine if we have duplicate computed property names :(
27778         if (getset) {
27779           saveAccessor(
27780             getset.value, isStatic ? staticProps : props, name.value, name, true, isStatic);
27781         } else {
27782           if (name.value === "constructor") {
27783             state.nameStack.set(c);
27784           } else {
27785             state.nameStack.set(name);
27786           }
27787           saveProperty(isStatic ? staticProps : props, name.value, name, true, isStatic);
27788         }
27789       }
27791       if (getset && name.value === "constructor") {
27792         var propDesc = getset.value === "get" ? "class getter method" : "class setter method";
27793         error("E049", name, propDesc, "constructor");
27794       } else if (name.value === "prototype") {
27795         error("E049", name, "class method", "prototype");
27796       }
27798       propertyName(name);
27800       doFunction({
27801         statement: c,
27802         isMethod: true,
27803         type: isGenerator ? "generator" : null,
27804         classExprBinding: c.namedExpr ? c.name : null
27805       });
27806     }
27808     checkProperties(props);
27809   }
27811   blockstmt("function", function(context) {
27812     var inexport = context && context.inexport;
27813     var generator = false;
27814     if (state.tokens.next.value === "*") {
27815       advance("*");
27816       if (state.inES6(true)) {
27817         generator = true;
27818       } else {
27819         warning("W119", state.tokens.curr, "function*", "6");
27820       }
27821     }
27822     if (inblock) {
27823       warning("W082", state.tokens.curr);
27824     }
27825     var nameToken = optionalidentifier() ? state.tokens.curr : null;
27827     if (!nameToken) {
27828       warning("W025");
27829     } else {
27830       state.funct["(scope)"].addlabel(nameToken.value, {
27831         type: generator ? "generator function" : "function",
27832         token: state.tokens.curr,
27833         initialized: true });
27835       if (inexport) {
27836         state.funct["(scope)"].setExported(nameToken.value, state.tokens.prev);
27837       }
27838     }
27840     var f = doFunction({
27841       name: nameToken && nameToken.value,
27842       statement: this,
27843       type: generator ? "generator" : null,
27844       ignoreLoopFunc: inblock // a declaration may already have warned
27845     });
27847     // If the function declaration is strict because the surrounding code is
27848     // strict, the invalid name will trigger E008 when the scope manager
27849     // attempts to create a binding in the strict environment record. An error
27850     // should only be signaled here when the function itself enables strict
27851     // mode (the scope manager will not report an error because a declaration
27852     // does not introduce a binding into the function's environment record).
27853     var enablesStrictMode = f["(isStrict)"] && !state.isStrict();
27854     if (nameToken && (f["(name)"] === "arguments" || f["(name)"] === "eval") &&
27855       enablesStrictMode) {
27856       error("E008", nameToken);
27857     }
27859     if (state.tokens.next.id === "(" && state.tokens.next.line === state.tokens.curr.line) {
27860       error("E039");
27861     }
27862     return this;
27863   });
27865   prefix("function", function() {
27866     var generator = false;
27868     if (state.tokens.next.value === "*") {
27869       if (!state.inES6()) {
27870         warning("W119", state.tokens.curr, "function*", "6");
27871       }
27872       advance("*");
27873       generator = true;
27874     }
27876     var nameToken = optionalidentifier() ? state.tokens.curr : null;
27878     var f = doFunction({
27879       name: nameToken && nameToken.value,
27880       type: generator ? "generator" : null
27881     });
27883     if (nameToken && (f["(name)"] === "arguments" || f["(name)"] === "eval") &&
27884       f["(isStrict)"]) {
27885       error("E008", nameToken);
27886     }
27887     return this;
27888   });
27890   blockstmt("if", function() {
27891     var t = state.tokens.next;
27892     increaseComplexityCount();
27893     state.condition = true;
27894     advance("(");
27895     var expr = expression(0);
27897     if (!expr) {
27898       quit("E041", this);
27899     }
27901     checkCondAssignment(expr);
27903     // When the if is within a for-in loop, check if the condition
27904     // starts with a negation operator
27905     var forinifcheck = null;
27906     if (state.option.forin && state.forinifcheckneeded) {
27907       state.forinifcheckneeded = false; // We only need to analyze the first if inside the loop
27908       forinifcheck = state.forinifchecks[state.forinifchecks.length - 1];
27909       if (expr.type === "(punctuator)" && expr.value === "!") {
27910         forinifcheck.type = "(negative)";
27911       } else {
27912         forinifcheck.type = "(positive)";
27913       }
27914     }
27916     advance(")", t);
27917     state.condition = false;
27918     var s = block(true, true);
27920     // When the if is within a for-in loop and the condition has a negative form,
27921     // check if the body contains nothing but a continue statement
27922     if (forinifcheck && forinifcheck.type === "(negative)") {
27923       if (s && s[0] && s[0].type === "(identifier)" && s[0].value === "continue") {
27924         forinifcheck.type = "(negative-with-continue)";
27925       }
27926     }
27928     if (state.tokens.next.id === "else") {
27929       advance("else");
27930       if (state.tokens.next.id === "if" || state.tokens.next.id === "switch") {
27931         statement();
27932       } else {
27933         block(true, true);
27934       }
27935     }
27936     return this;
27937   });
27939   blockstmt("try", function() {
27940     var b;
27942     function doCatch() {
27943       advance("catch");
27944       advance("(");
27946       state.funct["(scope)"].stack("catchparams");
27948       if (checkPunctuators(state.tokens.next, ["[", "{"])) {
27949         var tokens = destructuringPattern();
27950         _.each(tokens, function(token) {
27951           if (token.id) {
27952             state.funct["(scope)"].addParam(token.id, token, "exception");
27953           }
27954         });
27955       } else if (state.tokens.next.type !== "(identifier)") {
27956         warning("E030", state.tokens.next, state.tokens.next.value);
27957       } else {
27958         // only advance if we have an identifier so we can continue parsing in the most common error - that no param is given.
27959         state.funct["(scope)"].addParam(identifier(), state.tokens.curr, "exception");
27960       }
27962       if (state.tokens.next.value === "if") {
27963         if (!state.inMoz()) {
27964           warning("W118", state.tokens.curr, "catch filter");
27965         }
27966         advance("if");
27967         expression(0);
27968       }
27970       advance(")");
27972       block(false);
27974       state.funct["(scope)"].unstack();
27975     }
27977     block(true);
27979     while (state.tokens.next.id === "catch") {
27980       increaseComplexityCount();
27981       if (b && (!state.inMoz())) {
27982         warning("W118", state.tokens.next, "multiple catch blocks");
27983       }
27984       doCatch();
27985       b = true;
27986     }
27988     if (state.tokens.next.id === "finally") {
27989       advance("finally");
27990       block(true);
27991       return;
27992     }
27994     if (!b) {
27995       error("E021", state.tokens.next, "catch", state.tokens.next.value);
27996     }
27998     return this;
27999   });
28001   blockstmt("while", function() {
28002     var t = state.tokens.next;
28003     state.funct["(breakage)"] += 1;
28004     state.funct["(loopage)"] += 1;
28005     increaseComplexityCount();
28006     advance("(");
28007     checkCondAssignment(expression(0));
28008     advance(")", t);
28009     block(true, true);
28010     state.funct["(breakage)"] -= 1;
28011     state.funct["(loopage)"] -= 1;
28012     return this;
28013   }).labelled = true;
28015   blockstmt("with", function() {
28016     var t = state.tokens.next;
28017     if (state.isStrict()) {
28018       error("E010", state.tokens.curr);
28019     } else if (!state.option.withstmt) {
28020       warning("W085", state.tokens.curr);
28021     }
28023     advance("(");
28024     expression(0);
28025     advance(")", t);
28026     block(true, true);
28028     return this;
28029   });
28031   blockstmt("switch", function() {
28032     var t = state.tokens.next;
28033     var g = false;
28034     var noindent = false;
28036     state.funct["(breakage)"] += 1;
28037     advance("(");
28038     checkCondAssignment(expression(0));
28039     advance(")", t);
28040     t = state.tokens.next;
28041     advance("{");
28042     state.funct["(scope)"].stack();
28044     if (state.tokens.next.from === indent)
28045       noindent = true;
28047     if (!noindent)
28048       indent += state.option.indent;
28050     this.cases = [];
28052     for (;;) {
28053       switch (state.tokens.next.id) {
28054       case "case":
28055         switch (state.funct["(verb)"]) {
28056         case "yield":
28057         case "break":
28058         case "case":
28059         case "continue":
28060         case "return":
28061         case "switch":
28062         case "throw":
28063           break;
28064         default:
28065           // You can tell JSHint that you don't use break intentionally by
28066           // adding a comment /* falls through */ on a line just before
28067           // the next `case`.
28068           if (!state.tokens.curr.caseFallsThrough) {
28069             warning("W086", state.tokens.curr, "case");
28070           }
28071         }
28073         advance("case");
28074         this.cases.push(expression(0));
28075         increaseComplexityCount();
28076         g = true;
28077         advance(":");
28078         state.funct["(verb)"] = "case";
28079         break;
28080       case "default":
28081         switch (state.funct["(verb)"]) {
28082         case "yield":
28083         case "break":
28084         case "continue":
28085         case "return":
28086         case "throw":
28087           break;
28088         default:
28089           // Do not display a warning if 'default' is the first statement or if
28090           // there is a special /* falls through */ comment.
28091           if (this.cases.length) {
28092             if (!state.tokens.curr.caseFallsThrough) {
28093               warning("W086", state.tokens.curr, "default");
28094             }
28095           }
28096         }
28098         advance("default");
28099         g = true;
28100         advance(":");
28101         break;
28102       case "}":
28103         if (!noindent)
28104           indent -= state.option.indent;
28106         advance("}", t);
28107         state.funct["(scope)"].unstack();
28108         state.funct["(breakage)"] -= 1;
28109         state.funct["(verb)"] = undefined;
28110         return;
28111       case "(end)":
28112         error("E023", state.tokens.next, "}");
28113         return;
28114       default:
28115         indent += state.option.indent;
28116         if (g) {
28117           switch (state.tokens.curr.id) {
28118           case ",":
28119             error("E040");
28120             return;
28121           case ":":
28122             g = false;
28123             statements();
28124             break;
28125           default:
28126             error("E025", state.tokens.curr);
28127             return;
28128           }
28129         } else {
28130           if (state.tokens.curr.id === ":") {
28131             advance(":");
28132             error("E024", state.tokens.curr, ":");
28133             statements();
28134           } else {
28135             error("E021", state.tokens.next, "case", state.tokens.next.value);
28136             return;
28137           }
28138         }
28139         indent -= state.option.indent;
28140       }
28141     }
28142   }).labelled = true;
28144   stmt("debugger", function() {
28145     if (!state.option.debug) {
28146       warning("W087", this);
28147     }
28148     return this;
28149   }).exps = true;
28151   (function() {
28152     var x = stmt("do", function() {
28153       state.funct["(breakage)"] += 1;
28154       state.funct["(loopage)"] += 1;
28155       increaseComplexityCount();
28157       this.first = block(true, true);
28158       advance("while");
28159       var t = state.tokens.next;
28160       advance("(");
28161       checkCondAssignment(expression(0));
28162       advance(")", t);
28163       state.funct["(breakage)"] -= 1;
28164       state.funct["(loopage)"] -= 1;
28165       return this;
28166     });
28167     x.labelled = true;
28168     x.exps = true;
28169   }());
28171   blockstmt("for", function() {
28172     var s, t = state.tokens.next;
28173     var letscope = false;
28174     var foreachtok = null;
28176     if (t.value === "each") {
28177       foreachtok = t;
28178       advance("each");
28179       if (!state.inMoz()) {
28180         warning("W118", state.tokens.curr, "for each");
28181       }
28182     }
28184     increaseComplexityCount();
28185     advance("(");
28187     // what kind of for(…) statement it is? for(…of…)? for(…in…)? for(…;…;…)?
28188     var nextop; // contains the token of the "in" or "of" operator
28189     var i = 0;
28190     var inof = ["in", "of"];
28191     var level = 0; // BindingPattern "level" --- level 0 === no BindingPattern
28192     var comma; // First comma punctuator at level 0
28193     var initializer; // First initializer at level 0
28194     var bindingPower;
28195     var targets;
28196     var target;
28198     // If initial token is a BindingPattern, count it as such.
28199     if (checkPunctuators(state.tokens.next, ["{", "["])) ++level;
28200     do {
28201       nextop = peek(i);
28202       ++i;
28203       if (checkPunctuators(nextop, ["{", "["])) ++level;
28204       else if (checkPunctuators(nextop, ["}", "]"])) --level;
28205       if (level < 0) break;
28206       if (level === 0) {
28207         if (!comma && checkPunctuator(nextop, ",")) comma = nextop;
28208         else if (!initializer && checkPunctuator(nextop, "=")) initializer = nextop;
28209       }
28210     } while (
28211       (level > 0 || !_.includes(inof, nextop.value) && nextop.value !== ";") &&
28212       nextop.type !== "(end)");
28214     // if we're in a for (… in|of â€¦) statement
28215     if (_.includes(inof, nextop.value)) {
28216       if (nextop.value === "of") {
28217         bindingPower = 20;
28218         if (!state.inES6()) {
28219           warning("W104", nextop, "for of", "6");
28220         }
28221       } else {
28222         bindingPower = 0;
28223       }
28225       if (initializer) {
28226         error("W133", comma, nextop.value, "initializer is forbidden");
28227       }
28229       if (comma) {
28230         error("W133", comma, nextop.value, "more than one ForBinding");
28231       }
28233       if (state.tokens.next.id === "var") {
28234         advance("var");
28235         state.tokens.curr.fud({ prefix: true });
28236       } else if (state.tokens.next.id === "let" || state.tokens.next.id === "const") {
28237         advance(state.tokens.next.id);
28238         // create a new block scope
28239         letscope = true;
28240         state.funct["(scope)"].stack();
28241         state.tokens.curr.fud({ prefix: true });
28242       } else {
28243         targets = [];
28245         // The following parsing logic recognizes initializers and the comma
28246         // operator despite the fact that they are not supported by the
28247         // grammar. Doing so allows JSHint to emit more a meaningful error
28248         // message (i.e. W133) in response to a common programming mistake.
28249         do {
28250           if (checkPunctuators(state.tokens.next, ["{", "["])) {
28251             destructuringPattern({ assignment: true }).forEach(function(elem) {
28252               this.push(elem.token);
28253             }, targets);
28254           } else {
28255             target = expression(120);
28257             if (target.type === "(identifier)") {
28258               targets.push(target);
28259             }
28261             checkLeftSideAssign(target, nextop);
28262           }
28264           if (checkPunctuator(state.tokens.next, "=")) {
28265             advance("=");
28266             expression(120);
28267           }
28269           if (checkPunctuator(state.tokens.next, ",")) {
28270             advance(",");
28271           }
28272         } while (state.tokens.next !== nextop);
28274         // In the event of a syntax error, do no issue warnings regarding the
28275         // implicit creation of bindings.
28276         if (!initializer && !comma) {
28277           targets.forEach(function(token) {
28278             if (!state.funct["(scope)"].has(token.value)) {
28279               warning("W088", token, token.value);
28280             }
28281           });
28282         }
28283       }
28285       advance(nextop.value);
28286       // The binding power is variable because for-in statements accept any
28287       // Expression in this position, while for-of statements are limited to
28288       // AssignmentExpressions. For example:
28289       //
28290       //     for ( LeftHandSideExpression in Expression ) Statement
28291       //     for ( LeftHandSideExpression of AssignmentExpression ) Statement
28292       expression(bindingPower);
28293       advance(")", t);
28295       if (nextop.value === "in" && state.option.forin) {
28296         state.forinifcheckneeded = true;
28298         if (state.forinifchecks === undefined) {
28299           state.forinifchecks = [];
28300         }
28302         // Push a new for-in-if check onto the stack. The type will be modified
28303         // when the loop's body is parsed and a suitable if statement exists.
28304         state.forinifchecks.push({
28305           type: "(none)"
28306         });
28307       }
28309       state.funct["(breakage)"] += 1;
28310       state.funct["(loopage)"] += 1;
28312       s = block(true, true);
28314       if (nextop.value === "in" && state.option.forin) {
28315         if (state.forinifchecks && state.forinifchecks.length > 0) {
28316           var check = state.forinifchecks.pop();
28318           if (// No if statement or not the first statement in loop body
28319               s && s.length > 0 && (typeof s[0] !== "object" || s[0].value !== "if") ||
28320               // Positive if statement is not the only one in loop body
28321               check.type === "(positive)" && s.length > 1 ||
28322               // Negative if statement but no continue
28323               check.type === "(negative)") {
28324             warning("W089", this);
28325           }
28326         }
28328         // Reset the flag in case no if statement was contained in the loop body
28329         state.forinifcheckneeded = false;
28330       }
28332       state.funct["(breakage)"] -= 1;
28333       state.funct["(loopage)"] -= 1;
28334     } else {
28335       if (foreachtok) {
28336         error("E045", foreachtok);
28337       }
28338       if (state.tokens.next.id !== ";") {
28339         if (state.tokens.next.id === "var") {
28340           advance("var");
28341           state.tokens.curr.fud();
28342         } else if (state.tokens.next.id === "let") {
28343           advance("let");
28344           // create a new block scope
28345           letscope = true;
28346           state.funct["(scope)"].stack();
28347           state.tokens.curr.fud();
28348         } else {
28349           for (;;) {
28350             expression(0, "for");
28351             if (state.tokens.next.id !== ",") {
28352               break;
28353             }
28354             parseComma();
28355           }
28356         }
28357       }
28358       nolinebreak(state.tokens.curr);
28359       advance(";");
28361       // start loopage after the first ; as the next two expressions are executed
28362       // on every loop
28363       state.funct["(loopage)"] += 1;
28364       if (state.tokens.next.id !== ";") {
28365         checkCondAssignment(expression(0));
28366       }
28367       nolinebreak(state.tokens.curr);
28368       advance(";");
28369       if (state.tokens.next.id === ";") {
28370         error("E021", state.tokens.next, ")", ";");
28371       }
28372       if (state.tokens.next.id !== ")") {
28373         for (;;) {
28374           expression(0, "for");
28375           if (state.tokens.next.id !== ",") {
28376             break;
28377           }
28378           parseComma();
28379         }
28380       }
28381       advance(")", t);
28382       state.funct["(breakage)"] += 1;
28383       block(true, true);
28384       state.funct["(breakage)"] -= 1;
28385       state.funct["(loopage)"] -= 1;
28387     }
28388     // unstack loop blockscope
28389     if (letscope) {
28390       state.funct["(scope)"].unstack();
28391     }
28392     return this;
28393   }).labelled = true;
28396   stmt("break", function() {
28397     var v = state.tokens.next.value;
28399     if (!state.option.asi)
28400       nolinebreak(this);
28402     if (state.tokens.next.id !== ";" && !state.tokens.next.reach &&
28403         state.tokens.curr.line === startLine(state.tokens.next)) {
28404       if (!state.funct["(scope)"].funct.hasBreakLabel(v)) {
28405         warning("W090", state.tokens.next, v);
28406       }
28407       this.first = state.tokens.next;
28408       advance();
28409     } else {
28410       if (state.funct["(breakage)"] === 0)
28411         warning("W052", state.tokens.next, this.value);
28412     }
28414     reachable(this);
28416     return this;
28417   }).exps = true;
28420   stmt("continue", function() {
28421     var v = state.tokens.next.value;
28423     if (state.funct["(breakage)"] === 0 || !state.funct["(loopage)"]) {
28424       warning("W052", state.tokens.next, this.value);
28425     }
28427     if (!state.option.asi)
28428       nolinebreak(this);
28430     if (state.tokens.next.id !== ";" && !state.tokens.next.reach) {
28431       if (state.tokens.curr.line === startLine(state.tokens.next)) {
28432         if (!state.funct["(scope)"].funct.hasBreakLabel(v)) {
28433           warning("W090", state.tokens.next, v);
28434         }
28435         this.first = state.tokens.next;
28436         advance();
28437       }
28438     }
28440     reachable(this);
28442     return this;
28443   }).exps = true;
28446   stmt("return", function() {
28447     if (this.line === startLine(state.tokens.next)) {
28448       if (state.tokens.next.id !== ";" && !state.tokens.next.reach) {
28449         this.first = expression(0);
28451         if (this.first &&
28452             this.first.type === "(punctuator)" && this.first.value === "=" &&
28453             !this.first.paren && !state.option.boss) {
28454           warningAt("W093", this.first.line, this.first.character);
28455         }
28456       }
28457     } else {
28458       if (state.tokens.next.type === "(punctuator)" &&
28459         ["[", "{", "+", "-"].indexOf(state.tokens.next.value) > -1) {
28460         nolinebreak(this); // always warn (Line breaking error)
28461       }
28462     }
28464     reachable(this);
28466     return this;
28467   }).exps = true;
28469   (function(x) {
28470     x.exps = true;
28471     x.lbp = 25;
28472     x.ltBoundary = "after";
28473   }(prefix("yield", function() {
28474     if (state.inMoz()) {
28475       return mozYield.call(this);
28476     }
28477     var prev = state.tokens.prev;
28479     if (!this.beginsStmt && prev.lbp > 30 && !checkPunctuators(prev, ["("])) {
28480       error("E061", this);
28481     }
28483     if (state.inES6(true) && !state.funct["(generator)"]) {
28484       // If it's a yield within a catch clause inside a generator then that's ok
28485       if (!("(catch)" === state.funct["(name)"] && state.funct["(context)"]["(generator)"])) {
28486         error("E046", state.tokens.curr, "yield");
28487       }
28488     } else if (!state.inES6()) {
28489       warning("W104", state.tokens.curr, "yield", "6");
28490     }
28491     state.funct["(generator)"] = "yielded";
28493     if (state.tokens.next.value === "*") {
28494       advance("*");
28495     }
28497     // Parse operand
28498     if (!isEndOfExpr() && state.tokens.next.id !== ",") {
28499       if (state.tokens.next.nud) {
28501         nobreaknonadjacent(state.tokens.curr, state.tokens.next);
28502         this.first = expression(10);
28504         if (this.first.type === "(punctuator)" && this.first.value === "=" &&
28505             !this.first.paren && !state.option.boss) {
28506           warningAt("W093", this.first.line, this.first.character);
28507         }
28508       } else if (state.tokens.next.led) {
28509         if (state.tokens.next.id !== ",") {
28510           error("W017", state.tokens.next);
28511         }
28512       }
28513     }
28515     return this;
28516   })));
28518   /**
28519    * Parsing logic for non-standard Mozilla implementation of `yield`
28520    * expressions.
28521    */
28522   var mozYield = function() {
28523     var prev = state.tokens.prev;
28524     if (state.inES6(true) && !state.funct["(generator)"]) {
28525       // If it's a yield within a catch clause inside a generator then that's ok
28526       if (!("(catch)" === state.funct["(name)"] && state.funct["(context)"]["(generator)"])) {
28527         error("E046", state.tokens.curr, "yield");
28528       }
28529     }
28530     state.funct["(generator)"] = "yielded";
28531     var delegatingYield = false;
28533     if (state.tokens.next.value === "*") {
28534       delegatingYield = true;
28535       advance("*");
28536     }
28538     if (this.line === startLine(state.tokens.next)) {
28539       if (delegatingYield ||
28540           (state.tokens.next.id !== ";" && !state.option.asi &&
28541            !state.tokens.next.reach && state.tokens.next.nud)) {
28543         nobreaknonadjacent(state.tokens.curr, state.tokens.next);
28544         this.first = expression(10);
28546         if (this.first.type === "(punctuator)" && this.first.value === "=" &&
28547             !this.first.paren && !state.option.boss) {
28548           warningAt("W093", this.first.line, this.first.character);
28549         }
28550       }
28552       if (state.tokens.next.id !== ")" &&
28553           (prev.lbp > 30 || (!prev.assign && !isEndOfExpr()) || prev.id === "yield")) {
28554         error("E050", this);
28555       }
28556     } else if (!state.option.asi) {
28557       nolinebreak(this); // always warn (Line breaking error)
28558     }
28559     return this;
28560   };
28562   stmt("throw", function() {
28563     nolinebreak(this);
28564     this.first = expression(20);
28566     reachable(this);
28568     return this;
28569   }).exps = true;
28571   stmt("import", function() {
28572     if (!state.funct["(scope)"].block.isGlobal()) {
28573       error("E053", state.tokens.curr, "Import");
28574     }
28576     if (!state.inES6()) {
28577       warning("W119", state.tokens.curr, "import", "6");
28578     }
28580     if (state.tokens.next.type === "(string)") {
28581       // ModuleSpecifier :: StringLiteral
28582       advance("(string)");
28583       return this;
28584     }
28586     if (state.tokens.next.identifier) {
28587       // ImportClause :: ImportedDefaultBinding
28588       this.name = identifier();
28589       // Import bindings are immutable (see ES6 8.1.1.5.5)
28590       state.funct["(scope)"].addlabel(this.name, {
28591         type: "import",
28592         initialized: true,
28593         token: state.tokens.curr });
28595       if (state.tokens.next.value === ",") {
28596         // ImportClause :: ImportedDefaultBinding , NameSpaceImport
28597         // ImportClause :: ImportedDefaultBinding , NamedImports
28598         advance(",");
28599         // At this point, we intentionally fall through to continue matching
28600         // either NameSpaceImport or NamedImports.
28601         // Discussion:
28602         // https://github.com/jshint/jshint/pull/2144#discussion_r23978406
28603       } else {
28604         advance("from");
28605         advance("(string)");
28606         return this;
28607       }
28608     }
28610     if (state.tokens.next.id === "*") {
28611       // ImportClause :: NameSpaceImport
28612       advance("*");
28613       advance("as");
28614       if (state.tokens.next.identifier) {
28615         this.name = identifier();
28616         // Import bindings are immutable (see ES6 8.1.1.5.5)
28617         state.funct["(scope)"].addlabel(this.name, {
28618           type: "import",
28619           initialized: true,
28620           token: state.tokens.curr });
28621       }
28622     } else {
28623       // ImportClause :: NamedImports
28624       advance("{");
28625       for (;;) {
28626         if (state.tokens.next.value === "}") {
28627           advance("}");
28628           break;
28629         }
28630         var importName;
28631         if (state.tokens.next.type === "default") {
28632           importName = "default";
28633           advance("default");
28634         } else {
28635           importName = identifier();
28636         }
28637         if (state.tokens.next.value === "as") {
28638           advance("as");
28639           importName = identifier();
28640         }
28642         // Import bindings are immutable (see ES6 8.1.1.5.5)
28643         state.funct["(scope)"].addlabel(importName, {
28644           type: "import",
28645           initialized: true,
28646           token: state.tokens.curr });
28648         if (state.tokens.next.value === ",") {
28649           advance(",");
28650         } else if (state.tokens.next.value === "}") {
28651           advance("}");
28652           break;
28653         } else {
28654           error("E024", state.tokens.next, state.tokens.next.value);
28655           break;
28656         }
28657       }
28658     }
28660     // FromClause
28661     advance("from");
28662     advance("(string)");
28664     // Support for ES2015 modules was released without warning for `import`
28665     // declarations that lack bindings. Issuing a warning would therefor
28666     // constitute a breaking change.
28667     // TODO: enable this warning in JSHint 3
28668     // if (hasBindings) {
28669     //   warning("W142", this, "import", moduleSpecifier);
28670     // }
28672     return this;
28673   }).exps = true;
28675   stmt("export", function() {
28676     var ok = true;
28677     var token;
28678     var identifier;
28679     var moduleSpecifier;
28681     if (!state.inES6()) {
28682       warning("W119", state.tokens.curr, "export", "6");
28683       ok = false;
28684     }
28686     if (!state.funct["(scope)"].block.isGlobal()) {
28687       error("E053", state.tokens.curr, "Export");
28688       ok = false;
28689     }
28691     if (state.tokens.next.value === "*") {
28692       // ExportDeclaration :: export * FromClause
28693       advance("*");
28694       advance("from");
28695       advance("(string)");
28696       return this;
28697     }
28699     if (state.tokens.next.type === "default") {
28700       // ExportDeclaration ::
28701       //      export default [lookahead âˆ‰ { function, class }] AssignmentExpression[In] ;
28702       //      export default HoistableDeclaration
28703       //      export default ClassDeclaration
28704       state.nameStack.set(state.tokens.next);
28705       advance("default");
28706       var exportType = state.tokens.next.id;
28707       if (exportType === "function" || exportType === "class") {
28708         this.block = true;
28709       }
28711       token = peek();
28713       expression(10);
28715       identifier = token.value;
28717       if (this.block) {
28718         state.funct["(scope)"].addlabel(identifier, {
28719           type: exportType,
28720           initialized: true,
28721           token: token });
28723         state.funct["(scope)"].setExported(identifier, token);
28724       }
28726       return this;
28727     }
28729     if (state.tokens.next.value === "{") {
28730       // ExportDeclaration :: export ExportClause
28731       advance("{");
28732       var exportedTokens = [];
28733       while (!checkPunctuator(state.tokens.next, "}")) {
28734         if (!state.tokens.next.identifier) {
28735           error("E030", state.tokens.next, state.tokens.next.value);
28736         }
28737         advance();
28739         exportedTokens.push(state.tokens.curr);
28741         if (state.tokens.next.value === "as") {
28742           advance("as");
28743           if (!state.tokens.next.identifier) {
28744             error("E030", state.tokens.next, state.tokens.next.value);
28745           }
28746           advance();
28747         }
28749         if (!checkPunctuator(state.tokens.next, "}")) {
28750           advance(",");
28751         }
28752       }
28753       advance("}");
28754       if (state.tokens.next.value === "from") {
28755         // ExportDeclaration :: export ExportClause FromClause
28756         advance("from");
28757         moduleSpecifier = state.tokens.next;
28758         advance("(string)");
28759       } else if (ok) {
28760         exportedTokens.forEach(function(token) {
28761           state.funct["(scope)"].setExported(token.value, token);
28762         });
28763       }
28765       if (exportedTokens.length === 0) {
28766         if (moduleSpecifier) {
28767           warning("W142", this, "export", moduleSpecifier.value);
28768         } else {
28769           warning("W141", this, "export");
28770         }
28771       }
28773       return this;
28774     }
28776     if (state.tokens.next.id === "var") {
28777       // ExportDeclaration :: export VariableStatement
28778       advance("var");
28779       state.tokens.curr.fud({ inexport:true });
28780     } else if (state.tokens.next.id === "let") {
28781       // ExportDeclaration :: export VariableStatement
28782       advance("let");
28783       state.tokens.curr.fud({ inexport:true });
28784     } else if (state.tokens.next.id === "const") {
28785       // ExportDeclaration :: export VariableStatement
28786       advance("const");
28787       state.tokens.curr.fud({ inexport:true });
28788     } else if (state.tokens.next.id === "function") {
28789       // ExportDeclaration :: export Declaration
28790       this.block = true;
28791       advance("function");
28792       state.syntax["function"].fud({ inexport:true });
28793     } else if (state.tokens.next.id === "class") {
28794       // ExportDeclaration :: export Declaration
28795       this.block = true;
28796       advance("class");
28797       var classNameToken = state.tokens.next;
28798       state.syntax["class"].fud();
28799       state.funct["(scope)"].setExported(classNameToken.value, classNameToken);
28800     } else {
28801       error("E024", state.tokens.next, state.tokens.next.value);
28802     }
28804     return this;
28805   }).exps = true;
28807   /**
28808    * Determine if SuperCall or SuperProperty may be used in the current context
28809    * (as described by the provided "functor" object).
28810    *
28811    * @param {string} type - one of "property" or "call"
28812    * @param {object} funct - a "functor" object describing the current function
28813    *                         context
28814    *
28815    * @returns {boolean}
28816    */
28817   function supportsSuper(type, funct) {
28818     if (type === "property" && funct["(method)"]) {
28819       return true;
28820     }
28822     if (type === "call" && funct["(statement)"] &&
28823       funct["(statement)"].id === "class") {
28824       return true;
28825     }
28827     if (funct["(arrow)"]) {
28828       return supportsSuper(type, funct["(context)"]);
28829     }
28831     return false;
28832   }
28834   var superNud = function() {
28835     var next = state.tokens.next;
28837     if (checkPunctuators(next, ["[", "."])) {
28838       if (!supportsSuper("property", state.funct)) {
28839         error("E063", this);
28840       }
28841     } else if (checkPunctuator(next, "(")) {
28842       if (!supportsSuper("call", state.funct)) {
28843         error("E064", this);
28844       }
28845     } else {
28846       error("E024", next, next.value || next.id);
28847     }
28849     return this;
28850   };
28852   // Future Reserved Words
28854   FutureReservedWord("abstract");
28855   FutureReservedWord("await", { es5: true, moduleOnly: true });
28856   FutureReservedWord("boolean");
28857   FutureReservedWord("byte");
28858   FutureReservedWord("char");
28859   FutureReservedWord("class", { es5: true, nud: classdef });
28860   FutureReservedWord("double");
28861   FutureReservedWord("enum", { es5: true });
28862   FutureReservedWord("export", { es5: true });
28863   FutureReservedWord("extends", { es5: true });
28864   FutureReservedWord("final");
28865   FutureReservedWord("float");
28866   FutureReservedWord("goto");
28867   FutureReservedWord("implements", { es5: true, strictOnly: true });
28868   FutureReservedWord("import", { es5: true });
28869   FutureReservedWord("int");
28870   FutureReservedWord("interface", { es5: true, strictOnly: true });
28871   FutureReservedWord("long");
28872   FutureReservedWord("native");
28873   FutureReservedWord("package", { es5: true, strictOnly: true });
28874   FutureReservedWord("private", { es5: true, strictOnly: true });
28875   FutureReservedWord("protected", { es5: true, strictOnly: true });
28876   FutureReservedWord("public", { es5: true, strictOnly: true });
28877   FutureReservedWord("short");
28878   FutureReservedWord("static", { es5: true, strictOnly: true });
28879   FutureReservedWord("super", { es5: true, nud: superNud });
28880   FutureReservedWord("synchronized");
28881   FutureReservedWord("transient");
28882   FutureReservedWord("volatile");
28884   // this function is used to determine whether a squarebracket or a curlybracket
28885   // expression is a comprehension array, destructuring assignment or a json value.
28887   var lookupBlockType = function() {
28888     var pn, pn1, prev;
28889     var i = -1;
28890     var bracketStack = 0;
28891     var ret = {};
28892     if (checkPunctuators(state.tokens.curr, ["[", "{"])) {
28893       bracketStack += 1;
28894     }
28895     do {
28896       prev = i === -1 ? state.tokens.curr : pn;
28897       pn = i === -1 ? state.tokens.next : peek(i);
28898       pn1 = peek(i + 1);
28899       i = i + 1;
28900       if (checkPunctuators(pn, ["[", "{"])) {
28901         bracketStack += 1;
28902       } else if (checkPunctuators(pn, ["]", "}"])) {
28903         bracketStack -= 1;
28904       }
28905       if (bracketStack === 1 && pn.identifier && pn.value === "for" &&
28906           !checkPunctuator(prev, ".")) {
28907         ret.isCompArray = true;
28908         ret.notJson = true;
28909         break;
28910       }
28911       if (bracketStack === 0 && checkPunctuators(pn, ["}", "]"])) {
28912         if (pn1.value === "=") {
28913           ret.isDestAssign = true;
28914           ret.notJson = true;
28915           break;
28916         } else if (pn1.value === ".") {
28917           ret.notJson = true;
28918           break;
28919         }
28920       }
28921       if (checkPunctuator(pn, ";")) {
28922         ret.notJson = true;
28923       }
28924     } while (bracketStack > 0 && pn.id !== "(end)");
28925     return ret;
28926   };
28928   function saveProperty(props, name, tkn, isClass, isStatic) {
28929     var msg = ["key", "class method", "static class method"];
28930     msg = msg[(isClass || false) + (isStatic || false)];
28931     if (tkn.identifier) {
28932       name = tkn.value;
28933     }
28935     if (props[name] && name !== "__proto__") {
28936       warning("W075", state.tokens.next, msg, name);
28937     } else {
28938       props[name] = Object.create(null);
28939     }
28941     props[name].basic = true;
28942     props[name].basictkn = tkn;
28943   }
28945   /**
28946    * @param {string} accessorType - Either "get" or "set"
28947    * @param {object} props - a collection of all properties of the object to
28948    *                         which the current accessor is being assigned
28949    * @param {object} tkn - the identifier token representing the accessor name
28950    * @param {boolean} isClass - whether the accessor is part of an ES6 Class
28951    *                            definition
28952    * @param {boolean} isStatic - whether the accessor is a static method
28953    */
28954   function saveAccessor(accessorType, props, name, tkn, isClass, isStatic) {
28955     var flagName = accessorType === "get" ? "getterToken" : "setterToken";
28956     var msg = "";
28958     if (isClass) {
28959       if (isStatic) {
28960         msg += "static ";
28961       }
28962       msg += accessorType + "ter method";
28963     } else {
28964       msg = "key";
28965     }
28967     state.tokens.curr.accessorType = accessorType;
28968     state.nameStack.set(tkn);
28970     if (props[name]) {
28971       if ((props[name].basic || props[name][flagName]) && name !== "__proto__") {
28972         warning("W075", state.tokens.next, msg, name);
28973       }
28974     } else {
28975       props[name] = Object.create(null);
28976     }
28978     props[name][flagName] = tkn;
28979   }
28981   function computedPropertyName() {
28982     advance("[");
28983     if (!state.inES6()) {
28984       warning("W119", state.tokens.curr, "computed property names", "6");
28985     }
28986     var value = expression(10);
28987     advance("]");
28988     return value;
28989   }
28991   /**
28992    * Test whether a given token is a punctuator matching one of the specified values
28993    * @param {Token} token
28994    * @param {Array.<string>} values
28995    * @returns {boolean}
28996    */
28997   function checkPunctuators(token, values) {
28998     if (token.type === "(punctuator)") {
28999       return _.includes(values, token.value);
29000     }
29001     return false;
29002   }
29004   /**
29005    * Test whether a given token is a punctuator matching the specified value
29006    * @param {Token} token
29007    * @param {string} value
29008    * @returns {boolean}
29009    */
29010   function checkPunctuator(token, value) {
29011     return token.type === "(punctuator)" && token.value === value;
29012   }
29014   // Check whether this function has been reached for a destructuring assign with undeclared values
29015   function destructuringAssignOrJsonValue() {
29016     // lookup for the assignment (ECMAScript 6 only)
29017     // if it has semicolons, it is a block, so go parse it as a block
29018     // or it's not a block, but there are assignments, check for undeclared variables
29020     var block = lookupBlockType();
29021     if (block.notJson) {
29022       if (!state.inES6() && block.isDestAssign) {
29023         warning("W104", state.tokens.curr, "destructuring assignment", "6");
29024       }
29025       statements();
29026     // otherwise parse json value
29027     } else {
29028       state.option.laxbreak = true;
29029       state.jsonMode = true;
29030       jsonValue();
29031     }
29032   }
29034   // array comprehension parsing function
29035   // parses and defines the three states of the list comprehension in order
29036   // to avoid defining global variables, but keeping them to the list comprehension scope
29037   // only. The order of the states are as follows:
29038   //  * "use" which will be the returned iterative part of the list comprehension
29039   //  * "define" which will define the variables local to the list comprehension
29040   //  * "filter" which will help filter out values
29042   var arrayComprehension = function() {
29043     var CompArray = function() {
29044       this.mode = "use";
29045       this.variables = [];
29046     };
29047     var _carrays = [];
29048     var _current;
29049     function declare(v) {
29050       var l = _current.variables.filter(function(elt) {
29051         // if it has, change its undef state
29052         if (elt.value === v) {
29053           elt.undef = false;
29054           return v;
29055         }
29056       }).length;
29057       return l !== 0;
29058     }
29059     function use(v) {
29060       var l = _current.variables.filter(function(elt) {
29061         // and if it has been defined
29062         if (elt.value === v && !elt.undef) {
29063           if (elt.unused === true) {
29064             elt.unused = false;
29065           }
29066           return v;
29067         }
29068       }).length;
29069       // otherwise we warn about it
29070       return (l === 0);
29071     }
29072     return { stack: function() {
29073           _current = new CompArray();
29074           _carrays.push(_current);
29075         },
29076         unstack: function() {
29077           _current.variables.filter(function(v) {
29078             if (v.unused)
29079               warning("W098", v.token, v.token.raw_text || v.value);
29080             if (v.undef)
29081               state.funct["(scope)"].block.use(v.value, v.token);
29082           });
29083           _carrays.splice(-1, 1);
29084           _current = _carrays[_carrays.length - 1];
29085         },
29086         setState: function(s) {
29087           if (_.includes(["use", "define", "generate", "filter"], s))
29088             _current.mode = s;
29089         },
29090         check: function(v) {
29091           if (!_current) {
29092             return;
29093           }
29094           // When we are in "use" state of the list comp, we enqueue that var
29095           if (_current && _current.mode === "use") {
29096             if (use(v)) {
29097               _current.variables.push({
29098                 token: state.tokens.curr,
29099                 value: v,
29100                 undef: true,
29101                 unused: false
29102               });
29103             }
29104             return true;
29105           // When we are in "define" state of the list comp,
29106           } else if (_current && _current.mode === "define") {
29107             // check if the variable has been used previously
29108             if (!declare(v)) {
29109               _current.variables.push({
29110                 token: state.tokens.curr,
29111                 value: v,
29112                 undef: false,
29113                 unused: true
29114               });
29115             }
29116             return true;
29117           // When we are in the "generate" state of the list comp,
29118           } else if (_current && _current.mode === "generate") {
29119             state.funct["(scope)"].block.use(v, state.tokens.curr);
29120             return true;
29121           // When we are in "filter" state,
29122           } else if (_current && _current.mode === "filter") {
29123             // we check whether current variable has been declared
29124             if (use(v)) {
29125               // if not we warn about it
29126               state.funct["(scope)"].block.use(v, state.tokens.curr);
29127             }
29128             return true;
29129           }
29130           return false;
29131         }
29132         };
29133   };
29136   // Parse JSON
29138   function jsonValue() {
29139     function jsonObject() {
29140       var o = {}, t = state.tokens.next;
29141       advance("{");
29142       if (state.tokens.next.id !== "}") {
29143         for (;;) {
29144           if (state.tokens.next.id === "(end)") {
29145             error("E026", state.tokens.next, t.line);
29146           } else if (state.tokens.next.id === "}") {
29147             warning("W094", state.tokens.curr);
29148             break;
29149           } else if (state.tokens.next.id === ",") {
29150             error("E028", state.tokens.next);
29151           } else if (state.tokens.next.id !== "(string)") {
29152             warning("W095", state.tokens.next, state.tokens.next.value);
29153           }
29154           if (o[state.tokens.next.value] === true) {
29155             warning("W075", state.tokens.next, "key", state.tokens.next.value);
29156           } else if ((state.tokens.next.value === "__proto__" &&
29157             !state.option.proto) || (state.tokens.next.value === "__iterator__" &&
29158             !state.option.iterator)) {
29159             warning("W096", state.tokens.next, state.tokens.next.value);
29160           } else {
29161             o[state.tokens.next.value] = true;
29162           }
29163           advance();
29164           advance(":");
29165           jsonValue();
29166           if (state.tokens.next.id !== ",") {
29167             break;
29168           }
29169           advance(",");
29170         }
29171       }
29172       advance("}");
29173     }
29175     function jsonArray() {
29176       var t = state.tokens.next;
29177       advance("[");
29178       if (state.tokens.next.id !== "]") {
29179         for (;;) {
29180           if (state.tokens.next.id === "(end)") {
29181             error("E027", state.tokens.next, t.line);
29182           } else if (state.tokens.next.id === "]") {
29183             warning("W094", state.tokens.curr);
29184             break;
29185           } else if (state.tokens.next.id === ",") {
29186             error("E028", state.tokens.next);
29187           }
29188           jsonValue();
29189           if (state.tokens.next.id !== ",") {
29190             break;
29191           }
29192           advance(",");
29193         }
29194       }
29195       advance("]");
29196     }
29198     switch (state.tokens.next.id) {
29199     case "{":
29200       jsonObject();
29201       break;
29202     case "[":
29203       jsonArray();
29204       break;
29205     case "true":
29206     case "false":
29207     case "null":
29208     case "(number)":
29209     case "(string)":
29210       advance();
29211       break;
29212     case "-":
29213       advance("-");
29214       advance("(number)");
29215       break;
29216     default:
29217       error("E003", state.tokens.next);
29218     }
29219   }
29221   /**
29222    * Lint dynamically-evaluated code, appending any resulting errors/warnings
29223    * into the global `errors` array.
29224    *
29225    * @param {array} internals - collection of "internals" objects describing
29226    *                            string tokens that contain evaluated code
29227    * @param {object} options - linting options to apply
29228    * @param {object} globals - globally-defined bindings for the evaluated code
29229    */
29230   function lintEvalCode(internals, options, globals) {
29231     var priorErrorCount, idx, jdx, internal;
29233     for (idx = 0; idx < internals.length; idx += 1) {
29234       internal = internals[idx];
29235       options.scope = internal.elem;
29236       priorErrorCount = JSHINT.errors.length;
29238       itself(internal.code, options, globals);
29240       for (jdx = priorErrorCount; jdx < JSHINT.errors.length; jdx += 1) {
29241         JSHINT.errors[jdx].line += internal.token.line - 1;
29242       }
29243     }
29244   }
29246   var escapeRegex = function(str) {
29247     return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
29248   };
29250   // The actual JSHINT function itself.
29251   var itself = function(s, o, g) {
29252     var x, reIgnoreStr, reIgnore;
29253     var optionKeys;
29254     var newOptionObj = {};
29255     var newIgnoredObj = {};
29257     o = _.clone(o);
29258     state.reset();
29260     if (o && o.scope) {
29261       JSHINT.scope = o.scope;
29262     } else {
29263       JSHINT.errors = [];
29264       JSHINT.internals = [];
29265       JSHINT.blacklist = {};
29266       JSHINT.scope = "(main)";
29267     }
29269     predefined = Object.create(null);
29270     combine(predefined, vars.ecmaIdentifiers[3]);
29271     combine(predefined, vars.reservedVars);
29273     combine(predefined, g || {});
29275     declared = Object.create(null);
29276     var exported = Object.create(null); // Variables that live outside the current file
29278     function each(obj, cb) {
29279       if (!obj)
29280         return;
29282       if (!Array.isArray(obj) && typeof obj === "object")
29283         obj = Object.keys(obj);
29285       obj.forEach(cb);
29286     }
29288     if (o) {
29289       each(o.predef || null, function(item) {
29290         var slice, prop;
29292         if (item[0] === "-") {
29293           slice = item.slice(1);
29294           JSHINT.blacklist[slice] = slice;
29295           // remove from predefined if there
29296           delete predefined[slice];
29297         } else {
29298           prop = Object.getOwnPropertyDescriptor(o.predef, item);
29299           predefined[item] = prop ? prop.value : false;
29300         }
29301       });
29303       each(o.exported || null, function(item) {
29304         exported[item] = true;
29305       });
29307       delete o.predef;
29308       delete o.exported;
29310       optionKeys = Object.keys(o);
29311       for (x = 0; x < optionKeys.length; x++) {
29312         if (/^-W\d{3}$/g.test(optionKeys[x])) {
29313           newIgnoredObj[optionKeys[x].slice(1)] = true;
29314         } else {
29315           var optionKey = optionKeys[x];
29316           newOptionObj[optionKey] = o[optionKey];
29317         }
29318       }
29319     }
29321     state.option = newOptionObj;
29322     state.ignored = newIgnoredObj;
29324     state.option.indent = state.option.indent || 4;
29325     state.option.maxerr = state.option.maxerr || 50;
29327     indent = 1;
29329     var scopeManagerInst = scopeManager(state, predefined, exported, declared);
29330     scopeManagerInst.on("warning", function(ev) {
29331       warning.apply(null, [ ev.code, ev.token].concat(ev.data));
29332     });
29334     scopeManagerInst.on("error", function(ev) {
29335       error.apply(null, [ ev.code, ev.token ].concat(ev.data));
29336     });
29338     state.funct = functor("(global)", null, {
29339       "(global)"    : true,
29340       "(scope)"     : scopeManagerInst,
29341       "(comparray)" : arrayComprehension(),
29342       "(metrics)"   : createMetrics(state.tokens.next)
29343     });
29345     functions = [state.funct];
29346     urls = [];
29347     member = {};
29348     membersOnly = null;
29349     inblock = false;
29350     lookahead = [];
29352     if (!isString(s) && !Array.isArray(s)) {
29353       errorAt("E004", 0);
29354       return false;
29355     }
29357     api = {
29358       get isJSON() {
29359         return state.jsonMode;
29360       },
29362       getOption: function(name) {
29363         return state.option[name] || null;
29364       },
29366       getCache: function(name) {
29367         return state.cache[name];
29368       },
29370       setCache: function(name, value) {
29371         state.cache[name] = value;
29372       },
29374       warn: function(code, data) {
29375         warningAt.apply(null, [ code, data.line, data.char ].concat(data.data));
29376       },
29378       on: function(names, listener) {
29379         names.split(" ").forEach(function(name) {
29380           emitter.on(name, listener);
29381         }.bind(this));
29382       }
29383     };
29385     emitter.removeAllListeners();
29386     (extraModules || []).forEach(function(func) {
29387       func(api);
29388     });
29390     state.tokens.prev = state.tokens.curr = state.tokens.next = state.syntax["(begin)"];
29392     if (o && o.ignoreDelimiters) {
29394       if (!Array.isArray(o.ignoreDelimiters)) {
29395         o.ignoreDelimiters = [o.ignoreDelimiters];
29396       }
29398       o.ignoreDelimiters.forEach(function(delimiterPair) {
29399         if (!delimiterPair.start || !delimiterPair.end)
29400             return;
29402         reIgnoreStr = escapeRegex(delimiterPair.start) +
29403                       "[\\s\\S]*?" +
29404                       escapeRegex(delimiterPair.end);
29406         reIgnore = new RegExp(reIgnoreStr, "ig");
29408         s = s.replace(reIgnore, function(match) {
29409           return match.replace(/./g, " ");
29410         });
29411       });
29412     }
29414     lex = new Lexer(s);
29416     lex.on("warning", function(ev) {
29417       warningAt.apply(null, [ ev.code, ev.line, ev.character].concat(ev.data));
29418     });
29420     lex.on("error", function(ev) {
29421       errorAt.apply(null, [ ev.code, ev.line, ev.character ].concat(ev.data));
29422     });
29424     lex.on("fatal", function(ev) {
29425       quit("E041", ev);
29426     });
29428     lex.on("Identifier", function(ev) {
29429       emitter.emit("Identifier", ev);
29430     });
29432     lex.on("String", function(ev) {
29433       emitter.emit("String", ev);
29434     });
29436     lex.on("Number", function(ev) {
29437       emitter.emit("Number", ev);
29438     });
29440     // Check options
29441     for (var name in o) {
29442       if (_.has(o, name)) {
29443         checkOption(name, state.tokens.curr);
29444       }
29445     }
29447     try {
29448       applyOptions();
29450       // combine the passed globals after we've assumed all our options
29451       combine(predefined, g || {});
29453       //reset values
29454       parseComma.first = true;
29456       advance();
29457       switch (state.tokens.next.id) {
29458       case "{":
29459       case "[":
29460         destructuringAssignOrJsonValue();
29461         break;
29462       default:
29463         directives();
29465         if (state.directive["use strict"]) {
29466           if (!state.allowsGlobalUsd()) {
29467             warning("W097", state.tokens.prev);
29468           }
29469         }
29471         statements();
29472       }
29474       if (state.tokens.next.id !== "(end)") {
29475         quit("E041", state.tokens.curr);
29476       }
29478       state.funct["(scope)"].unstack();
29480     } catch (err) {
29481       if (err && err.name === "JSHintError") {
29482         var nt = state.tokens.next || {};
29483         JSHINT.errors.push({
29484           scope     : "(main)",
29485           raw       : err.raw,
29486           code      : err.code,
29487           reason    : err.reason,
29488           line      : err.line || nt.line,
29489           character : err.character || nt.from
29490         });
29491       } else {
29492         throw err;
29493       }
29494     }
29496     // Loop over the listed "internals", and check them as well.
29497     if (JSHINT.scope === "(main)") {
29498       lintEvalCode(JSHINT.internals, o || {}, g);
29499     }
29501     return JSHINT.errors.length === 0;
29502   };
29504   // Modules.
29505   itself.addModule = function(func) {
29506     extraModules.push(func);
29507   };
29509   itself.addModule(style.register);
29511   // Data summary.
29512   itself.data = function() {
29513     var data = {
29514       functions: [],
29515       options: state.option
29516     };
29518     var fu, f, i, n, globals;
29520     if (itself.errors.length) {
29521       data.errors = itself.errors;
29522     }
29524     if (state.jsonMode) {
29525       data.json = true;
29526     }
29528     var impliedGlobals = state.funct["(scope)"].getImpliedGlobals();
29529     if (impliedGlobals.length > 0) {
29530       data.implieds = impliedGlobals;
29531     }
29533     if (urls.length > 0) {
29534       data.urls = urls;
29535     }
29537     globals = state.funct["(scope)"].getUsedOrDefinedGlobals();
29538     if (globals.length > 0) {
29539       data.globals = globals;
29540     }
29542     for (i = 1; i < functions.length; i += 1) {
29543       f = functions[i];
29544       fu = {};
29546       fu.name = f["(name)"];
29547       fu.param = f["(params)"];
29548       fu.line = f["(line)"];
29549       fu.character = f["(character)"];
29550       fu.last = f["(last)"];
29551       fu.lastcharacter = f["(lastcharacter)"];
29553       fu.metrics = {
29554         complexity: f["(metrics)"].ComplexityCount,
29555         parameters: f["(metrics)"].arity,
29556         statements: f["(metrics)"].statementCount
29557       };
29559       data.functions.push(fu);
29560     }
29562     var unuseds = state.funct["(scope)"].getUnuseds();
29563     if (unuseds.length > 0) {
29564       data.unused = unuseds;
29565     }
29567     for (n in member) {
29568       if (typeof member[n] === "number") {
29569         data.member = member;
29570         break;
29571       }
29572     }
29574     return data;
29575   };
29577   itself.jshint = itself;
29579   return itself;
29580 }());
29582 // Make JSHINT a Node module, if possible.
29583 if (typeof exports === "object" && exports) {
29584   exports.JSHINT = JSHINT;
29587 },{"./lex.js":14,"./messages.js":15,"./options.js":17,"./reg.js":18,"./scope-manager.js":19,"./state.js":20,"./style.js":21,"./vars.js":22,"console-browserify":11,"events":6,"lodash":13}]},{},[]);
29589 JSHINT = require('jshint').JSHINT;
29590 if (typeof exports === 'object' && exports) exports.JSHINT = JSHINT;
29591 }());