monkey-front-core 0.0.515 → 0.0.517

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -155,8 +155,152 @@ export class MonkeyEcxUtils {
155
155
  return dvCalc === dgv;
156
156
  }
157
157
  static isValidRFC(document) {
158
- const regex = /^[A-Z]{3,4}[0-9]{6}[A-Z0-9]{3}$/;
159
- return regex.test(document);
158
+ const RFC_REGEXP = /^([A-ZÑ\x26]{3,4})([0-9]{6})([A-Z0-9]{3})$/;
159
+ const SPECIAL_CASES = {
160
+ 'XEXX010101000': 'foreign',
161
+ 'XAXX010101000': 'generic'
162
+ };
163
+ const FORBIDDEN_WORDS = [
164
+ "BUEI",
165
+ "BUEY",
166
+ "CACA",
167
+ "CACO",
168
+ "CAGA",
169
+ "CAGO",
170
+ "CAKA",
171
+ "CAKO",
172
+ "COGE",
173
+ "COJA",
174
+ "COJE",
175
+ "COJI",
176
+ "COJO",
177
+ "CULO",
178
+ "FETO",
179
+ "GUEY",
180
+ "JOTO",
181
+ "KACA",
182
+ "KACO",
183
+ "KAGA",
184
+ "KAGO",
185
+ "KOGE",
186
+ "KOJO",
187
+ "KAKA",
188
+ "KULO",
189
+ "MAME",
190
+ "MAMO",
191
+ "MEAR",
192
+ "MEAS",
193
+ "MEON",
194
+ "MION",
195
+ "MOCO",
196
+ "MULA",
197
+ "PEDA",
198
+ "PEDO",
199
+ "PENE",
200
+ "PUTA",
201
+ "PUTO",
202
+ "QULO",
203
+ "RATA",
204
+ "RUIN"
205
+ ];
206
+ const VALUES_MAP = {
207
+ '0': 0,
208
+ '1': 1,
209
+ '2': 2,
210
+ '3': 3,
211
+ '4': 4,
212
+ '5': 5,
213
+ '6': 6,
214
+ '7': 7,
215
+ '8': 8,
216
+ '9': 9,
217
+ 'A': 10,
218
+ 'B': 11,
219
+ 'C': 12,
220
+ 'D': 13,
221
+ 'E': 14,
222
+ 'F': 15,
223
+ 'G': 16,
224
+ 'H': 17,
225
+ 'I': 18,
226
+ 'J': 19,
227
+ 'K': 20,
228
+ 'L': 21,
229
+ 'M': 22,
230
+ 'N': 23,
231
+ '&': 24,
232
+ 'O': 25,
233
+ 'P': 26,
234
+ 'Q': 27,
235
+ 'R': 28,
236
+ 'S': 29,
237
+ 'T': 30,
238
+ 'U': 31,
239
+ 'V': 32,
240
+ 'W': 33,
241
+ 'X': 34,
242
+ 'Y': 35,
243
+ 'Z': 36,
244
+ ' ': 37,
245
+ 'Ñ': 38
246
+ };
247
+ const getScore = (doc) => doc.split('').reverse().reduce((sum, char, i) => {
248
+ const index = i + 2;
249
+ const value = VALUES_MAP[char] || 0;
250
+ return sum + value * index;
251
+ }, 0);
252
+ const parseInput = (doc) => {
253
+ return String(doc)
254
+ .trim()
255
+ .toUpperCase()
256
+ .replace(/[^0-9A-ZÑ\x26]/g, '');
257
+ };
258
+ const validateDate = (doc) => {
259
+ const dateStr = doc.slice(0, -3).slice(-6);
260
+ const year = dateStr.slice(0, 2);
261
+ const month = dateStr.slice(2, 4);
262
+ const day = dateStr.slice(4, 6);
263
+ const date = new Date(`20${year}-${month}-${day}`);
264
+ return !isNaN(date.getTime());
265
+ };
266
+ const validateVerificationDigit = (doc) => {
267
+ const digit = doc.slice(-1);
268
+ const rfc = doc.length === 12 ? ` ${doc}` : doc;
269
+ const base = rfc.slice(0, -1);
270
+ const score = getScore(base);
271
+ const mod = (11000 - score) % 11;
272
+ if (mod === 11)
273
+ return '0' === digit;
274
+ if (mod === 10)
275
+ return 'A' === digit;
276
+ return String(mod) === digit;
277
+ };
278
+ const isSpecialCase = (doc) => doc in SPECIAL_CASES;
279
+ const hasForbiddenWords = (doc) => {
280
+ const prefix = (doc || '').slice(0, 4);
281
+ return FORBIDDEN_WORDS.includes(prefix);
282
+ };
283
+ try {
284
+ const input = parseInput(document);
285
+ if (isSpecialCase(input))
286
+ return false;
287
+ const hasValidFormat = RFC_REGEXP.test(input);
288
+ if (!hasValidFormat)
289
+ return false;
290
+ const hasValidDate = validateDate(input);
291
+ if (!hasValidDate)
292
+ return false;
293
+ const hasValidDigit = validateVerificationDigit(input);
294
+ if (!hasValidDigit)
295
+ return false;
296
+ if (hasForbiddenWords(input))
297
+ return false;
298
+ return true;
299
+ }
300
+ catch (e) {
301
+ //not to do
302
+ }
303
+ return false;
160
304
  }
