{"version":3,"file":"vendor.cron-parser.131d0dd152670a16.js","mappings":";;;;;;;;;;;;;;;;;;;;AAAa;;AAEb,YAAY,mBAAO,CAAC,KAAO;;AAE3B;AACA,iCAAiC,UAAU;AAC3C;;AAEA;AACA,iCAAiC,WAAW;AAC5C;;AAEA;AACA,iCAAiC,SAAS;AAC1C;;AAEA;AACA;AACA,iCAAiC,UAAU;AAC3C;AACA,mCAAmC,UAAU;AAC7C;AACA;;AAEA;AACA;AACA,iCAAiC,YAAY;AAC7C;AACA,mCAAmC,UAAU;AAC7C;AACA;;AAEA;AACA;AACA,iCAAiC,YAAY;AAC7C;AACA,mCAAmC,UAAU;AAC7C;AACA;;AAEA;AACA,kCAAkC,UAAU;AAC5C;;AAEA;AACA;AACA,aAAa,WAAW;AACxB;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,UAAU;AACvB;AACA;AACA;AACA,oCAAoC,UAAU;AAC9C;AACA;;AAEA;AACA;AACA,kCAAkC,YAAY;AAC9C;AACA;AACA;AACA,oCAAoC,UAAU;AAC9C;AACA;;AAEA;AACA;AACA;AACA,aAAa,YAAY;AACzB;AACA;AACA,oCAAoC,UAAU;AAC9C;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gCAAgC,QAAQ;AACxC;;AAEA;AACA,gCAAgC,SAAS;AACzC;;AAEA;AACA,gCAAgC,YAAY;AAC5C;;AAEA;AACA,gCAAgC,cAAc;AAC9C;;AAEA;AACA,gCAAgC,SAAS;AACzC;;AAEA;AACA,gCAAgC,WAAW;AAC3C;;AAEA;AACA,gCAAgC,WAAW;AAC3C;;AAEA;AACA,gCAAgC,gBAAgB;AAChD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kCAAkC,SAAS;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,SAAS;AAC3C;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;AC3Pa;;AAEb;AACA,eAAe,mBAAO,CAAC,IAAQ;;AAE/B,qBAAqB,mBAAO,CAAC,KAAmB;;AAEhD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,IAAI,4BAA4B;AAChC,IAAI,4BAA4B;AAChC,IAAI,4BAA4B;AAChC,IAAI,+BAA+B;AACnC,IAAI,4BAA4B;AAChC,IAAI,8BAA8B;AAClC;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mCAAmC,EAAE;AACrC;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA,qCAAqC;AACrC,2CAA2C,OAAO;AAClD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,OAAO;;AAEf;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yCAAyC,gBAAgB;AACzD;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA,iDAAiD,OAAO;AACxD,uCAAuC;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,cAAc;AACd;AACA;AACA;AACA,yCAAyC,OAAO;AAChD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+CAA+C;AAC/C,gEAAgE;AAChE;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,KAAK;AACL;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,YAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA,+BAA+B,OAAO;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ,+BAA+B,OAAO;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,YAAY;AACZ;AACA;AACA;AACA,sEAAsE,OAAO;AAC7E;AACA;AACA;;AAEA;AACA,qBAAqB;AACrB,MAAM;AACN;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,mDAAmD,OAAO;AAC1D,yCAAyC;AACzC,2DAA2D;;AAE3D,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mDAAmD,OAAO;AAC1D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,OAAO;AAC9C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iDAAiD,OAAO;AACxD,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD;AACvD;;AAEA;;;;;;;;ACz+Ba;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ,qCAAqC;AAC7C;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;;;;;;;ACrEa;;AAEb,mBAAmB,mBAAO,CAAC,KAAmB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC,OAAO;AAC5C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB,qCAAqC;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;ACzDa;;AAEb,qBAAqB,mBAAO,CAAC,KAAc;;AAE3C;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA,qCAAqC,OAAO;AAC5C;AACA;AACA,8BAA8B;;AAE9B;AACA,+BAA+B;AAC/B;AACA,QAAQ,mDAAmD;AAC3D;AACA,QAAQ,OAAO;AACf;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB;AACA;AACA,EAAE,qCAAsB;AACxB;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;;AAEA","sources":["webpack://admin/./node_modules/cron-parser/lib/date.js","webpack://admin/./node_modules/cron-parser/lib/expression.js","webpack://admin/./node_modules/cron-parser/lib/field_compactor.js","webpack://admin/./node_modules/cron-parser/lib/field_stringify.js","webpack://admin/./node_modules/cron-parser/lib/parser.js"],"sourcesContent":["'use strict';\n\nvar luxon = require('luxon');\n\nCronDate.prototype.addYear = function() {\n this._date = this._date.plus({ years: 1 });\n};\n\nCronDate.prototype.addMonth = function() {\n this._date = this._date.plus({ months: 1 }).startOf('month');\n};\n\nCronDate.prototype.addDay = function() {\n this._date = this._date.plus({ days: 1 }).startOf('day');\n};\n\nCronDate.prototype.addHour = function() {\n var prev = this._date;\n this._date = this._date.plus({ hours: 1 }).startOf('hour');\n if (this._date <= prev) {\n this._date = this._date.plus({ hours: 1 });\n }\n};\n\nCronDate.prototype.addMinute = function() {\n var prev = this._date;\n this._date = this._date.plus({ minutes: 1 }).startOf('minute');\n if (this._date < prev) {\n this._date = this._date.plus({ hours: 1 });\n }\n};\n\nCronDate.prototype.addSecond = function() {\n var prev = this._date;\n this._date = this._date.plus({ seconds: 1 }).startOf('second');\n if (this._date < prev) {\n this._date = this._date.plus({ hours: 1 });\n }\n};\n\nCronDate.prototype.subtractYear = function() {\n this._date = this._date.minus({ years: 1 });\n};\n\nCronDate.prototype.subtractMonth = function() {\n this._date = this._date\n .minus({ months: 1 })\n .endOf('month')\n .startOf('second');\n};\n\nCronDate.prototype.subtractDay = function() {\n this._date = this._date\n .minus({ days: 1 })\n .endOf('day')\n .startOf('second');\n};\n\nCronDate.prototype.subtractHour = function() {\n var prev = this._date;\n this._date = this._date\n .minus({ hours: 1 })\n .endOf('hour')\n .startOf('second');\n if (this._date >= prev) {\n this._date = this._date.minus({ hours: 1 });\n }\n};\n\nCronDate.prototype.subtractMinute = function() {\n var prev = this._date;\n this._date = this._date.minus({ minutes: 1 })\n .endOf('minute')\n .startOf('second');\n if (this._date > prev) {\n this._date = this._date.minus({ hours: 1 });\n }\n};\n\nCronDate.prototype.subtractSecond = function() {\n var prev = this._date;\n this._date = this._date\n .minus({ seconds: 1 })\n .startOf('second');\n if (this._date > prev) {\n this._date = this._date.minus({ hours: 1 });\n }\n};\n\nCronDate.prototype.getDate = function() {\n return this._date.day;\n};\n\nCronDate.prototype.getFullYear = function() {\n return this._date.year;\n};\n\nCronDate.prototype.getDay = function() {\n var weekday = this._date.weekday;\n return weekday == 7 ? 0 : weekday;\n};\n\nCronDate.prototype.getMonth = function() {\n return this._date.month - 1;\n};\n\nCronDate.prototype.getHours = function() {\n return this._date.hour;\n};\n\nCronDate.prototype.getMinutes = function() {\n return this._date.minute;\n};\n\nCronDate.prototype.getSeconds = function() {\n return this._date.second;\n};\n\nCronDate.prototype.getMilliseconds = function() {\n return this._date.millisecond;\n};\n\nCronDate.prototype.getTime = function() {\n return this._date.valueOf();\n};\n\nCronDate.prototype.getUTCDate = function() {\n return this._getUTC().day;\n};\n\nCronDate.prototype.getUTCFullYear = function() {\n return this._getUTC().year;\n};\n\nCronDate.prototype.getUTCDay = function() {\n var weekday = this._getUTC().weekday;\n return weekday == 7 ? 0 : weekday;\n};\n\nCronDate.prototype.getUTCMonth = function() {\n return this._getUTC().month - 1;\n};\n\nCronDate.prototype.getUTCHours = function() {\n return this._getUTC().hour;\n};\n\nCronDate.prototype.getUTCMinutes = function() {\n return this._getUTC().minute;\n};\n\nCronDate.prototype.getUTCSeconds = function() {\n return this._getUTC().second;\n};\n\nCronDate.prototype.toISOString = function() {\n return this._date.toUTC().toISO();\n};\n\nCronDate.prototype.toJSON = function() {\n return this._date.toJSON();\n};\n\nCronDate.prototype.setDate = function(d) {\n this._date = this._date.set({ day: d });\n};\n\nCronDate.prototype.setFullYear = function(y) {\n this._date = this._date.set({ year: y });\n};\n\nCronDate.prototype.setDay = function(d) {\n this._date = this._date.set({ weekday: d });\n};\n\nCronDate.prototype.setMonth = function(m) {\n this._date = this._date.set({ month: m + 1 });\n};\n\nCronDate.prototype.setHours = function(h) {\n this._date = this._date.set({ hour: h });\n};\n\nCronDate.prototype.setMinutes = function(m) {\n this._date = this._date.set({ minute: m });\n};\n\nCronDate.prototype.setSeconds = function(s) {\n this._date = this._date.set({ second: s });\n};\n\nCronDate.prototype.setMilliseconds = function(s) {\n this._date = this._date.set({ millisecond: s });\n};\n\nCronDate.prototype._getUTC = function() {\n return this._date.toUTC();\n};\n\nCronDate.prototype.toString = function() {\n return this.toDate().toString();\n};\n\nCronDate.prototype.toDate = function() {\n return this._date.toJSDate();\n};\n\nCronDate.prototype.isLastDayOfMonth = function() {\n //next day\n var newDate = this._date.plus({ days: 1 }).startOf('day');\n return this._date.month !== newDate.month;\n};\n\n/**\n * Returns true when the current weekday is the last occurrence of this weekday\n * for the present month.\n */\nCronDate.prototype.isLastWeekdayOfMonth = function() {\n // Check this by adding 7 days to the current date and seeing if it's\n // a different month\n var newDate = this._date.plus({ days: 7 }).startOf('day');\n return this._date.month !== newDate.month;\n};\n\nfunction CronDate (timestamp, tz) {\n var dateOpts = { zone: tz };\n if (!timestamp) {\n this._date = luxon.DateTime.local();\n } else if (timestamp instanceof CronDate) {\n this._date = timestamp._date;\n } else if (timestamp instanceof Date) {\n this._date = luxon.DateTime.fromJSDate(timestamp, dateOpts);\n } else if (typeof timestamp === 'number') {\n this._date = luxon.DateTime.fromMillis(timestamp, dateOpts);\n } else if (typeof timestamp === 'string') {\n this._date = luxon.DateTime.fromISO(timestamp, dateOpts);\n this._date.isValid || (this._date = luxon.DateTime.fromRFC2822(timestamp, dateOpts));\n this._date.isValid || (this._date = luxon.DateTime.fromSQL(timestamp, dateOpts));\n // RFC2822-like format without the required timezone offset (used in tests)\n this._date.isValid || (this._date = luxon.DateTime.fromFormat(timestamp, 'EEE, d MMM yyyy HH:mm:ss', dateOpts));\n }\n\n if (!this._date || !this._date.isValid) {\n throw new Error('CronDate: unhandled timestamp: ' + JSON.stringify(timestamp));\n }\n \n if (tz && tz !== this._date.zoneName) {\n this._date = this._date.setZone(tz);\n }\n}\n\nmodule.exports = CronDate;\n","'use strict';\n\n// Load Date class extensions\nvar CronDate = require('./date');\n\nvar stringifyField = require('./field_stringify');\n\n/**\n * Cron iteration loop safety limit\n */\nvar LOOP_LIMIT = 10000;\n\n/**\n * Construct a new expression parser\n *\n * Options:\n * currentDate: iterator start date\n * endDate: iterator end date\n *\n * @constructor\n * @private\n * @param {Object} fields Expression fields parsed values\n * @param {Object} options Parser options\n */\nfunction CronExpression (fields, options) {\n this._options = options;\n this._utc = options.utc || false;\n this._tz = this._utc ? 'UTC' : options.tz;\n this._currentDate = new CronDate(options.currentDate, this._tz);\n this._startDate = options.startDate ? new CronDate(options.startDate, this._tz) : null;\n this._endDate = options.endDate ? new CronDate(options.endDate, this._tz) : null;\n this._isIterator = options.iterator || false;\n this._hasIterated = false;\n this._nthDayOfWeek = options.nthDayOfWeek || 0;\n this.fields = CronExpression._freezeFields(fields);\n}\n\n/**\n * Field mappings\n * @type {Array}\n */\nCronExpression.map = [ 'second', 'minute', 'hour', 'dayOfMonth', 'month', 'dayOfWeek' ];\n\n/**\n * Prefined intervals\n * @type {Object}\n */\nCronExpression.predefined = {\n '@yearly': '0 0 1 1 *',\n '@monthly': '0 0 1 * *',\n '@weekly': '0 0 * * 0',\n '@daily': '0 0 * * *',\n '@hourly': '0 * * * *'\n};\n\n/**\n * Fields constraints\n * @type {Array}\n */\nCronExpression.constraints = [\n { min: 0, max: 59, chars: [] }, // Second\n { min: 0, max: 59, chars: [] }, // Minute\n { min: 0, max: 23, chars: [] }, // Hour\n { min: 1, max: 31, chars: ['L'] }, // Day of month\n { min: 1, max: 12, chars: [] }, // Month\n { min: 0, max: 7, chars: ['L'] }, // Day of week\n];\n\n/**\n * Days in month\n * @type {number[]}\n */\nCronExpression.daysInMonth = [\n 31,\n 29,\n 31,\n 30,\n 31,\n 30,\n 31,\n 31,\n 30,\n 31,\n 30,\n 31\n];\n\n/**\n * Field aliases\n * @type {Object}\n */\nCronExpression.aliases = {\n month: {\n jan: 1,\n feb: 2,\n mar: 3,\n apr: 4,\n may: 5,\n jun: 6,\n jul: 7,\n aug: 8,\n sep: 9,\n oct: 10,\n nov: 11,\n dec: 12\n },\n\n dayOfWeek: {\n sun: 0,\n mon: 1,\n tue: 2,\n wed: 3,\n thu: 4,\n fri: 5,\n sat: 6\n }\n};\n\n/**\n * Field defaults\n * @type {Array}\n */\nCronExpression.parseDefaults = [ '0', '*', '*', '*', '*', '*' ];\n\nCronExpression.standardValidCharacters = /^[,*\\d/-]+$/;\nCronExpression.dayOfWeekValidCharacters = /^[?,*\\dL#/-]+$/;\nCronExpression.dayOfMonthValidCharacters = /^[?,*\\dL/-]+$/;\nCronExpression.validCharacters = {\n second: CronExpression.standardValidCharacters,\n minute: CronExpression.standardValidCharacters,\n hour: CronExpression.standardValidCharacters,\n dayOfMonth: CronExpression.dayOfMonthValidCharacters,\n month: CronExpression.standardValidCharacters,\n dayOfWeek: CronExpression.dayOfWeekValidCharacters,\n};\n\nCronExpression._isValidConstraintChar = function _isValidConstraintChar(constraints, value) {\n if (typeof value !== 'string') {\n return false;\n }\n\n return constraints.chars.some(function(char) {\n return value.indexOf(char) > -1;\n });\n};\n\n/**\n * Parse input interval\n *\n * @param {String} field Field symbolic name\n * @param {String} value Field value\n * @param {Array} constraints Range upper and lower constraints\n * @return {Array} Sequence of sorted values\n * @private\n */\nCronExpression._parseField = function _parseField (field, value, constraints) {\n // Replace aliases\n switch (field) {\n case 'month':\n case 'dayOfWeek':\n var aliases = CronExpression.aliases[field];\n\n value = value.replace(/[a-z]{3}/gi, function(match) {\n match = match.toLowerCase();\n\n if (typeof aliases[match] !== 'undefined') {\n return aliases[match];\n } else {\n throw new Error('Validation error, cannot resolve alias \"' + match + '\"');\n }\n });\n break;\n }\n\n // Check for valid characters.\n if (!(CronExpression.validCharacters[field].test(value))) {\n throw new Error('Invalid characters, got value: ' + value);\n }\n\n // Replace '*' and '?'\n if (value.indexOf('*') !== -1) {\n value = value.replace(/\\*/g, constraints.min + '-' + constraints.max);\n } else if (value.indexOf('?') !== -1) {\n value = value.replace(/\\?/g, constraints.min + '-' + constraints.max);\n }\n\n //\n // Inline parsing functions\n //\n // Parser path:\n // - parseSequence\n // - parseRepeat\n // - parseRange\n\n /**\n * Parse sequence\n *\n * @param {String} val\n * @return {Array}\n * @private\n */\n function parseSequence (val) {\n var stack = [];\n\n function handleResult (result) {\n if (result instanceof Array) { // Make sequence linear\n for (var i = 0, c = result.length; i < c; i++) {\n var value = result[i];\n\n if (CronExpression._isValidConstraintChar(constraints, value)) {\n stack.push(value);\n continue;\n }\n // Check constraints\n if (typeof value !== 'number' || Number.isNaN(value) || value < constraints.min || value > constraints.max) {\n throw new Error(\n 'Constraint error, got value ' + value + ' expected range ' +\n constraints.min + '-' + constraints.max\n );\n }\n\n stack.push(value);\n }\n } else { // Scalar value\n\n if (CronExpression._isValidConstraintChar(constraints, result)) {\n stack.push(result);\n return;\n }\n\n var numResult = +result;\n\n // Check constraints\n if (Number.isNaN(numResult) || numResult < constraints.min || numResult > constraints.max) {\n throw new Error(\n 'Constraint error, got value ' + result + ' expected range ' +\n constraints.min + '-' + constraints.max\n );\n }\n\n if (field === 'dayOfWeek') {\n numResult = numResult % 7;\n }\n\n stack.push(numResult);\n }\n }\n\n var atoms = val.split(',');\n if (!atoms.every(function (atom) {\n return atom.length > 0;\n })) {\n throw new Error('Invalid list value format');\n }\n\n if (atoms.length > 1) {\n for (var i = 0, c = atoms.length; i < c; i++) {\n handleResult(parseRepeat(atoms[i]));\n }\n } else {\n handleResult(parseRepeat(val));\n }\n\n stack.sort(CronExpression._sortCompareFn);\n\n return stack;\n }\n\n /**\n * Parse repetition interval\n *\n * @param {String} val\n * @return {Array}\n */\n function parseRepeat (val) {\n var repeatInterval = 1;\n var atoms = val.split('/');\n\n if (atoms.length > 2) {\n throw new Error('Invalid repeat: ' + val);\n }\n\n if (atoms.length > 1) {\n if (atoms[0] == +atoms[0]) {\n atoms = [atoms[0] + '-' + constraints.max, atoms[1]];\n }\n return parseRange(atoms[0], atoms[atoms.length - 1]);\n }\n\n return parseRange(val, repeatInterval);\n }\n\n /**\n * Parse range\n *\n * @param {String} val\n * @param {Number} repeatInterval Repetition interval\n * @return {Array}\n * @private\n */\n function parseRange (val, repeatInterval) {\n var stack = [];\n var atoms = val.split('-');\n\n if (atoms.length > 1 ) {\n // Invalid range, return value\n if (atoms.length < 2) {\n return +val;\n }\n\n if (!atoms[0].length) {\n if (!atoms[1].length) {\n throw new Error('Invalid range: ' + val);\n }\n\n return +val;\n }\n\n // Validate range\n var min = +atoms[0];\n var max = +atoms[1];\n\n if (Number.isNaN(min) || Number.isNaN(max) ||\n min < constraints.min || max > constraints.max) {\n throw new Error(\n 'Constraint error, got range ' +\n min + '-' + max +\n ' expected range ' +\n constraints.min + '-' + constraints.max\n );\n } else if (min > max) {\n throw new Error('Invalid range: ' + val);\n }\n\n // Create range\n var repeatIndex = +repeatInterval;\n\n if (Number.isNaN(repeatIndex) || repeatIndex <= 0) {\n throw new Error('Constraint error, cannot repeat at every ' + repeatIndex + ' time.');\n }\n\n // JS DOW is in range of 0-6 (SUN-SAT) but we also support 7 in the expression\n // Handle case when range contains 7 instead of 0 and translate this value to 0\n if (field === 'dayOfWeek' && max % 7 === 0) {\n stack.push(0);\n }\n\n for (var index = min, count = max; index <= count; index++) {\n var exists = stack.indexOf(index) !== -1;\n if (!exists && repeatIndex > 0 && (repeatIndex % repeatInterval) === 0) {\n repeatIndex = 1;\n stack.push(index);\n } else {\n repeatIndex++;\n }\n }\n return stack;\n }\n\n return Number.isNaN(+val) ? val : +val;\n }\n\n return parseSequence(value);\n};\n\nCronExpression._sortCompareFn = function(a, b) {\n var aIsNumber = typeof a === 'number';\n var bIsNumber = typeof b === 'number';\n\n if (aIsNumber && bIsNumber) {\n return a - b;\n }\n\n if (!aIsNumber && bIsNumber) {\n return 1;\n }\n\n if (aIsNumber && !bIsNumber) {\n return -1;\n }\n\n return a.localeCompare(b);\n};\n\nCronExpression._handleMaxDaysInMonth = function(mappedFields) {\n // Filter out any day of month value that is larger than given month expects\n if (mappedFields.month.length === 1) {\n var daysInMonth = CronExpression.daysInMonth[mappedFields.month[0] - 1];\n\n if (mappedFields.dayOfMonth[0] > daysInMonth) {\n throw new Error('Invalid explicit day of month definition');\n }\n\n return mappedFields.dayOfMonth\n .filter(function(dayOfMonth) {\n return dayOfMonth === 'L' ? true : dayOfMonth <= daysInMonth;\n })\n .sort(CronExpression._sortCompareFn);\n }\n};\n\nCronExpression._freezeFields = function(fields) {\n for (var i = 0, c = CronExpression.map.length; i < c; ++i) {\n var field = CronExpression.map[i]; // Field name\n var value = fields[field];\n fields[field] = Object.freeze(value);\n }\n return Object.freeze(fields);\n};\n\nCronExpression.prototype._applyTimezoneShift = function(currentDate, dateMathVerb, method) {\n if ((method === 'Month') || (method === 'Day')) {\n var prevTime = currentDate.getTime();\n currentDate[dateMathVerb + method]();\n var currTime = currentDate.getTime();\n if (prevTime === currTime) {\n // Jumped into a not existent date due to a DST transition\n if ((currentDate.getMinutes() === 0) &&\n (currentDate.getSeconds() === 0)) {\n currentDate.addHour();\n } else if ((currentDate.getMinutes() === 59) &&\n (currentDate.getSeconds() === 59)) {\n currentDate.subtractHour();\n }\n }\n } else {\n var previousHour = currentDate.getHours();\n currentDate[dateMathVerb + method]();\n var currentHour = currentDate.getHours();\n var diff = currentHour - previousHour;\n if (diff === 2) {\n // Starting DST\n if (this.fields.hour.length !== 24) {\n // Hour is specified\n this._dstStart = currentHour;\n }\n } else if ((diff === 0) &&\n (currentDate.getMinutes() === 0) &&\n (currentDate.getSeconds() === 0)) {\n // Ending DST\n if (this.fields.hour.length !== 24) {\n // Hour is specified\n this._dstEnd = currentHour;\n }\n }\n }\n};\n\n\n/**\n * Find next or previous matching schedule date\n *\n * @return {CronDate}\n * @private\n */\nCronExpression.prototype._findSchedule = function _findSchedule (reverse) {\n\n /**\n * Match field value\n *\n * @param {String} value\n * @param {Array} sequence\n * @return {Boolean}\n * @private\n */\n function matchSchedule (value, sequence) {\n for (var i = 0, c = sequence.length; i < c; i++) {\n if (sequence[i] >= value) {\n return sequence[i] === value;\n }\n }\n\n return sequence[0] === value;\n }\n\n /**\n * Helps determine if the provided date is the correct nth occurence of the\n * desired day of week.\n *\n * @param {CronDate} date\n * @param {Number} nthDayOfWeek\n * @return {Boolean}\n * @private\n */\n function isNthDayMatch(date, nthDayOfWeek) {\n if (nthDayOfWeek < 6) {\n if (\n date.getDate() < 8 &&\n nthDayOfWeek === 1 // First occurence has to happen in first 7 days of the month\n ) {\n return true;\n }\n\n var offset = date.getDate() % 7 ? 1 : 0; // Math is off by 1 when dayOfWeek isn't divisible by 7\n var adjustedDate = date.getDate() - (date.getDate() % 7); // find the first occurance\n var occurrence = Math.floor(adjustedDate / 7) + offset;\n\n return occurrence === nthDayOfWeek;\n }\n\n return false;\n }\n\n /**\n * Helper function that checks if 'L' is in the array\n *\n * @param {Array} expressions\n */\n function isLInExpressions(expressions) {\n return expressions.length > 0 && expressions.some(function(expression) {\n return typeof expression === 'string' && expression.indexOf('L') >= 0;\n });\n }\n\n\n // Whether to use backwards directionality when searching\n reverse = reverse || false;\n var dateMathVerb = reverse ? 'subtract' : 'add';\n\n var currentDate = new CronDate(this._currentDate, this._tz);\n var startDate = this._startDate;\n var endDate = this._endDate;\n\n // Find matching schedule\n var startTimestamp = currentDate.getTime();\n var stepCount = 0;\n\n function isLastWeekdayOfMonthMatch(expressions) {\n return expressions.some(function(expression) {\n // There might be multiple expressions and not all of them will contain\n // the \"L\".\n if (!isLInExpressions([expression])) {\n return false;\n }\n\n // The first character represents the weekday\n var weekday = Number.parseInt(expression[0]) % 7;\n\n if (Number.isNaN(weekday)) {\n throw new Error('Invalid last weekday of the month expression: ' + expression);\n }\n\n return currentDate.getDay() === weekday && currentDate.isLastWeekdayOfMonth();\n });\n }\n\n while (stepCount < LOOP_LIMIT) {\n stepCount++;\n\n // Validate timespan\n if (reverse) {\n if (startDate && (currentDate.getTime() - startDate.getTime() < 0)) {\n throw new Error('Out of the timespan range');\n }\n } else {\n if (endDate && (endDate.getTime() - currentDate.getTime()) < 0) {\n throw new Error('Out of the timespan range');\n }\n }\n\n // Day of month and week matching:\n //\n // \"The day of a command's execution can be specified by two fields --\n // day of month, and day of week. If both\t fields\t are restricted (ie,\n // aren't *), the command will be run when either field matches the cur-\n // rent time. For example, \"30 4 1,15 * 5\" would cause a command to be\n // run at 4:30 am on the 1st and 15th of each month, plus every Friday.\"\n //\n // http://unixhelp.ed.ac.uk/CGI/man-cgi?crontab+5\n //\n\n var dayOfMonthMatch = matchSchedule(currentDate.getDate(), this.fields.dayOfMonth);\n if (isLInExpressions(this.fields.dayOfMonth)) {\n dayOfMonthMatch = dayOfMonthMatch || currentDate.isLastDayOfMonth();\n }\n var dayOfWeekMatch = matchSchedule(currentDate.getDay(), this.fields.dayOfWeek);\n if (isLInExpressions(this.fields.dayOfWeek)) {\n dayOfWeekMatch = dayOfWeekMatch || isLastWeekdayOfMonthMatch(this.fields.dayOfWeek);\n }\n var isDayOfMonthWildcardMatch = this.fields.dayOfMonth.length >= CronExpression.daysInMonth[currentDate.getMonth()];\n var isDayOfWeekWildcardMatch = this.fields.dayOfWeek.length === CronExpression.constraints[5].max - CronExpression.constraints[5].min + 1;\n var currentHour = currentDate.getHours();\n\n // Add or subtract day if select day not match with month (according to calendar)\n if (!dayOfMonthMatch && (!dayOfWeekMatch || isDayOfWeekWildcardMatch)) {\n this._applyTimezoneShift(currentDate, dateMathVerb, 'Day');\n continue;\n }\n\n // Add or subtract day if not day of month is set (and no match) and day of week is wildcard\n if (!isDayOfMonthWildcardMatch && isDayOfWeekWildcardMatch && !dayOfMonthMatch) {\n this._applyTimezoneShift(currentDate, dateMathVerb, 'Day');\n continue;\n }\n\n // Add or subtract day if not day of week is set (and no match) and day of month is wildcard\n if (isDayOfMonthWildcardMatch && !isDayOfWeekWildcardMatch && !dayOfWeekMatch) {\n this._applyTimezoneShift(currentDate, dateMathVerb, 'Day');\n continue;\n }\n\n // Add or subtract day if day of week & nthDayOfWeek are set (and no match)\n if (\n this._nthDayOfWeek > 0 &&\n !isNthDayMatch(currentDate, this._nthDayOfWeek)\n ) {\n this._applyTimezoneShift(currentDate, dateMathVerb, 'Day');\n continue;\n }\n\n // Match month\n if (!matchSchedule(currentDate.getMonth() + 1, this.fields.month)) {\n this._applyTimezoneShift(currentDate, dateMathVerb, 'Month');\n continue;\n }\n\n // Match hour\n if (!matchSchedule(currentHour, this.fields.hour)) {\n if (this._dstStart !== currentHour) {\n this._dstStart = null;\n this._applyTimezoneShift(currentDate, dateMathVerb, 'Hour');\n continue;\n } else if (!matchSchedule(currentHour - 1, this.fields.hour)) {\n currentDate[dateMathVerb + 'Hour']();\n continue;\n }\n } else if (this._dstEnd === currentHour) {\n if (!reverse) {\n this._dstEnd = null;\n this._applyTimezoneShift(currentDate, 'add', 'Hour');\n continue;\n }\n }\n\n // Match minute\n if (!matchSchedule(currentDate.getMinutes(), this.fields.minute)) {\n this._applyTimezoneShift(currentDate, dateMathVerb, 'Minute');\n continue;\n }\n\n // Match second\n if (!matchSchedule(currentDate.getSeconds(), this.fields.second)) {\n this._applyTimezoneShift(currentDate, dateMathVerb, 'Second');\n continue;\n }\n\n // Increase a second in case in the first iteration the currentDate was not\n // modified\n if (startTimestamp === currentDate.getTime()) {\n if ((dateMathVerb === 'add') || (currentDate.getMilliseconds() === 0)) {\n this._applyTimezoneShift(currentDate, dateMathVerb, 'Second');\n } else {\n currentDate.setMilliseconds(0);\n }\n\n continue;\n }\n\n break;\n }\n\n if (stepCount >= LOOP_LIMIT) {\n throw new Error('Invalid expression, loop limit exceeded');\n }\n\n this._currentDate = new CronDate(currentDate, this._tz);\n this._hasIterated = true;\n\n return currentDate;\n};\n\n/**\n * Find next suitable date\n *\n * @public\n * @return {CronDate|Object}\n */\nCronExpression.prototype.next = function next () {\n var schedule = this._findSchedule();\n\n // Try to return ES6 compatible iterator\n if (this._isIterator) {\n return {\n value: schedule,\n done: !this.hasNext()\n };\n }\n\n return schedule;\n};\n\n/**\n * Find previous suitable date\n *\n * @public\n * @return {CronDate|Object}\n */\nCronExpression.prototype.prev = function prev () {\n var schedule = this._findSchedule(true);\n\n // Try to return ES6 compatible iterator\n if (this._isIterator) {\n return {\n value: schedule,\n done: !this.hasPrev()\n };\n }\n\n return schedule;\n};\n\n/**\n * Check if next suitable date exists\n *\n * @public\n * @return {Boolean}\n */\nCronExpression.prototype.hasNext = function() {\n var current = this._currentDate;\n var hasIterated = this._hasIterated;\n\n try {\n this._findSchedule();\n return true;\n } catch (err) {\n return false;\n } finally {\n this._currentDate = current;\n this._hasIterated = hasIterated;\n }\n};\n\n/**\n * Check if previous suitable date exists\n *\n * @public\n * @return {Boolean}\n */\nCronExpression.prototype.hasPrev = function() {\n var current = this._currentDate;\n var hasIterated = this._hasIterated;\n\n try {\n this._findSchedule(true);\n return true;\n } catch (err) {\n return false;\n } finally {\n this._currentDate = current;\n this._hasIterated = hasIterated;\n }\n};\n\n/**\n * Iterate over expression iterator\n *\n * @public\n * @param {Number} steps Numbers of steps to iterate\n * @param {Function} callback Optional callback\n * @return {Array} Array of the iterated results\n */\nCronExpression.prototype.iterate = function iterate (steps, callback) {\n var dates = [];\n\n if (steps >= 0) {\n for (var i = 0, c = steps; i < c; i++) {\n try {\n var item = this.next();\n dates.push(item);\n\n // Fire the callback\n if (callback) {\n callback(item, i);\n }\n } catch (err) {\n break;\n }\n }\n } else {\n for (var i = 0, c = steps; i > c; i--) {\n try {\n var item = this.prev();\n dates.push(item);\n\n // Fire the callback\n if (callback) {\n callback(item, i);\n }\n } catch (err) {\n break;\n }\n }\n }\n\n return dates;\n};\n\n/**\n * Reset expression iterator state\n *\n * @public\n */\nCronExpression.prototype.reset = function reset (newDate) {\n this._currentDate = new CronDate(newDate || this._options.currentDate);\n};\n\n/**\n * Stringify the expression\n *\n * @public\n * @param {Boolean} [includeSeconds] Should stringify seconds\n * @return {String}\n */\nCronExpression.prototype.stringify = function stringify(includeSeconds) {\n var resultArr = [];\n for (var i = includeSeconds ? 0 : 1, c = CronExpression.map.length; i < c; ++i) {\n var field = CronExpression.map[i];\n var value = this.fields[field];\n var constraint = CronExpression.constraints[i];\n\n if (field === 'dayOfMonth' && this.fields.month.length === 1) {\n constraint = { min: 1, max: CronExpression.daysInMonth[this.fields.month[0] - 1] };\n } else if (field === 'dayOfWeek') {\n // Prefer 0-6 range when serializing day of week field\n constraint = { min: 0, max: 6 };\n value = value[value.length - 1] === 7 ? value.slice(0, -1) : value;\n }\n\n resultArr.push(stringifyField(value, constraint.min, constraint.max));\n }\n return resultArr.join(' ');\n};\n\n/**\n * Parse input expression (async)\n *\n * @public\n * @param {String} expression Input expression\n * @param {Object} [options] Parsing options\n */\nCronExpression.parse = function parse(expression, options) {\n var self = this;\n if (typeof options === 'function') {\n options = {};\n }\n\n function parse (expression, options) {\n if (!options) {\n options = {};\n }\n\n if (typeof options.currentDate === 'undefined') {\n options.currentDate = new CronDate(undefined, self._tz);\n }\n\n // Is input expression predefined?\n if (CronExpression.predefined[expression]) {\n expression = CronExpression.predefined[expression];\n }\n\n // Split fields\n var fields = [];\n var atoms = (expression + '').trim().split(/\\s+/);\n\n if (atoms.length > 6) {\n throw new Error('Invalid cron expression');\n }\n\n // Resolve fields\n var start = (CronExpression.map.length - atoms.length);\n for (var i = 0, c = CronExpression.map.length; i < c; ++i) {\n var field = CronExpression.map[i]; // Field name\n var value = atoms[atoms.length > c ? i : i - start]; // Field value\n\n if (i < start || !value) { // Use default value\n fields.push(CronExpression._parseField(\n field,\n CronExpression.parseDefaults[i],\n CronExpression.constraints[i]\n )\n );\n } else {\n var val = field === 'dayOfWeek' ? parseNthDay(value) : value;\n\n fields.push(CronExpression._parseField(\n field,\n val,\n CronExpression.constraints[i]\n )\n );\n }\n }\n\n var mappedFields = {};\n for (var i = 0, c = CronExpression.map.length; i < c; i++) {\n var key = CronExpression.map[i];\n mappedFields[key] = fields[i];\n }\n\n var dayOfMonth = CronExpression._handleMaxDaysInMonth(mappedFields);\n mappedFields.dayOfMonth = dayOfMonth || mappedFields.dayOfMonth;\n return new CronExpression(mappedFields, options);\n\n /**\n * Parses out the # special character for the dayOfWeek field & adds it to options.\n *\n * @param {String} val\n * @return {String}\n * @private\n */\n function parseNthDay(val) {\n var atoms = val.split('#');\n if (atoms.length > 1) {\n var nthValue = +atoms[atoms.length - 1];\n if(/,/.test(val)) {\n throw new Error('Constraint error, invalid dayOfWeek `#` and `,` '\n + 'special characters are incompatible');\n }\n if(/\\//.test(val)) {\n throw new Error('Constraint error, invalid dayOfWeek `#` and `/` '\n + 'special characters are incompatible');\n }\n if(/-/.test(val)) {\n throw new Error('Constraint error, invalid dayOfWeek `#` and `-` '\n + 'special characters are incompatible');\n }\n if (atoms.length > 2 || Number.isNaN(nthValue) || (nthValue < 1 || nthValue > 5)) {\n throw new Error('Constraint error, invalid dayOfWeek occurrence number (#)');\n }\n\n options.nthDayOfWeek = nthValue;\n return atoms[0];\n }\n return val;\n }\n }\n\n return parse(expression, options);\n};\n\n/**\n * Convert cron fields back to Cron Expression\n *\n * @public\n * @param {Object} fields Input fields\n * @param {Object} [options] Parsing options\n * @return {Object}\n */\nCronExpression.fieldsToExpression = function fieldsToExpression(fields, options) {\n function validateConstraints (field, values, constraints) {\n if (!values) {\n throw new Error('Validation error, Field ' + field + ' is missing');\n }\n if (values.length === 0) {\n throw new Error('Validation error, Field ' + field + ' contains no values');\n }\n for (var i = 0, c = values.length; i < c; i++) {\n var value = values[i];\n\n if (CronExpression._isValidConstraintChar(constraints, value)) {\n continue;\n }\n\n // Check constraints\n if (typeof value !== 'number' || Number.isNaN(value) || value < constraints.min || value > constraints.max) {\n throw new Error(\n 'Constraint error, got value ' + value + ' expected range ' +\n constraints.min + '-' + constraints.max\n );\n }\n }\n }\n\n var mappedFields = {};\n for (var i = 0, c = CronExpression.map.length; i < c; ++i) {\n var field = CronExpression.map[i]; // Field name\n var values = fields[field];\n validateConstraints(\n field,\n values,\n CronExpression.constraints[i]\n );\n var copy = [];\n var j = -1;\n while (++j < values.length) {\n copy[j] = values[j];\n }\n values = copy.sort(CronExpression._sortCompareFn)\n .filter(function(item, pos, ary) {\n return !pos || item !== ary[pos - 1];\n });\n if (values.length !== copy.length) {\n throw new Error('Validation error, Field ' + field + ' contains duplicate values');\n }\n mappedFields[field] = values;\n }\n var dayOfMonth = CronExpression._handleMaxDaysInMonth(mappedFields);\n mappedFields.dayOfMonth = dayOfMonth || mappedFields.dayOfMonth;\n return new CronExpression(mappedFields, options || {});\n};\n\nmodule.exports = CronExpression;\n","'use strict';\n\nfunction buildRange(item) {\n return {\n start: item,\n count: 1\n };\n}\n\nfunction completeRangeWithItem(range, item) {\n range.end = item;\n range.step = item - range.start;\n range.count = 2;\n}\n\nfunction finalizeCurrentRange(results, currentRange, currentItemRange) {\n if (currentRange) {\n // Two elements do not form a range so split them into 2 single elements\n if (currentRange.count === 2) {\n results.push(buildRange(currentRange.start));\n results.push(buildRange(currentRange.end));\n } else {\n results.push(currentRange);\n }\n }\n if (currentItemRange) {\n results.push(currentItemRange);\n }\n}\n\nfunction compactField(arr) {\n var results = [];\n var currentRange = undefined;\n\n for (var i = 0; i < arr.length; i++) {\n var currentItem = arr[i];\n if (typeof currentItem !== 'number') {\n // String elements can't form a range\n finalizeCurrentRange(results, currentRange, buildRange(currentItem));\n currentRange = undefined;\n } else if (!currentRange) {\n // Start a new range\n currentRange = buildRange(currentItem);\n } else if (currentRange.count === 1) {\n // Guess that the current item starts a range\n completeRangeWithItem(currentRange, currentItem);\n } else {\n if (currentRange.step === currentItem - currentRange.end) {\n // We found another item that matches the current range\n currentRange.count++;\n currentRange.end = currentItem;\n } else if (currentRange.count === 2) { // The current range can't be continued\n // Break the first item of the current range into a single element, and try to start a new range with the second item\n results.push(buildRange(currentRange.start));\n currentRange = buildRange(currentRange.end);\n completeRangeWithItem(currentRange, currentItem);\n } else {\n // Persist the current range and start a new one with current item\n finalizeCurrentRange(results, currentRange);\n currentRange = buildRange(currentItem);\n }\n }\n }\n\n finalizeCurrentRange(results, currentRange);\n\n return results;\n}\n\nmodule.exports = compactField;\n","'use strict';\n\nvar compactField = require('./field_compactor');\n\nfunction stringifyField(arr, min, max) {\n var ranges = compactField(arr);\n if (ranges.length === 1) {\n var singleRange = ranges[0];\n var step = singleRange.step;\n if (step === 1 && singleRange.start === min && singleRange.end === max) {\n return '*';\n }\n if (step !== 1 && singleRange.start === min && singleRange.end === max - step + 1) {\n return '*/' + step;\n }\n }\n\n var result = [];\n for (var i = 0, l = ranges.length; i < l; ++i) {\n var range = ranges[i];\n if (range.count === 1) {\n result.push(range.start);\n continue;\n }\n\n var step = range.step;\n if (range.step === 1) {\n result.push(range.start + '-' + range.end);\n continue;\n }\n\n var multiplier = range.start == 0 ? range.count - 1 : range.count;\n if (range.step * multiplier > range.end) {\n result = result.concat(\n Array\n .from({ length: range.end - range.start + 1 })\n .map(function (_, index) {\n var value = range.start + index;\n if ((value - range.start) % range.step === 0) {\n return value;\n }\n return null;\n })\n .filter(function (value) {\n return value != null;\n })\n );\n } else if (range.end === max - range.step + 1) {\n result.push(range.start + '/' + range.step);\n } else {\n result.push(range.start + '-' + range.end + '/' + range.step);\n }\n }\n\n return result.join(',');\n}\n\nmodule.exports = stringifyField;\n","'use strict';\n\nvar CronExpression = require('./expression');\n\nfunction CronParser() {}\n\n/**\n * Parse crontab entry\n *\n * @private\n * @param {String} entry Crontab file entry/line\n */\nCronParser._parseEntry = function _parseEntry (entry) {\n var atoms = entry.split(' ');\n\n if (atoms.length === 6) {\n return {\n interval: CronExpression.parse(entry)\n };\n } else if (atoms.length > 6) {\n return {\n interval: CronExpression.parse(\n atoms.slice(0, 6).join(' ')\n ),\n command: atoms.slice(6, atoms.length)\n };\n } else {\n throw new Error('Invalid entry: ' + entry);\n }\n};\n\n/**\n * Wrapper for CronExpression.parser method\n *\n * @public\n * @param {String} expression Input expression\n * @param {Object} [options] Parsing options\n * @return {Object}\n */\nCronParser.parseExpression = function parseExpression (expression, options) {\n return CronExpression.parse(expression, options);\n};\n\n/**\n * Wrapper for CronExpression.fieldsToExpression method\n *\n * @public\n * @param {Object} fields Input fields\n * @param {Object} [options] Parsing options\n * @return {Object}\n */\nCronParser.fieldsToExpression = function fieldsToExpression (fields, options) {\n return CronExpression.fieldsToExpression(fields, options);\n};\n\n/**\n * Parse content string\n *\n * @public\n * @param {String} data Crontab content\n * @return {Object}\n */\nCronParser.parseString = function parseString (data) {\n var blocks = data.split('\\n');\n\n var response = {\n variables: {},\n expressions: [],\n errors: {}\n };\n\n for (var i = 0, c = blocks.length; i < c; i++) {\n var block = blocks[i];\n var matches = null;\n var entry = block.trim(); // Remove surrounding spaces\n\n if (entry.length > 0) {\n if (entry.match(/^#/)) { // Comment\n continue;\n } else if ((matches = entry.match(/^(.*)=(.*)$/))) { // Variable\n response.variables[matches[1]] = matches[2];\n } else { // Expression?\n var result = null;\n\n try {\n result = CronParser._parseEntry('0 ' + entry);\n response.expressions.push(result.interval);\n } catch (err) {\n response.errors[entry] = err;\n }\n }\n }\n }\n\n return response;\n};\n\n/**\n * Parse crontab file\n *\n * @public\n * @param {String} filePath Path to file\n * @param {Function} callback\n */\nCronParser.parseFile = function parseFile (filePath, callback) {\n require('fs').readFile(filePath, function(err, data) {\n if (err) {\n callback(err);\n return;\n }\n\n return callback(null, CronParser.parseString(data.toString()));\n });\n};\n\nmodule.exports = CronParser;\n"],"names":[],"sourceRoot":""}