161
305
  static isValidUrl(txt) {
162
306
  const regex = /(https?:\/\/(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9])(:?\d*)\/?([a-z_\\/0-9\-#.]*)\??([a-z_\\/0-9\-#=&]*)/g;
@@ -284,4 +428,4 @@ export class MonkeyEcxUtils {
284
428
  return ret;
285
429
  }
286
430
  }
287
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tb25rZXktZnJvbnQtY29yZS9zcmMvbGliL2NvcmUvdXRpbHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUNBQWlDO0FBQ2pDLDRCQUE0QjtBQUM1QixzQ0FBc0M7QUFDdEMsZ0NBQWdDO0FBQ2hDLG1DQUFtQztBQUNuQywyQkFBMkI7QUFDM0IsaUNBQWlDO0FBQ2pDLGdDQUFnQztBQUNoQywyQkFBMkI7QUFFM0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV6QyxxQ0FBcUM7QUFDckMsTUFBTSxPQUFPLGNBQWM7SUFDekIsTUFBTSxDQUFDLHlCQUF5QixDQUFDLEVBQU87UUFDdEMsT0FBTyxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFXLEVBQUUsT0FBZ0I7UUFDbEQsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNwQixJQUFJLE9BQU8sS0FBSyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDbkMsSUFBSSxPQUFPLEtBQUssSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ25DLE9BQU8sR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNDLENBQUM7SUFFRCxNQUFNLENBQUMsZUFBZSxDQUFDLElBQVksRUFBRSxPQUFPLEdBQUcsRUFBRTtRQUMvQyxPQUFPO1lBQ0wsRUFBRSxFQUFFO2dCQUNGLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRztnQkFDckIsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJO2dCQUN2QixFQUFFLEVBQUUsR0FBRyxZQUFZLENBQUMs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QUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBUSxFQUFFLE1BQWdCO1FBQ2hELElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNkLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDekIsR0FBRyxHQUFHO29CQUNKLEdBQUcsR0FBRztvQkFDTixDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFO2lCQUN6QixDQUFDO2FBQ0g7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjb21tYS1kYW5nbGUgKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZWxlc3MtZXNjYXBlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wbHVzcGx1cyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cbi8qIGVzbGludC1kaXNhYmxlIGVxZXFlcSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcmVkZWNsYXJlICovXG4vKiBlc2xpbnQtZGlzYWJsZSB2YXJzLW9uLXRvcCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbmltcG9ydCB7IENvdW50cnlNYXNrcyB9IGZyb20gJy4vc3RhdGljcyc7XG5cbi8qIGVzbGludC1kaXNhYmxlIGJsb2NrLXNjb3BlZC12YXIgKi9cbmV4cG9ydCBjbGFzcyBNb25rZXlFY3hVdGlscyB7XG4gIHN0YXRpYyBwZXJzaXN0TnVsbEVtcHR5VW5kZWZpbmVkKHRwOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHAgIT09IG51bGwgJiYgdHAgIT09IHVuZGVmaW5lZCAmJiB0cCAhPT0gJyc7XG4gIH1cblxuICBzdGF0aWMgZ2V0RG9jdW1lbnRUeXBlKGRvYzogc3RyaW5nLCBjb3VudHJ5Pzogc3RyaW5nKSB7XG4gICAgaWYgKCFkb2MpIHJldHVybiAnJztcbiAgICBpZiAoY291bnRyeSA9PT0gJ2NsJykgcmV0dXJuICdSVVQnO1xuICAgIGlmIChjb3VudHJ5ID09PSAnbXgnKSByZXR1cm4gJ1JGQyc7XG4gICAgcmV0dXJuIGRvYy5sZW5ndGggPD0gMTEgPyAnQ1BGJyA6ICdDTlBKJztcbiAgfVxuXG4gIHN0YXRpYyBnZXREb2N1bWVudE1hc2sodHlwZTogc3RyaW5nLCBjb3VudHJ5ID0gJycpIHtcbiAgICByZXR1cm4ge1xuICAgICAgQlI6IHtcbiAgICAgICAgQ1BGOiBDb3VudHJ5TWFza3MuQ1BGLFxuICAgICAgICBDTlBKOiBDb3VudHJ5TWFza3MuQ05QSixcbiAgICAgICAgJyc6IGAke0NvdW50cnlNYXNrcy5DUEZ9fHwke0NvdW50cnlNYXNrcy5DTlBKfWBcbiAgICAgIH0sXG4gICAgICBDTDoge1xuICAgICAgICBDUEY6IENvdW50cnlNYXNrcy5SVVQxLFxuICAgICAgICBDTlBKOiBDb3VudHJ5TWFza3MuUlVUMixcbiAgICAgICAgJyc6IGAke0NvdW50cnlNYXNrcy5SVVQxfXx8JHtDb3VudHJ5TWFza3MuUlVUMn1gXG4gICAgICB9LFxuICAgICAgTVg6IHtcbiAgICAgICAgQ1BGOiBDb3VudHJ5TWFza3MuUkZDMSxcbiAgICAgICAgQ05QSjogQ291bnRyeU1hc2tzLlJGQzIsXG4gICAgICAgICcnOiBgJHtDb3VudHJ5TWFza3MuUkZDMX18fCR7Q291bnRyeU1hc2tzLlJGQzJ9YFxuICAgICAgfVxuICAgIH1bY291bnRyeS50b1VwcGVyQ2FzZSgpXT8uW3R5cGVdO1xuICB9XG5cbiAgc3RhdGljIGdldERvY3VtZW50UGxhY2Vob2xkZXIodHlwZTogc3RyaW5nLCBjb3VudHJ5ID0gJycpIHtcbiAgICByZXR1cm4ge1xuICAgICAgQlI6IHtcbiAgICAgICAgQ1BGOiAnMDAwLjAwMC4wMDAtWFgnLFxuICAgICAgICBDTlBKOiAnMDAuMDAwLjAwMC8wMDAwLTAwJ1xuICAgICAgfSxcbiAgICAgIENMOiB7XG4gICAgICAgIENQRjogJzAwMDAwMDAtQScsXG4gICAgICAgIENOUEo6ICcwMDAwMDAwLUEnXG4gICAgICB9LFxuICAgICAgTVg6IHtcbiAgICAgICAgQ1BGOiBDb3VudHJ5TWFza3MuUkZDMSxcbiAgICAgICAgQ05QSjogQ291bnRyeU1hc2tzLlJGQzJcbiAgICAgIH1cbiAgICB9W2NvdW50cnkudG9VcHBlckNhc2UoKV0/Llt0eXBlXTtcbiAgfVxuXG4gIHN0YXRpYyBmb3JtYXREb2N1bWVudFdpdGhNYXNrKGRvYzogc3RyaW5nLCB3aXRoVHlwZT86IGJvb2xlYW4sIGNvdW50cnk/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghZG9jKSByZXR1cm4gZG9jO1xuICAgIGxldCBmb3JtYXRlZDogc3RyaW5nID0gJyc7XG4gICAgaWYgKGNvdW50cnkgPT09ICdjbCcpIHtcbiAgICAgIGZvcm1hdGVkID0gZG9jLnJlcGxhY2UoL14oXFxkezEsMn0pKFxcZHszfSkoXFxkezN9KShcXHd7MX0pJC8sICckMS4kMi4kMy0kNCcpO1xuICAgICAgcmV0dXJuIGAke2Zvcm1hdGVkfWA7XG4gICAgfVxuICAgIGlmIChkb2MubGVuZ3RoID09PSAxNCkge1xuICAgICAgZm9ybWF0ZWQgPSBkb2NcbiAgICAgICAgLnJlcGxhY2UoL14oXFxkezJ9KShcXGQpLywgJyQxLiQyJylcbiAgICAgICAgLnJlcGxhY2UoL14oXFxkezJ9KVxcLihcXGR7M30pKFxcZCkvLCAnJDEuJDIuJDMnKVxuICAgICAgICAucmVwbGFjZSgvXFwuKFxcZHszfSkoXFxkKS8sICcuJDEvJDInKVxuICAgICAgICAucmVwbGFjZSgvKFxcZHs0fSkoXFxkKS8sICckMS0kMicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtYXRlZCA9IGRvY1xuICAgICAgICAucmVwbGFjZSgvXihcXGR7M30pKFxcZCkvLCAnJDEuJDInKVxuICAgICAgICAucmVwbGFjZSgvXihcXGR7M30pXFwuKFxcZHszfSkoXFxkKS8sICckMS4kMi4kMycpXG4gICAgICAgIC5yZXBsYWNlKC9cXC4oXFxkezN9KShcXGQpLywgJy4kMS0kMicpO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt3aXRoVHlwZSA/IGAke3RoaXMuZ2V0RG9jdW1lbnRUeXBlKGRvYyl9OmAgOiAnJ30gJHtmb3JtYXRlZH1gO1xuICB9XG5cbiAgc3RhdGljIGN1dEZpcnN0TGFzdE5hbWUodmFsdWU6IHN0cmluZywgdHA6IHN0cmluZyA9ICdmaXJzdCcpIHtcbiAgICBjb25zdCBzcGxpdCA9IHZhbHVlPy50cmltKCk/LnNwbGl0KCcgJyk7XG5cbiAgICBpZiAodHAgPT09ICdmaXJzdCcpIHJldHVybiBzcGxpdFswXTtcbiAgICByZXR1cm4gc3BsaXQ/LnNwbGljZSgxLCBzcGxpdC5sZW5ndGgpPy5qb2luKCcgJyk7XG4gIH1cblxuICBzdGF0aWMgaXNDUEZDTlBKVmFsaWQoZG9jdW1lbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGRvY3VtZW50ID0gZG9jdW1lbnQucmVwbGFjZSgvW15cXGRdL2csICcnKTtcblxuICAgIGNvbnN0IGhhbmRsZWQgPSBkb2N1bWVudC5yZXBsYWNlKG5ldyBSZWdFeHAoZG9jdW1lbnQuY2hhckF0KDApLCAnZycpLCAnJyk7XG4gICAgaWYgKCFoYW5kbGVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoZG9jdW1lbnQubGVuZ3RoID09PSAxMSkge1xuICAgICAgbGV0IGJhc2UgPSBbMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDBdO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSAwOyBpIDwgOTsgbiArPSBkb2N1bWVudFtpXSAqIGJhc2VbaSsrXSk7XG4gICAgICBpZiAoZG9jdW1lbnRbOV0gIT0gKChuICU9IDExKSA8PSAxID8gMCA6IDExIC0gbikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYmFzZSA9IFsxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDBdO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSAwOyBpIDw9IDk7IG4gKz0gZG9jdW1lbnRbaV0gKiBiYXNlW2krK10pO1xuICAgICAgaWYgKGRvY3VtZW50WzEwXSAhPSAoKG4gJT0gMTEpIDw9IDEgPyAwIDogMTEgLSBuKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGRvY3VtZW50Lmxlbmd0aCA9PT0gMTQgfHwgLzB7MTR9Ly50ZXN0KGRvY3VtZW50KSkge1xuICAgICAgY29uc3QgYmFzZSA9IFs2LCA1LCA0LCAzLCAyLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyXTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gMDsgaSA8IDEyOyBuICs9IGRvY3VtZW50W2ldICogYmFzZVsrK2ldKTtcbiAgICAgIGlmIChkb2N1bWVudFsxMl0gIT0gKChuICU9IDExKSA8IDIgPyAwIDogMTEgLSBuKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gMDsgaSA8PSAxMjsgbiArPSBkb2N1bWVudFtpXSAqIGJhc2VbaSsrXSk7XG4gICAgICBpZiAoZG9jdW1lbnRbMTNdICE9ICgobiAlPSAxMSkgPCAyID8gMCA6IDExIC0gbikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc1ZhbGlkUlVUKGRvY3VtZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWRvY3VtZW50IHx8IGRvY3VtZW50LnRyaW0oKS5sZW5ndGggPCAzKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZG9jdW1lbnRIYW5kbGVkID0gZG9jdW1lbnQucmVwbGFjZSgvW14wLTlrS10vZywgJycpO1xuXG4gICAgaWYgKGRvY3VtZW50SGFuZGxlZC5sZW5ndGggPCAzKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBjYWxjRHYgPSAocnV0OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBgJHtydXR9YDtcbiAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgbGV0IG11bHQgPSAyO1xuXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBpbmRleCA9IG11bHQgKiBOdW1iZXIodmFsdWUuY2hhckF0KHZhbHVlLmxlbmd0aCAtIGkpKTtcblxuICAgICAgICBzdW0gKz0gaW5kZXg7XG5cbiAgICAgICAgaWYgKG11bHQgPCA3KSB7XG4gICAgICAgICAgbXVsdCArPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG11bHQgPSAyO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGR2RXNwZXJhZG8gPSAxMSAtIChzdW0gJSAxMSk7XG4gICAgICBpZiAoZHZFc3BlcmFkbyA9PT0gMTApIHJldHVybiAnSyc7XG4gICAgICBpZiAoZHZFc3BlcmFkbyA9PT0gMTEpIHJldHVybiAnMCc7XG4gICAgICByZXR1cm4gYCR7ZHZFc3BlcmFkb31gO1xuICAgIH07XG5cbiAgICBjb25zdCBudW0gPSBkb2N1bWVudEhhbmRsZWQuc2xpY2UoMCwgLTEpO1xuICAgIGNvbnN0IGRndiA9IGRvY3VtZW50SGFuZGxlZC5zbGljZSgtMSkudG9VcHBlckNhc2UoKTtcblxuICAgIGNvbnN0IGR2Q2FsYyA9IGNhbGNEdihudW0pO1xuICAgIHJldHVybiBkdkNhbGMgPT09IGRndjtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNWYWxpZFJGQyhkb2N1bWVudDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVnZXggPSAvXltBLVpdezMsNH1bMC05XXs2fVtBLVowLTldezN9JC87XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QoZG9jdW1lbnQpO1xuICB9XG5cbiAgc3RhdGljIGlzVmFsaWRVcmwodHh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCByZWdleCA9IC8oaHR0cHM/OlxcL1xcLyg/OlthLXowLTldKD86W2EtejAtOS1dezAsNjF9W2EtejAtOV0pP1xcLikrW2EtejAtOV1bYS16MC05LV17MCw2MX1bYS16MC05XSkoOj9cXGQqKVxcLz8oW2Etel9cXFxcLzAtOVxcLSMuXSopXFw/PyhbYS16X1xcXFwvMC05XFwtIz0mXSopL2c7XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QodHh0KTtcbiAgfVxuXG4gIHN0YXRpYyBpc1ZhbGlkWmlwQ29kZSh6aXBDb2RlOiBzdHJpbmcsIGNvdW50cnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsZW5ndGggPSB7XG4gICAgICAnYnInOiA4LFxuICAgICAgJ2NsJzogNyxcbiAgICAgICdteCc6IDVcbiAgICB9W2NvdW50cnkgfHwgJ2JyJ11cblxuICAgIHJldHVybiBgJHt0aGlzLmhhbmRsZU9ubHlOdW1iZXJzKHppcENvZGUpfWAubGVuZ3RoID09PSBsZW5ndGg7XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZEVtYWlsKGVtYWlsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gL15bXFx3LS5dK0AoW1xcdy1dK1xcLikrW1xcdy1dezEsNjR9JC8udGVzdChlbWFpbCB8fCAnJyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0UmFuZG9tU3RyaW5nKGxlbjogbnVtYmVyLCBjaGFyU2V0Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjaGFyU2V0ID0gY2hhclNldCB8fCAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xuXG4gICAgY29uc3QgcmFuZG9tU3RyaW5nOiBzdHJpbmcgPSBuZXcgQXJyYXkobGVuKVxuICAgICAgLmZpbGwoJzEnKVxuICAgICAgLm1hcCgoKSA9PiB7XG4gICAgICAgIHJldHVybiBjaGFyU2V0Py5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhclNldD8ubGVuZ3RoKSk7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJycpO1xuICAgIHJldHVybiByYW5kb21TdHJpbmc7XG4gIH1cblxuICBzdGF0aWMgaGFuZGxlT25seU51bWJlcnModmFsdWU6IGFueSkge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoL1teMC05XS9nKSwgJycpO1xuICB9XG5cbiAgc3RhdGljIGhhbmRsZU9ubHlBbHBoYU51bWVyaWModmFsdWU6IGFueSkge1xuICAgIGlmICghdmFsdWUpIHJldHVybiAnJztcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKC9bXjAtOUEtWmEtel0vLCAnZycpLCAnJyk7XG4gIH1cblxuICBzdGF0aWMgY2FwaXRhbGl6ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7dmFsdWUuc2xpY2UoMSl9YDtcbiAgfVxuXG4gIHN0YXRpYyBmb3JtYXRaaXBDb2RlKHppcENvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF6aXBDb2RlKSByZXR1cm4gemlwQ29kZTtcbiAgICBjb25zdCBmb3JtYXRlZDogc3RyaW5nID0gemlwQ29kZVxuICAgICAgLnJlcGxhY2UoL14oXFxkezV9KShcXGQpLywgJyQxLSQyJylcbiAgICAgIC5yZXBsYWNlKC9cXC4oXFxkezN9KShcXGQpLywgJy4kMS0kMicpO1xuXG4gICAgcmV0dXJuIGAke2Zvcm1hdGVkfWA7XG4gIH1cblxuICBzdGF0aWMgZm9ybWF0RmlsZVNpemUoc2l6ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQiddO1xuICAgIGxldCBsID0gMDtcbiAgICB3aGlsZSAoc2l6ZSA+PSAxMDI0ICYmICsrbCkge1xuICAgICAgc2l6ZSAvPSAxMDI0O1xuICAgIH1cbiAgICByZXR1cm4gYCR7c2l6ZS50b0ZpeGVkKHNpemUgPCAxMCAmJiBsID4gMCA/IDEgOiAwKX0gJHt1bml0c1tsXX1gO1xuICB9XG5cbiAgc3RhdGljIHN1ZmZsdWUoZGF0YTogYW55W10pOiBhbnlbXSB7XG4gICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGkpO1xuICAgICAgY29uc3QgdGVtcCA9IGRhdGFbaV07XG4gICAgICBkYXRhW2ldID0gZGF0YVtqXTtcbiAgICAgIGRhdGFbal0gPSB0ZW1wO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHN0YXRpYyBoYW5kbGVCbG9iRmlsZSh0aGVCbG9iOiBhbnksIGZpbGVOYW1lOiBzdHJpbmcsIGZpbGVUeXBlOiBzdHJpbmcpIHtcbiAgICBmdW5jdGlvbiBibG9iVG9GaWxlKHRoZUJsb2I6IGFueSwgZmlsZU5hbWU6IHN0cmluZykge1xuICAgICAgY29uc3QgYiA9IHRoZUJsb2I7XG4gICAgICBiLmxhc3RNb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgYi5uYW1lID0gZmlsZU5hbWU7XG4gICAgICByZXR1cm4gYjtcbiAgICB9XG5cbiAgICBsZXQgZmlsZTogYW55O1xuICAgIGlmICghKG5hdmlnYXRvciBhcyBhbnkpLm1zU2F2ZUJsb2IpIHtcbiAgICAgIGZpbGUgPSBuZXcgRmlsZShbdGhlQmxvYl0sIGZpbGVOYW1lLCB7XG4gICAgICAgIHR5cGU6IGZpbGVUeXBlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbGUgPSBuZXcgQmxvYihbdGhlQmxvYl0sIHtcbiAgICAgICAgdHlwZTogZmlsZVR5cGUsXG4gICAgICB9KTtcbiAgICAgIGZpbGUgPSBibG9iVG9GaWxlKGZpbGUsIGZpbGVOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cblxuICBzdGF0aWMgdHJ1bmNhdGUodGV4dDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlciA9IDI1KTogc3RyaW5nIHtcbiAgICBjb25zdCBtaWRDaGFyID0gJy4uLic7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gbWlkQ2hhcjtcbiAgICBpZiAodGV4dCAmJiB0ZXh0Lmxlbmd0aCA8PSBtYXhMZW5ndGgpIHJldHVybiB0ZXh0O1xuXG4gICAgY29uc3QgbGVmdCA9IE1hdGguY2VpbChtYXhMZW5ndGggLyAyKTtcbiAgICBjb25zdCByaWdodCA9IHRleHQubGVuZ3RoIC0gbGVmdCArIDE7XG5cbiAgICByZXR1cm4gYCR7dGV4dC5zdWJzdHIoMCwgbGVmdCl9ICR7bWlkQ2hhcn0gJHt0ZXh0LnN1YnN0cmluZyhyaWdodCl9YDtcbiAgfVxuXG4gIHN0YXRpYyBpc0xvY2FsaG9zdCgpIHtcbiAgICBjb25zdCB7IGhyZWYgfSA9IHdpbmRvdz8ubG9jYXRpb247XG4gICAgaWYgKCFocmVmKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGhyZWY/LnNlYXJjaCgnbG9jYWxob3N0JykgPj0gMDtcbiAgfVxuXG4gIHN0YXRpYyBpc1NhbWVPcmlnaW4oZnJvbnRlbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluaXRpYWxQYXRoOiBzdHJpbmcgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgIHJldHVybiAoaW5pdGlhbFBhdGggfHwgJycpID09PSBmcm9udGVuZDtcbiAgfVxuXG4gIHN0YXRpYyByZXBsYWNlVmFyaWFibGVzKGRhdGE6IHN0cmluZywgb2JqOiBhbnkpIHtcbiAgICBsZXQgaGFuZGxlZCA9IGRhdGE7XG4gICAgT2JqZWN0LmVudHJpZXMob2JqKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGhhbmRsZWQgPSBoYW5kbGVkLnJlcGxhY2UobmV3IFJlZ0V4cChgeyR7a2V5fX1gLCAnZycpLCBgJHt2YWx1ZX1gKTtcbiAgICB9KTtcbiAgICByZXR1cm4gaGFuZGxlZDtcbiAgfVxuXG4gIHN0YXRpYyB0cmltVmFsdWVzVG9TYXZlKG9iajogYW55LCBmaWVsZHM6IHN0cmluZ1tdKSB7XG4gICAgbGV0IHJldCA9IG9iajtcbiAgICBjb25zdCBncm91cGVkID0gZmllbGRzLmpvaW4oJyMnKTtcbiAgICBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoZ3JvdXBlZC5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJldCA9IHtcbiAgICAgICAgICAuLi5yZXQsXG4gICAgICAgICAgW2tleV06IGAke3ZhbHVlfWAudHJpbSgpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXQ7XG4gIH1cbn1cbiJdfQ==
431
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tb25rZXktZnJvbnQtY29yZS9zcmMvbGliL2NvcmUvdXRpbHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUNBQWlDO0FBQ2pDLDRCQUE0QjtBQUM1QixzQ0FBc0M7QUFDdEMsZ0NBQWdDO0FBQ2hDLG1DQUFtQztBQUNuQywyQkFBMkI7QUFDM0IsaUNBQWlDO0FBQ2pDLGdDQUFnQztBQUNoQywyQkFBMkI7QUFFM0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV6QyxxQ0FBcUM7QUFDckMsTUFBTSxPQUFPLGNBQWM7SUFDekIsTUFBTSxDQUFDLHlCQUF5QixDQUFDLEVBQU87UUFDdEMsT0FBTyxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFXLEVBQUUsT0FBZ0I7UUFDbEQsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNwQixJQUFJLE9BQU8sS0FBSyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDbkMsSUFBSSxPQUFPLEtBQUssSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ25DLE9BQU8sR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNDLENBQUM7SUFFRCxNQUFNLENBQUMsZUFBZSxDQUFDLElBQVksRUFBRSxPQUFPLEdBQUcsRUFBRTtRQUMvQyxPQUFPO1lBQ0wsRUFBRSxFQUFFO2dCQUNGLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRztnQkFDckIsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJO2dCQUN2QixFQUFFLEVBQUUsR0FBRyxZQUFZLENBQUMs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Q04sTUFBTTtZQUNOLE1BQU07WUFDTixNQUFNO1lBQ04sTUFBTTtZQUNOLE1BQU07WUFDTixNQUFNO1lBQ04sTUFBTTtZQUNOLE1BQU07WUFDTixNQUFNO1lBQ04sTUFBTTtZQUNOLE1BQU07WUFDTixNQUFNO1lBQ04sTUFBTTtZQUNOLE1BQU07WUFDTixNQUFNO1lBQ04sTUFBTTtZQUNOLE1BQU07WUFDTixNQUFNO1lBQ04sTUFBTTtZQUNOLE1BQU07WUFDTixNQUFNO1lBQ04sTUFBTTtTQUNQLENBQUM7UUFFRixNQUFNLFVBQVUsR0FBRztZQUNqQixHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLENBQUM7WUFDTixHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxFQUFFO1lBQ1AsR0FBRyxFQUFFLEVBQUU7WUFDUCxHQUFHLEVBQUUsRUFBRTtZQUNQLEdBQUcsRUFBRSxFQUFFO1lBQ1AsR0FBRyxFQUFFLEVBQUU7WUFDUCxHQUFHLEVBQUUsRUFBRTtZQUNQLEdBQUcsRUFBRSxFQUFFO1lBQ1AsR0FBRyxFQUFFLEVBQUU7WUFDUCxHQUFHLEVBQUUsRUFBRTtZQUNQLEdBQUcsRUFBRSxFQUFFO1lBQ1AsR0FBRyxFQUFFLEVBQUU7WUFDUCxHQUFHLEVBQUUsRUFBRTtZQUNQLEdBQUcsRUFBRSxFQUFFO1lBQ1AsR0FBRyxFQUFFLEVBQUU7WUFDUCxHQUFHLEVBQUUsRUFBRTtZQUNQLEdBQUcsRUFBRSxFQUFFO1lBQ1AsR0FBRyxFQUFFLEVBQUU7WUFDUCxHQUFHLEVBQUUsRUFBRTtZQUNQLEdBQUcsRUFBRSxFQUFFO1lBQ1AsR0FBRyxFQUFFLEVBQUU7WUFDUCxHQUFHLEVBQUUsRUFBRTtZQUNQLEdBQUcsRUFBRSxFQUFFO1lBQ1AsR0FBRyxF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QU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBUSxFQUFFLE1BQWdCO1FBQ2hELElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNkLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDekIsR0FBRyxHQUFHO29CQUNKLEdBQUcsR0FBRztvQkFDTixDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFO2lCQUN6QixDQUFDO2FBQ0g7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjb21tYS1kYW5nbGUgKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZWxlc3MtZXNjYXBlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wbHVzcGx1cyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cbi8qIGVzbGludC1kaXNhYmxlIGVxZXFlcSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcmVkZWNsYXJlICovXG4vKiBlc2xpbnQtZGlzYWJsZSB2YXJzLW9uLXRvcCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbmltcG9ydCB7IENvdW50cnlNYXNrcyB9IGZyb20gJy4vc3RhdGljcyc7XG5cbi8qIGVzbGludC1kaXNhYmxlIGJsb2NrLXNjb3BlZC12YXIgKi9cbmV4cG9ydCBjbGFzcyBNb25rZXlFY3hVdGlscyB7XG4gIHN0YXRpYyBwZXJzaXN0TnVsbEVtcHR5VW5kZWZpbmVkKHRwOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHAgIT09IG51bGwgJiYgdHAgIT09IHVuZGVmaW5lZCAmJiB0cCAhPT0gJyc7XG4gIH1cblxuICBzdGF0aWMgZ2V0RG9jdW1lbnRUeXBlKGRvYzogc3RyaW5nLCBjb3VudHJ5Pzogc3RyaW5nKSB7XG4gICAgaWYgKCFkb2MpIHJldHVybiAnJztcbiAgICBpZiAoY291bnRyeSA9PT0gJ2NsJykgcmV0dXJuICdSVVQnO1xuICAgIGlmIChjb3VudHJ5ID09PSAnbXgnKSByZXR1cm4gJ1JGQyc7XG4gICAgcmV0dXJuIGRvYy5sZW5ndGggPD0gMTEgPyAnQ1BGJyA6ICdDTlBKJztcbiAgfVxuXG4gIHN0YXRpYyBnZXREb2N1bWVudE1hc2sodHlwZTogc3RyaW5nLCBjb3VudHJ5ID0gJycpIHtcbiAgICByZXR1cm4ge1xuICAgICAgQlI6IHtcbiAgICAgICAgQ1BGOiBDb3VudHJ5TWFza3MuQ1BGLFxuICAgICAgICBDTlBKOiBDb3VudHJ5TWFza3MuQ05QSixcbiAgICAgICAgJyc6IGAke0NvdW50cnlNYXNrcy5DUEZ9fHwke0NvdW50cnlNYXNrcy5DTlBKfWBcbiAgICAgIH0sXG4gICAgICBDTDoge1xuICAgICAgICBDUEY6IENvdW50cnlNYXNrcy5SVVQxLFxuICAgICAgICBDTlBKOiBDb3VudHJ5TWFza3MuUlVUMixcbiAgICAgICAgJyc6IGAke0NvdW50cnlNYXNrcy5SVVQxfXx8JHtDb3VudHJ5TWFza3MuUlVUMn1gXG4gICAgICB9LFxuICAgICAgTVg6IHtcbiAgICAgICAgQ1BGOiBDb3VudHJ5TWFza3MuUkZDMSxcbiAgICAgICAgQ05QSjogQ291bnRyeU1hc2tzLlJGQzIsXG4gICAgICAgICcnOiBgJHtDb3VudHJ5TWFza3MuUkZDMX18fCR7Q291bnRyeU1hc2tzLlJGQzJ9YFxuICAgICAgfVxuICAgIH1bY291bnRyeS50b1VwcGVyQ2FzZSgpXT8uW3R5cGVdO1xuICB9XG5cbiAgc3RhdGljIGdldERvY3VtZW50UGxhY2Vob2xkZXIodHlwZTogc3RyaW5nLCBjb3VudHJ5ID0gJycpIHtcbiAgICByZXR1cm4ge1xuICAgICAgQlI6IHtcbiAgICAgICAgQ1BGOiAnMDAwLjAwMC4wMDAtWFgnLFxuICAgICAgICBDTlBKOiAnMDAuMDAwLjAwMC8wMDAwLTAwJ1xuICAgICAgfSxcbiAgICAgIENMOiB7XG4gICAgICAgIENQRjogJzAwMDAwMDAtQScsXG4gICAgICAgIENOUEo6ICcwMDAwMDAwLUEnXG4gICAgICB9LFxuICAgICAgTVg6IHtcbiAgICAgICAgQ1BGOiBDb3VudHJ5TWFza3MuUkZDMSxcbiAgICAgICAgQ05QSjogQ291bnRyeU1hc2tzLlJGQzJcbiAgICAgIH1cbiAgICB9W2NvdW50cnkudG9VcHBlckNhc2UoKV0/Llt0eXBlXTtcbiAgfVxuXG4gIHN0YXRpYyBmb3JtYXREb2N1bWVudFdpdGhNYXNrKGRvYzogc3RyaW5nLCB3aXRoVHlwZT86IGJvb2xlYW4sIGNvdW50cnk/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghZG9jKSByZXR1cm4gZG9jO1xuICAgIGxldCBmb3JtYXRlZDogc3RyaW5nID0gJyc7XG4gICAgaWYgKGNvdW50cnkgPT09ICdjbCcpIHtcbiAgICAgIGZvcm1hdGVkID0gZG9jLnJlcGxhY2UoL14oXFxkezEsMn0pKFxcZHszfSkoXFxkezN9KShcXHd7MX0pJC8sICckMS4kMi4kMy0kNCcpO1xuICAgICAgcmV0dXJuIGAke2Zvcm1hdGVkfWA7XG4gICAgfVxuICAgIGlmIChkb2MubGVuZ3RoID09PSAxNCkge1xuICAgICAgZm9ybWF0ZWQgPSBkb2NcbiAgICAgICAgLnJlcGxhY2UoL14oXFxkezJ9KShcXGQpLywgJyQxLiQyJylcbiAgICAgICAgLnJlcGxhY2UoL14oXFxkezJ9KVxcLihcXGR7M30pKFxcZCkvLCAnJDEuJDIuJDMnKVxuICAgICAgICAucmVwbGFjZSgvXFwuKFxcZHszfSkoXFxkKS8sICcuJDEvJDInKVxuICAgICAgICAucmVwbGFjZSgvKFxcZHs0fSkoXFxkKS8sICckMS0kMicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtYXRlZCA9IGRvY1xuICAgICAgICAucmVwbGFjZSgvXihcXGR7M30pKFxcZCkvLCAnJDEuJDInKVxuICAgICAgICAucmVwbGFjZSgvXihcXGR7M30pXFwuKFxcZHszfSkoXFxkKS8sICckMS4kMi4kMycpXG4gICAgICAgIC5yZXBsYWNlKC9cXC4oXFxkezN9KShcXGQpLywgJy4kMS0kMicpO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt3aXRoVHlwZSA/IGAke3RoaXMuZ2V0RG9jdW1lbnRUeXBlKGRvYyl9OmAgOiAnJ30gJHtmb3JtYXRlZH1gO1xuICB9XG5cbiAgc3RhdGljIGN1dEZpcnN0TGFzdE5hbWUodmFsdWU6IHN0cmluZywgdHA6IHN0cmluZyA9ICdmaXJzdCcpIHtcbiAgICBjb25zdCBzcGxpdCA9IHZhbHVlPy50cmltKCk/LnNwbGl0KCcgJyk7XG5cbiAgICBpZiAodHAgPT09ICdmaXJzdCcpIHJldHVybiBzcGxpdFswXTtcbiAgICByZXR1cm4gc3BsaXQ/LnNwbGljZSgxLCBzcGxpdC5sZW5ndGgpPy5qb2luKCcgJyk7XG4gIH1cblxuICBzdGF0aWMgaXNDUEZDTlBKVmFsaWQoZG9jdW1lbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGRvY3VtZW50ID0gZG9jdW1lbnQucmVwbGFjZSgvW15cXGRdL2csICcnKTtcblxuICAgIGNvbnN0IGhhbmRsZWQgPSBkb2N1bWVudC5yZXBsYWNlKG5ldyBSZWdFeHAoZG9jdW1lbnQuY2hhckF0KDApLCAnZycpLCAnJyk7XG4gICAgaWYgKCFoYW5kbGVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoZG9jdW1lbnQubGVuZ3RoID09PSAxMSkge1xuICAgICAgbGV0IGJhc2UgPSBbMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDBdO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSAwOyBpIDwgOTsgbiArPSBkb2N1bWVudFtpXSAqIGJhc2VbaSsrXSk7XG4gICAgICBpZiAoZG9jdW1lbnRbOV0gIT0gKChuICU9IDExKSA8PSAxID8gMCA6IDExIC0gbikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYmFzZSA9IFsxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDBdO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSAwOyBpIDw9IDk7IG4gKz0gZG9jdW1lbnRbaV0gKiBiYXNlW2krK10pO1xuICAgICAgaWYgKGRvY3VtZW50WzEwXSAhPSAoKG4gJT0gMTEpIDw9IDEgPyAwIDogMTEgLSBuKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGRvY3VtZW50Lmxlbmd0aCA9PT0gMTQgfHwgLzB7MTR9Ly50ZXN0KGRvY3VtZW50KSkge1xuICAgICAgY29uc3QgYmFzZSA9IFs2LCA1LCA0LCAzLCAyLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyXTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gMDsgaSA8IDEyOyBuICs9IGRvY3VtZW50W2ldICogYmFzZVsrK2ldKTtcbiAgICAgIGlmIChkb2N1bWVudFsxMl0gIT0gKChuICU9IDExKSA8IDIgPyAwIDogMTEgLSBuKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gMDsgaSA8PSAxMjsgbiArPSBkb2N1bWVudFtpXSAqIGJhc2VbaSsrXSk7XG4gICAgICBpZiAoZG9jdW1lbnRbMTNdICE9ICgobiAlPSAxMSkgPCAyID8gMCA6IDExIC0gbikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc1ZhbGlkUlVUKGRvY3VtZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWRvY3VtZW50IHx8IGRvY3VtZW50LnRyaW0oKS5sZW5ndGggPCAzKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZG9jdW1lbnRIYW5kbGVkID0gZG9jdW1lbnQucmVwbGFjZSgvW14wLTlrS10vZywgJycpO1xuXG4gICAgaWYgKGRvY3VtZW50SGFuZGxlZC5sZW5ndGggPCAzKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBjYWxjRHYgPSAocnV0OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBgJHtydXR9YDtcbiAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgbGV0IG11bHQgPSAyO1xuXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBpbmRleCA9IG11bHQgKiBOdW1iZXIodmFsdWUuY2hhckF0KHZhbHVlLmxlbmd0aCAtIGkpKTtcblxuICAgICAgICBzdW0gKz0gaW5kZXg7XG5cbiAgICAgICAgaWYgKG11bHQgPCA3KSB7XG4gICAgICAgICAgbXVsdCArPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG11bHQgPSAyO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGR2RXNwZXJhZG8gPSAxMSAtIChzdW0gJSAxMSk7XG4gICAgICBpZiAoZHZFc3BlcmFkbyA9PT0gMTApIHJldHVybiAnSyc7XG4gICAgICBpZiAoZHZFc3BlcmFkbyA9PT0gMTEpIHJldHVybiAnMCc7XG4gICAgICByZXR1cm4gYCR7ZHZFc3BlcmFkb31gO1xuICAgIH07XG5cbiAgICBjb25zdCBudW0gPSBkb2N1bWVudEhhbmRsZWQuc2xpY2UoMCwgLTEpO1xuICAgIGNvbnN0IGRndiA9IGRvY3VtZW50SGFuZGxlZC5zbGljZSgtMSkudG9VcHBlckNhc2UoKTtcblxuICAgIGNvbnN0IGR2Q2FsYyA9IGNhbGNEdihudW0pO1xuICAgIHJldHVybiBkdkNhbGMgPT09IGRndjtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNWYWxpZFJGQyhkb2N1bWVudDogc3RyaW5nKSB7XG4gICAgY29uc3QgUkZDX1JFR0VYUCA9IC9eKFtBLVrDkVxceDI2XXszLDR9KShbMC05XXs2fSkoW0EtWjAtOV17M30pJC87XG4gICAgY29uc3QgU1BFQ0lBTF9DQVNFUyA9IHtcbiAgICAgICdYRVhYMDEwMTAxMDAwJzogJ2ZvcmVpZ24nLFxuICAgICAgJ1hBWFgwMTAxMDEwMDAnOiAnZ2VuZXJpYydcbiAgICB9O1xuICAgIGNvbnN0IEZPUkJJRERFTl9XT1JEUyA9IFtcbiAgICAgIFwiQlVFSVwiLFxuICAgICAgXCJCVUVZXCIsXG4gICAgICBcIkNBQ0FcIixcbiAgICAgIFwiQ0FDT1wiLFxuICAgICAgXCJDQUdBXCIsXG4gICAgICBcIkNBR09cIixcbiAgICAgIFwiQ0FLQVwiLFxuICAgICAgXCJDQUtPXCIsXG4gICAgICBcIkNPR0VcIixcbiAgICAgIFwiQ09KQVwiLFxuICAgICAgXCJDT0pFXCIsXG4gICAgICBcIkNPSklcIixcbiAgICAgIFwiQ09KT1wiLFxuICAgICAgXCJDVUxPXCIsXG4gICAgICBcIkZFVE9cIixcbiAgICAgIFwiR1VFWVwiLFxuICAgICAgXCJKT1RPXCIsXG4gICAgICBcIktBQ0FcIixcbiAgICAgIFwiS0FDT1wiLFxuICAgICAgXCJLQUdBXCIsXG4gICAgICBcIktBR09cIixcbiAgICAgIFwiS09HRVwiLFxuICAgICAgXCJLT0pPXCIsXG4gICAgICBcIktBS0FcIixcbiAgICAgIFwiS1VMT1wiLFxuICAgICAgXCJNQU1FXCIsXG4gICAgICBcIk1BTU9cIixcbiAgICAgIFwiTUVBUlwiLFxuICAgICAgXCJNRUFTXCIsXG4gICAgICBcIk1FT05cIixcbiAgICAgIFwiTUlPTlwiLFxuICAgICAgXCJNT0NPXCIsXG4gICAgICBcIk1VTEFcIixcbiAgICAgIFwiUEVEQVwiLFxuICAgICAgXCJQRURPXCIsXG4gICAgICBcIlBFTkVcIixcbiAgICAgIFwiUFVUQVwiLFxuICAgICAgXCJQVVRPXCIsXG4gICAgICBcIlFVTE9cIixcbiAgICAgIFwiUkFUQVwiLFxuICAgICAgXCJSVUlOXCJcbiAgICBdO1xuXG4gICAgY29uc3QgVkFMVUVTX01BUCA9IHtcbiAgICAgICcwJzogMCxcbiAgICAgICcxJzogMSxcbiAgICAgICcyJzogMixcbiAgICAgICczJzogMyxcbiAgICAgICc0JzogNCxcbiAgICAgICc1JzogNSxcbiAgICAgICc2JzogNixcbiAgICAgICc3JzogNyxcbiAgICAgICc4JzogOCxcbiAgICAgICc5JzogOSxcbiAgICAgICdBJzogMTAsXG4gICAgICAnQic6IDExLFxuICAgICAgJ0MnOiAxMixcbiAgICAgICdEJzogMTMsXG4gICAgICAnRSc6IDE0LFxuICAgICAgJ0YnOiAxNSxcbiAgICAgICdHJzogMTYsXG4gICAgICAnSCc6IDE3LFxuICAgICAgJ0knOiAxOCxcbiAgICAgICdKJzogMTksXG4gICAgICAnSyc6IDIwLFxuICAgICAgJ0wnOiAyMSxcbiAgICAgICdNJzogMjIsXG4gICAgICAnTic6IDIzLFxuICAgICAgJyYnOiAyNCxcbiAgICAgICdPJzogMjUsXG4gICAgICAnUCc6IDI2LFxuICAgICAgJ1EnOiAyNyxcbiAgICAgICdSJzogMjgsXG4gICAgICAnUyc6IDI5LFxuICAgICAgJ1QnOiAzMCxcbiAgICAgICdVJzogMzEsXG4gICAgICAnVic6IDMyLFxuICAgICAgJ1cnOiAzMyxcbiAgICAgICdYJzogMzQsXG4gICAgICAnWSc6IDM1LFxuICAgICAgJ1onOiAzNixcbiAgICAgICcgJzogMzcsXG4gICAgICAnw5EnOiAzOFxuICAgIH07XG5cbiAgICBjb25zdCBnZXRTY29yZSA9IChkb2M6IHN0cmluZykgPT4gZG9jLnNwbGl0KCcnKS5yZXZlcnNlKCkucmVkdWNlKChzdW0sIGNoYXIsIGkpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gaSArIDI7XG4gICAgICBjb25zdCB2YWx1ZSA9IFZBTFVFU19NQVBbY2hhcl0gfHwgMDtcbiAgICAgIHJldHVybiBzdW0gKyB2YWx1ZSAqIGluZGV4O1xuICAgIH0sIDApO1xuXG4gICAgY29uc3QgcGFyc2VJbnB1dCA9IChkb2M6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIFN0cmluZyhkb2MpXG4gICAgICAgIC50cmltKClcbiAgICAgICAgLnRvVXBwZXJDYXNlKClcbiAgICAgICAgLnJlcGxhY2UoL1teMC05QS1aw5FcXHgyNl0vZywgJycpO1xuICAgIH07XG5cbiAgICBjb25zdCB2YWxpZGF0ZURhdGUgPSAoZG9jOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGRhdGVTdHIgPSBkb2Muc2xpY2UoMCwgLTMpLnNsaWNlKC02KTtcbiAgICAgIGNvbnN0IHllYXIgPSBkYXRlU3RyLnNsaWNlKDAsIDIpO1xuICAgICAgY29uc3QgbW9udGggPSBkYXRlU3RyLnNsaWNlKDIsIDQpO1xuICAgICAgY29uc3QgZGF5ID0gZGF0ZVN0ci5zbGljZSg0LCA2KTtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShgMjAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWApO1xuICAgICAgcmV0dXJuICFpc05hTihkYXRlLmdldFRpbWUoKSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHZhbGlkYXRlVmVyaWZpY2F0aW9uRGlnaXQgPSAoZG9jOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGRpZ2l0ID0gZG9jLnNsaWNlKC0xKTtcbiAgICAgIGNvbnN0IHJmYyA9IGRvYy5sZW5ndGggPT09IDEyID8gYCAke2RvY31gIDogZG9jO1xuICAgICAgY29uc3QgYmFzZSA9IHJmYy5zbGljZSgwLCAtMSk7XG4gICAgICBjb25zdCBzY29yZSA9IGdldFNjb3JlKGJhc2UpO1xuICAgICAgY29uc3QgbW9kID0gKDExMDAwIC0gc2NvcmUpICUgMTE7XG4gICAgICBpZiAobW9kID09PSAxMSkgcmV0dXJuICcwJyA9PT0gZGlnaXQ7XG4gICAgICBpZiAobW9kID09PSAxMCkgcmV0dXJuICdBJyA9PT0gZGlnaXQ7XG4gICAgICByZXR1cm4gU3RyaW5nKG1vZCkgPT09IGRpZ2l0O1xuICAgIH07XG5cbiAgICBjb25zdCBpc1NwZWNpYWxDYXNlID0gKGRvYzogc3RyaW5nKSA9PiBkb2MgaW4gU1BFQ0lBTF9DQVNFUztcblxuICAgIGNvbnN0IGhhc0ZvcmJpZGRlbldvcmRzID0gKGRvYzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBwcmVmaXggPSAoZG9jIHx8ICcnKS5zbGljZSgwLCA0KTtcbiAgICAgIHJldHVybiBGT1JCSURERU5fV09SRFMuaW5jbHVkZXMocHJlZml4KTtcbiAgICB9O1xuXG4gICAgdHJ5e1xuICAgICAgY29uc3QgaW5wdXQgPSBwYXJzZUlucHV0KGRvY3VtZW50KTtcblxuICAgICAgaWYgKGlzU3BlY2lhbENhc2UoaW5wdXQpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBoYXNWYWxpZEZvcm1hdCA9IFJGQ19SRUdFWFAudGVzdChpbnB1dCk7XG4gICAgICBpZighaGFzVmFsaWRGb3JtYXQpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGhhc1ZhbGlkRGF0ZSA9IHZhbGlkYXRlRGF0ZShpbnB1dCk7XG4gICAgICBpZighaGFzVmFsaWREYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBoYXNWYWxpZERpZ2l0ID0gdmFsaWRhdGVWZXJpZmljYXRpb25EaWdpdChpbnB1dCk7XG4gICAgICBpZighaGFzVmFsaWREaWdpdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYoaGFzRm9yYmlkZGVuV29yZHMoaW5wdXQpKSByZXR1cm4gZmFsc2U7XG4gICAgICBcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1jYXRjaChlKXtcbiAgICAgIC8vbm90IHRvIGRvXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIGlzVmFsaWRVcmwodHh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCByZWdleCA9IC8oaHR0cHM/OlxcL1xcLyg/OlthLXowLTldKD86W2EtejAtOS1dezAsNjF9W2EtejAtOV0pP1xcLikrW2EtejAtOV1bYS16MC05LV17MCw2MX1bYS16MC05XSkoOj9cXGQqKVxcLz8oW2Etel9cXFxcLzAtOVxcLSMuXSopXFw/PyhbYS16X1xcXFwvMC05XFwtIz0mXSopL2c7XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QodHh0KTtcbiAgfVxuXG4gIHN0YXRpYyBpc1ZhbGlkWmlwQ29kZSh6aXBDb2RlOiBzdHJpbmcsIGNvdW50cnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsZW5ndGggPSB7XG4gICAgICAnYnInOiA4LFxuICAgICAgJ2NsJzogNyxcbiAgICAgICdteCc6IDVcbiAgICB9W2NvdW50cnkgfHwgJ2JyJ11cblxuICAgIHJldHVybiBgJHt0aGlzLmhhbmRsZU9ubHlOdW1iZXJzKHppcENvZGUpfWAubGVuZ3RoID09PSBsZW5ndGg7XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZEVtYWlsKGVtYWlsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gL15bXFx3LS5dK0AoW1xcdy1dK1xcLikrW1xcdy1dezEsNjR9JC8udGVzdChlbWFpbCB8fCAnJyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0UmFuZG9tU3RyaW5nKGxlbjogbnVtYmVyLCBjaGFyU2V0Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjaGFyU2V0ID0gY2hhclNldCB8fCAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xuXG4gICAgY29uc3QgcmFuZG9tU3RyaW5nOiBzdHJpbmcgPSBuZXcgQXJyYXkobGVuKVxuICAgICAgLmZpbGwoJzEnKVxuICAgICAgLm1hcCgoKSA9PiB7XG4gICAgICAgIHJldHVybiBjaGFyU2V0Py5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhclNldD8ubGVuZ3RoKSk7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJycpO1xuICAgIHJldHVybiByYW5kb21TdHJpbmc7XG4gIH1cblxuICBzdGF0aWMgaGFuZGxlT25seU51bWJlcnModmFsdWU6IGFueSkge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoL1teMC05XS9nKSwgJycpO1xuICB9XG5cbiAgc3RhdGljIGhhbmRsZU9ubHlBbHBoYU51bWVyaWModmFsdWU6IGFueSkge1xuICAgIGlmICghdmFsdWUpIHJldHVybiAnJztcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKC9bXjAtOUEtWmEtel0vLCAnZycpLCAnJyk7XG4gIH1cblxuICBzdGF0aWMgY2FwaXRhbGl6ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7dmFsdWUuc2xpY2UoMSl9YDtcbiAgfVxuXG4gIHN0YXRpYyBmb3JtYXRaaXBDb2RlKHppcENvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF6aXBDb2RlKSByZXR1cm4gemlwQ29kZTtcbiAgICBjb25zdCBmb3JtYXRlZDogc3RyaW5nID0gemlwQ29kZVxuICAgICAgLnJlcGxhY2UoL14oXFxkezV9KShcXGQpLywgJyQxLSQyJylcbiAgICAgIC5yZXBsYWNlKC9cXC4oXFxkezN9KShcXGQpLywgJy4kMS0kMicpO1xuXG4gICAgcmV0dXJuIGAke2Zvcm1hdGVkfWA7XG4gIH1cblxuICBzdGF0aWMgZm9ybWF0RmlsZVNpemUoc2l6ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQiddO1xuICAgIGxldCBsID0gMDtcbiAgICB3aGlsZSAoc2l6ZSA+PSAxMDI0ICYmICsrbCkge1xuICAgICAgc2l6ZSAvPSAxMDI0O1xuICAgIH1cbiAgICByZXR1cm4gYCR7c2l6ZS50b0ZpeGVkKHNpemUgPCAxMCAmJiBsID4gMCA/IDEgOiAwKX0gJHt1bml0c1tsXX1gO1xuICB9XG5cbiAgc3RhdGljIHN1ZmZsdWUoZGF0YTogYW55W10pOiBhbnlbXSB7XG4gICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGkpO1xuICAgICAgY29uc3QgdGVtcCA9IGRhdGFbaV07XG4gICAgICBkYXRhW2ldID0gZGF0YVtqXTtcbiAgICAgIGRhdGFbal0gPSB0ZW1wO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHN0YXRpYyBoYW5kbGVCbG9iRmlsZSh0aGVCbG9iOiBhbnksIGZpbGVOYW1lOiBzdHJpbmcsIGZpbGVUeXBlOiBzdHJpbmcpIHtcbiAgICBmdW5jdGlvbiBibG9iVG9GaWxlKHRoZUJsb2I6IGFueSwgZmlsZU5hbWU6IHN0cmluZykge1xuICAgICAgY29uc3QgYiA9IHRoZUJsb2I7XG4gICAgICBiLmxhc3RNb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgYi5uYW1lID0gZmlsZU5hbWU7XG4gICAgICByZXR1cm4gYjtcbiAgICB9XG5cbiAgICBsZXQgZmlsZTogYW55O1xuICAgIGlmICghKG5hdmlnYXRvciBhcyBhbnkpLm1zU2F2ZUJsb2IpIHtcbiAgICAgIGZpbGUgPSBuZXcgRmlsZShbdGhlQmxvYl0sIGZpbGVOYW1lLCB7XG4gICAgICAgIHR5cGU6IGZpbGVUeXBlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbGUgPSBuZXcgQmxvYihbdGhlQmxvYl0sIHtcbiAgICAgICAgdHlwZTogZmlsZVR5cGUsXG4gICAgICB9KTtcbiAgICAgIGZpbGUgPSBibG9iVG9GaWxlKGZpbGUsIGZpbGVOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cblxuICBzdGF0aWMgdHJ1bmNhdGUodGV4dDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlciA9IDI1KTogc3RyaW5nIHtcbiAgICBjb25zdCBtaWRDaGFyID0gJy4uLic7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gbWlkQ2hhcjtcbiAgICBpZiAodGV4dCAmJiB0ZXh0Lmxlbmd0aCA8PSBtYXhMZW5ndGgpIHJldHVybiB0ZXh0O1xuXG4gICAgY29uc3QgbGVmdCA9IE1hdGguY2VpbChtYXhMZW5ndGggLyAyKTtcbiAgICBjb25zdCByaWdodCA9IHRleHQubGVuZ3RoIC0gbGVmdCArIDE7XG5cbiAgICByZXR1cm4gYCR7dGV4dC5zdWJzdHIoMCwgbGVmdCl9ICR7bWlkQ2hhcn0gJHt0ZXh0LnN1YnN0cmluZyhyaWdodCl9YDtcbiAgfVxuXG4gIHN0YXRpYyBpc0xvY2FsaG9zdCgpIHtcbiAgICBjb25zdCB7IGhyZWYgfSA9IHdpbmRvdz8ubG9jYXRpb247XG4gICAgaWYgKCFocmVmKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGhyZWY/LnNlYXJjaCgnbG9jYWxob3N0JykgPj0gMDtcbiAgfVxuXG4gIHN0YXRpYyBpc1NhbWVPcmlnaW4oZnJvbnRlbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluaXRpYWxQYXRoOiBzdHJpbmcgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgIHJldHVybiAoaW5pdGlhbFBhdGggfHwgJycpID09PSBmcm9udGVuZDtcbiAgfVxuXG4gIHN0YXRpYyByZXBsYWNlVmFyaWFibGVzKGRhdGE6IHN0cmluZywgb2JqOiBhbnkpIHtcbiAgICBsZXQgaGFuZGxlZCA9IGRhdGE7XG4gICAgT2JqZWN0LmVudHJpZXMob2JqKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGhhbmRsZWQgPSBoYW5kbGVkLnJlcGxhY2UobmV3IFJlZ0V4cChgeyR7a2V5fX1gLCAnZycpLCBgJHt2YWx1ZX1gKTtcbiAgICB9KTtcbiAgICByZXR1cm4gaGFuZGxlZDtcbiAgfVxuXG4gIHN0YXRpYyB0cmltVmFsdWVzVG9TYXZlKG9iajogYW55LCBmaWVsZHM6IHN0cmluZ1tdKSB7XG4gICAgbGV0IHJldCA9IG9iajtcbiAgICBjb25zdCBncm91cGVkID0gZmllbGRzLmpvaW4oJyMnKTtcbiAgICBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoZ3JvdXBlZC5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJldCA9IHtcbiAgICAgICAgICAuLi5yZXQsXG4gICAgICAgICAgW2tleV06IGAke3ZhbHVlfWAudHJpbSgpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXQ7XG4gIH1cbn1cbiJdfQ==
@@ -295,8 +295,152 @@ class MonkeyEcxUtils {
295
295
  return dvCalc === dgv;
296
296
  }
297
297
  static isValidRFC(document) {
298
- const regex = /^[A-Z]{3,4}[0-9]{6}[A-Z0-9]{3}$/;
299
- return regex.test(document);
298
+ const RFC_REGEXP = /^([A-ZÑ\x26]{3,4})([0-9]{6})([A-Z0-9]{3})$/;
299
+ const SPECIAL_CASES = {
300
+ 'XEXX010101000': 'foreign',
301
+ 'XAXX010101000': 'generic'
302
+ };
303
+ const FORBIDDEN_WORDS = [
304
+ "BUEI",
305
+ "BUEY",
306
+ "CACA",
307
+ "CACO",
308
+ "CAGA",
309
+ "CAGO",
310
+ "CAKA",
311
+ "CAKO",
312
+ "COGE",
313
+ "COJA",
314
+ "COJE",
315
+ "COJI",
316
+ "COJO",
317
+ "CULO",
318
+ "FETO",
319
+ "GUEY",
320
+ "JOTO",
321
+ "KACA",
322
+ "KACO",
323
+ "KAGA",
324
+ "KAGO",
325
+ "KOGE",
326
+ "KOJO",
327
+ "KAKA",
328
+ "KULO",
329
+ "MAME",
330
+ "MAMO",
331
+ "MEAR",
332
+ "MEAS",
333
+ "MEON",
334
+ "MION",
335
+ "MOCO",
336
+ "MULA",
337
+ "PEDA",
338
+ "PEDO",
339
+ "PENE",
340
+ "PUTA",
341
+ "PUTO",
342
+ "QULO",
343
+ "RATA",
344
+ "RUIN"
345
+ ];
346
+ const VALUES_MAP = {
347
+ '0': 0,
348
+ '1': 1,
349
+ '2': 2,
350
+ '3': 3,
351
+ '4': 4,
352
+ '5': 5,
353
+ '6': 6,
354
+ '7': 7,
355
+ '8': 8,
356
+ '9': 9,
357
+ 'A': 10,
358
+ 'B': 11,
359
+ 'C': 12,
360
+ 'D': 13,
361
+ 'E': 14,
362
+ 'F': 15,
363
+ 'G': 16,
364
+ 'H': 17,
365
+ 'I': 18,
366
+ 'J': 19,
367
+ 'K': 20,
368
+ 'L': 21,
369
+ 'M': 22,
370
+ 'N': 23,
371
+ '&': 24,
372
+ 'O': 25,
373
+ 'P': 26,
374
+ 'Q': 27,
375
+ 'R': 28,
376
+ 'S': 29,
377
+ 'T': 30,
378
+ 'U': 31,
379
+ 'V': 32,
380
+ 'W': 33,
381
+ 'X': 34,
382
+ 'Y': 35,
383
+ 'Z': 36,
384
+ ' ': 37,
385
+ 'Ñ': 38
386
+ };
387
+ const getScore = (doc) => doc.split('').reverse().reduce((sum, char, i) => {
388
+ const index = i + 2;
389
+ const value = VALUES_MAP[char] || 0;
390
+ return sum + value * index;
391
+ }, 0);
392
+ const parseInput = (doc) => {
393
+ return String(doc)
394
+ .trim()
395
+ .toUpperCase()
396
+ .replace(/[^0-9A-ZÑ\x26]/g, '');
397
+ };
398
+ const validateDate = (doc) => {
399
+ const dateStr = doc.slice(0, -3).slice(-6);
400
+ const year = dateStr.slice(0, 2);
401
+ const month = dateStr.slice(2, 4);
402
+ const day = dateStr.slice(4, 6);
403
+ const date = new Date(`20${year}-${month}-${day}`);
404
+ return !isNaN(date.getTime());
405
+ };
406
+ const validateVerificationDigit = (doc) => {
407
+ const digit = doc.slice(-1);
408
+ const rfc = doc.length === 12 ? ` ${doc}` : doc;
409
+ const base = rfc.slice(0, -1);
410
+ const score = getScore(base);
411
+ const mod = (11000 - score) % 11;
412
+ if (mod === 11)
413
+ return '0' === digit;
414
+ if (mod === 10)
415
+ return 'A' === digit;
416
+ return String(mod) === digit;
417
+ };
418
+ const isSpecialCase = (doc) => doc in SPECIAL_CASES;
419
+ const hasForbiddenWords = (doc) => {
420
+ const prefix = (doc || '').slice(0, 4);
421
+ return FORBIDDEN_WORDS.includes(prefix);
422
+ };
423
+ try {
424
+ const input = parseInput(document);
425
+ if (isSpecialCase(input))
426
+ return false;
427
+ const hasValidFormat = RFC_REGEXP.test(input);
428
+ if (!hasValidFormat)
429
+ return false;
430
+ const hasValidDate = validateDate(input);
431
+ if (!hasValidDate)
432
+ return false;
433
+ const hasValidDigit = validateVerificationDigit(input);
434
+ if (!hasValidDigit)
435
+ return false;
436
+ if (hasForbiddenWords(input))
437
+ return false;
438
+ return true;
439
+ }
440
+ catch (e) {
441
+ //not to do
442
+ }
443
+ return false;
300
444
  }
301
445
  static isValidUrl(txt) {
302
446
  const regex = /(https?:\/\/(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9])(:?\d*)\/?([a-z_\\/0-9\-#.]*)\??([a-z_\\/0-9\-#=&]*)/g;